多线程TCP网络即时通讯项目
1、需求:

2、界面设计:



3、功能说明:
①.用户登录:

②.拉取在线用户列表:

③.无异常退出:
- 客户端结束线程,并向服务端发送message,关闭其在服务端所对应的线程,并释放资源
④.私聊:

⑤.群聊:
⑥.服务端推送消息:
⑦.离线留言:
⑧.离线发送文件:
4、客户端项目结构:

5、客户端项目代码:
①.ClientConnectThread
package qqclient.service;
import qqcommon.Message;
import qqcommon.MessageType;
import java.io.*;
import java.net.Socket;
public class ClientConnectThread extends Thread {
private Socket socket;
public ClientConnectThread(Socket socket) {
this.socket = socket;
}
public Socket getSocket() {
return socket;
}
@Override
public void run() {
while (true) {
try {
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message message = (Message) ois.readObject();
switch (message.getMesType()) {
case MessageType.MESSAGE_RET_ONLINE_FRIEND://获取服务端返回的在线用户列表
String[] s = message.getContent().split(" ");
if (s.length > 0) {
System.out.println("\n===当前在线用户列表====");
for (int i = 0; i < s.length; i++) {
System.out.println("用户" + i + ": " + s[i]);
}
}
break;
case MessageType.MESSAGE_TO_ONE_MES://从服务端接收到私聊信息
System.out.println("\n用户" + message.getSender() + "对你说:" + message.getContent());
break;
case MessageType.MESSAGE_TO_ALL_MES://从服务端接收到群聊消息
System.out.println("\n用户" + message.getSender() + "群发了:" + message.getContent());
break;
case MessageType.MESSAGE_FILE_TO_ONE_MES://从服务端接收到文件消息
System.out.println("\n用户" + message.getSender() + "向你发送了文件:" + message.getFileName() + ",文件大小为:" + message.getFileSize()+"KB");
FileOutputStream fos = new FileOutputStream(new File(message.getFileDes(),message.getFileName()));
fos.write(message.getFileContent());
System.out.println("文件传输完毕");
fos.close();
break;
case MessageType.MESSAGE_SEVER_MES://服务端推送的消息
System.out.println("\n服务端向你推送了消息:" + message.getContent());
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
②.ManageClientConnectThread
package qqclient.service;
import java.util.concurrent.ConcurrentHashMap;
public class ManageClientConnectThread {
private static ConcurrentHashMap<String, ClientConnectThread> hsm = new ConcurrentHashMap<>(16);
public static void addClientConnectThread(String userid, ClientConnectThread clientThread){
hsm.put(userid, clientThread);
}
public static ClientConnectThread getClientConnectThread(String userid){
return hsm.get(userid);
}
public static void removeClientConnectThread(String userid){
hsm.remove(userid);
}
}
③.UserClientService
package qqclient.service;
import qqcommon.Message;
import qqcommon.MessageType;
import qqcommon.User;
import utils.Utility;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class UserClientService {
private Socket socket;
private User user;
public UserClientService() {
}
public void logout() {
try {
Message message = new Message();
message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
message.setSender(user.getId());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
ManageClientConnectThread.removeClientConnectThread(user.getId());
System.out.println(user.getId() + "在客户端退出");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
public void getOnlineUsers() {
try {
Message message = new Message();
message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
message.setSender(user.getId());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendAllMessage() {
System.out.println("请输入你要群发的消息:");
String allMes = Utility.readString(100);
try {
Message message = new Message();
message.setMesType(MessageType.MESSAGE_TO_ALL_MES);
message.setSender(user.getId());
message.setContent(allMes);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendOneMessage() {
System.out.print("请输入你要私聊的对象:");
String receiver = Utility.readString(50);
System.out.print("请输入私聊的内容:");
String content = Utility.readString(100);
try {
Message message = new Message();
message.setMesType(MessageType.MESSAGE_TO_ONE_MES);
message.setSender(user