📄 qqserver.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 + -