TCP编程:多对多,实现指定对象聊天
1. 思路:
服务端(Server2)
一个服务端(serverSocket),多个客户端(socket),客户端连接到指定端口,服务端监听指定端口,一旦监听到有客户端(socket)连入,就分配一个线程处理该socket,然后通过循环继续等待下一个客户端的连入,连入就分配一个另外的线程处理,一直循环…
package experience_05.ManyToMany;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author xxx
* @description 服务端
* @date 2021/4/27 19:32
*/
public class Server2 {
private static ServerSocket serverSocket;
/**
* @description 存储管理所有被监听到的用户信息,包括 在线用户数组、注册用户数组
* final关键字修饰的变量是指引用变量不能变,对象中的属性是可以改变,即不能重新指向新的对象
*/
private static final ClientManager CLIENT_MANAGER = new ClientManager();
public static void main(String[] args) {
try {
System.out.println("启动服务器中***");
serverSocket = new ServerSocket(8080);
System.out.println("服务器启动成功!");
while (true) {
// 服务端一直监听8080端口,监听到就分配一个线程
Socket socket1 = serverSocket.accept();
System.out.println("客户端:" + socket1.getInetAddress() + ":" + serverSocket.getLocalPort() + "建立了连接");
Thread thread = new Thread(new SocketHandler2(socket1));
// 为当前监听到的客户端分配一个线程.
thread.start();
}
} catch (IOException e) {
try {
serverSocket.close();
System.out.println("服务端出现异常,关闭");
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
e.printStackTrace();
}
}
}
// 处理客户端请求
static class SocketHandler2 implements Runnable {
private final Socket socket;
private final BufferedReader reader;
private final PrintWriter writer;
// 传递过去的是该对象的内存地址
private final MessageManager messageManager = new MessageManager(CLIENT_MANAGER);
public SocketHandler2(Socket socket) throws IOException {
this.socket = socket;
this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
this.writer = new PrintWriter(socket.getOutputStream());
}
@Override
public void run() {
try {
boolean flag = true;
while (true) {
// 获取客户端发送来的信息
String readLine = reader.readLine();
if (readLine != null) {
// 判断解析从客户端传来的信息的合法性,进行相关操作
/*
* 不允许未登录进行其他操作 如:0 5
* 0 发送信息 在线
* 1 不在线
* 2 注册过
* 3 未注册过
* 4 输入格式有误
* 5 查看当前在线用户
* 6 登录
* 7 退出登录
* */
Integer type = messageManager.isLegal(readLine);
switch (type) {
case 0: {
// 判断当前是否有用户登录
if (!isLogin()) {
break;
}
// 发送信息给指定socket
sendMessage(readLine);
break;
}
case 1: {
// 判断当前是否有用户登录
if (!isLogin()) {
break;
}
streamSend("目标用户不在线", writer);
break;
}
case 2: {
streamSend("该用户已注册,请重新输入", writer);
break;
}
case 3: {
// 注册用户名
String name = MessageManager.getRegisteredName(readLine);
// 注册用户密码
String password = MessageManager.getPassword(readLine);
CLIENT_MANAG

本文介绍了如何使用Java实现TCP多对多聊天应用。服务端通过socket监听,连接请求到来时创建新线程处理。客户端包含发送和接收线程,持续通信。信息管理类解析客户端消息,用户管理类维护在线和注册用户,注册信息存储于文本文件。
最低0.47元/天 解锁文章
840

被折叠的 条评论
为什么被折叠?



