⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qqsever.java

📁 IO流的项目好
💻 JAVA
字号:
//服务器中转
package myQQ;

import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;

class QQSever extends JFrame
{
	JTextArea jta = new JTextArea();
	JScrollPane jsp = new JScrollPane(jta);
	//通信
	ServerSocket ss;
	Socket sc;
	//读取信息
	ObjectInputStream ois;
	//发送消息
	ObjectOutputStream oos;
	int c=0; //记录连接数
	//记录连接及对应id的HashTable
	Hashtable htS = new Hashtable();
	
	QQSever()
	{
		super("QQ服务器");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(400,300);
		this.getContentPane().add(jsp);
		this.setResizable(false);
		this.setVisible(true);
		//服务器监听
		try {
			ss = new ServerSocket(1500);
			jta.append("等待连接...\n");
			while(true)
			{
				sc = ss.accept();	
				c++;
				new QQCS(sc).start(); 
				jta.append("第"+c+"个客户端\t");
			}
	    }
	    catch (Exception ex) {
	    	System.out.println (ex);
	    }
	}
	
	//客户端线程
	class QQCS extends Thread
	{
		Socket any;
		String id;
		
		public QQCS(Socket any)
		{
			this.any = any;
		}
		
		public void run()
		{	//线程启动接收消息
			try {
				this.readMess();
		    }
		    catch (Exception ex) {
		    	System.out.println (ex);
		    }
		}
		
		//接受消息
		public void readMess() throws Exception
		{	
			while(true)
			{
				ois = new ObjectInputStream(any.getInputStream());
				Object tem = ois.readObject();
				if(tem instanceof MessType)
				{
					MessType mt = (MessType)tem;
					if(mt.State==10||mt.State==11)
					{	//聊天信息操作
						this.chatInfoOperation(mt);
					}
					else if(mt.State==41||mt.State==42||mt.State==4)
					{	//注册操作
						this.registerOperation(mt);
					}
					else
					{	//状态改变操作
						this.stateOperation(mt);
						if(mt.State==-1)
						{	//下线操作
							any.close();
							break;
						}
					}
				}
				else
				{
					System.out.println ("stop!");
					break;
				}
			}
		}
		
		public void stateOperation(MessType mt)
		{	//读入消息为状态改变信息的操作
			int sf = mt.State;
			this.id = mt.Sendid;
			switch (sf) {
		    	case 0:
		    		this.onLine(mt);
					break;
		    	case 2: break;
		    	case 3: break;
		    	case -1:
		    		//移除该id对应的Socket
		    		if(htS.size()>0)
		    			htS.remove(this.id);
		    		break;
		    }
		    //取得状态信息并显示
		    jta.append(mt.getStateInfo());
		}
		
		public void onLine(MessType mt)
		{	//上线操作
			if(mt.Sendpw.length()>0)
			{	//登录验证
				String f = QQDBO.logCheck(mt);
				jta.append(f+"\n");
				//将id和Socket存入Hashtable
				htS.put(this.id,this.any);
				if(f.equals("登录成功"))
				{	//发回好友列表
					Vector v = QQDBO.getFriend(mt);
					MessType result = new MessType(v,0);
					result.Readid = mt.Sendid;
					result.Results = f;
					this.sendMess(result);
					this.informOnLine(v,mt);
				}	
				else
				{	//发回验证结果
					MessType result = new MessType(f,0);
					result.Readid = mt.Sendid; 
					this.sendMess(result); 
					//登录不成功除去该连接
					htS.remove(this.id);
				}
			}
		}
		
		public void informOnLine(Vector x,MessType mt)
		{	//将上线信息发送给好友
			for (int i = 0; i<x.size(); i++)
			{
				Vector tem = (Vector)x.elementAt(i);
				String rid = tem.elementAt(2).toString();
				if(!rid.equals(mt.Sendid))
				{
					MessType mtR = new MessType(mt.Sendid,20); //发送方号码作为结果返回
					mtR.Readid = rid;
					this.sendMess(mtR);	
				}
			}
		}
		
		public void chatInfoOperation(MessType mt)
		{	//读入消息为聊天信息的操作
			if(htS.containsKey(mt.Readid))
			{	//连接中存在信息接收id的键值
				this.sendMess(mt);
				mt.setHaseSend(true);
			}
			//取得读入消息并显示
			jta.append(mt.getChatInfo());
			//同时保存至数据库
			boolean flag = QQDBO.chatInfoIn(mt);
			if(flag)
				jta.append("聊天信息存入成功\n");
		}
		
		public void registerOperation(MessType mt)  throws Exception
		{	//读入消息为注册信息的操作
			//将id和Socket存入Hashtable
			htS.put(mt.Sendid,this.any);
			if(mt.State==41)
			{	//请求省市信息
				MessType pro = new MessType(QQDBO.getPlace(1,mt),41);
				pro.Readid = mt.Sendid;
				this.sendMess(pro); //发回信息 
			}
			else if(mt.State==42)
			{	//请求省市信息
				MessType city = new MessType(QQDBO.getPlace(2,mt),42);
				city.Readid = mt.Sendid;
				this.sendMess(city); 
			}
			else if(mt.State==4)
			{	//注册
				boolean f = QQDBO.logIn(mt);
				if(f)
				{
					jta.append("注册成功!");
					MessType mtId = new MessType(QQDBO.getLogId(),4);
					mtId.Readid = mt.Sendid;
					this.sendMess(mtId); //发回注册号
					htS.remove(mt.Sendid); //清除连接
					any.close(); //中止该连接
				}
			}
		}
		
		//发送消息
		public void sendMess(MessType mt) 
		{	//将消息发送至与接收方id对应的连接
			try {	
				Socket stem = (Socket)htS.get(mt.Readid);
				oos = new ObjectOutputStream(stem.getOutputStream());
				oos.writeObject(mt);
				oos.flush();
				jta.append("发送成功\n");	
		    }
		    catch (Exception ex) {
		    	System.out.println (ex);
		    }
		}
	}
	
	public static void main(String[]args)
	{
		JFrame.setDefaultLookAndFeelDecorated(true);
		new QQSever();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -