📄 qqserver.java
字号:
package NewQQ;
/*
* ---------------------------------------------------------------------
* 自定义QQ聊天系统
* 服务器
* ---------------------------------------------------------------------
* 所有数据统一用自定义数据类型QQMessage发送
*/
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 + -