?? 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 + -