📄 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();//返回一个客户端SOCKET对象实例 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 + -