TCP编程:多对多,按照自定义规则实现指定对象聊天

本文介绍了如何使用Java实现TCP多对多聊天应用。服务端通过socket监听,连接请求到来时创建新线程处理。客户端包含发送和接收线程,持续通信。信息管理类解析客户端消息,用户管理类维护在线和注册用户,注册信息存储于文本文件。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值