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

📄 qqserver.java

📁 大家相信对QQ都再熟悉不过了
💻 JAVA
字号:
/* * --------------------------------------------------------------------- * 自定义QQ聊天系统 * 服务器                       * --------------------------------------------------------------------- * 所有数据统一用自定义数据类型QQMessage发送 */package NewQQ;import java.net.*;import java.io.*;import java.util.*;public class QQServer {	public static void main(String[] args) throws Exception{		ServerSocket serversocket = new ServerSocket(14789);		HashMap<String,Socket> user = new HashMap<String,Socket>();		HashMap<String,ObjectOutputStream> userout = new HashMap<String,ObjectOutputStream> ();		while(true){			Socket clientsocket = serversocket.accept();			QQServerThread clientthread = new QQServerThread(clientsocket,user,userout);			clientthread.start();		}	}}class QQServerThread extends Thread{	Socket clientsocket;	HashMap<String,Socket> user;	HashMap<String,ObjectOutputStream> userout;	Set<String> username;	Iterator it;	String name;	public QQServerThread(Socket clientsocket, HashMap<String,Socket> user,HashMap<String,ObjectOutputStream> userout) {		this.clientsocket = clientsocket;		this.user = user;		this.userout = userout;	}	public void run(){		try {			QQMessage sendmessage = new QQMessage();//用于发送信息			//输出流			ObjectOutputStream sendmsg = new ObjectOutputStream(clientsocket.getOutputStream());			//输入流			ObjectInputStream recvmsg = new ObjectInputStream(clientsocket.getInputStream());			//1.判断用户名是否存在,并返回结果			QQMessage recvmessage = (QQMessage)recvmsg.readObject();			name = recvmessage.getSender();			username = user.keySet();				//1.1用户名已经存在,反馈,程序结束				if(username.contains(name)){					sendmessage.setMessage("false");					sendmsg.writeObject(sendmessage);					sendmsg.flush();					return;				}				else{				//1.2用户名可以使用					//1.2.1反馈					sendmessage.setMessage("true");					sendmsg.writeObject(sendmessage);					sendmsg.flush();					it = username.iterator();					while(it.hasNext()){						String tempstring = (String)it.next();						Socket recvsocket = user.get(tempstring);					//1.2.2向各在线用户发送该用户						QQMessage sendadd = new QQMessage();						sendadd.setType(1);						sendadd.setSender(name);						ObjectOutputStream oos = userout.get(tempstring);						oos.writeObject(sendadd);						oos.flush();					//1.2.3向该用户发送在线用户名字						QQMessage sendonline = new QQMessage();						sendonline.setType(2);						sendonline.setSender(tempstring);						sendmsg.writeObject(sendonline);						sendmsg.flush();					}					//1.2.4添加到在线用户列表					user.put(name,clientsocket);					userout.put(name,sendmsg);					//2.循环接收信息					while(true){						QQMessage mrecvmessage = (QQMessage) recvmsg.readObject();						int type = mrecvmessage.getType();						if(mrecvmessage  == null || type == 6)							break;						if(type==3){//发给所有人的							username = user.keySet();							it = username.iterator();							while(it.hasNext()){								String tempstring = (String)it.next();								Socket recvsocket = user.get(tempstring);								ObjectOutputStream oos = userout.get(tempstring);								oos.writeObject(mrecvmessage);								oos.flush();							}						}						else{//发给单个人							Socket recvsocket = user.get(mrecvmessage.getRecver());							ObjectOutputStream oos = userout.get(mrecvmessage.getRecver());							oos.writeObject(mrecvmessage);							oos.flush();						}					}					//3.删除user列表中该用户,并断开与其连接,通知其他所有用户该用户下线					user.remove(name);					userout.remove(name);					username = user.keySet();					it = username.iterator();					while(it.hasNext()){						QQMessage senddel = new QQMessage();						String tempstring = (String)it.next();						Socket recvsocket = user.get(tempstring);						senddel.setType(7);						senddel.setSender(name);						ObjectOutputStream oos = userout.get(tempstring);						oos.writeObject(senddel);						oos.flush();					}				}		} catch (Exception e) {}	}}

⌨️ 快捷键说明

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