今日学习之 Java TCP通信技术与群聊程序开发

在今天的Java学习中,我深入探索了TCP通信技术,并将其应用于群聊程序的开发,同时了解了TCP通信的BS架构。以下是我的学习总结与技术分享。

一、TCP通信技术基础

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的主要特点包括:

  • 面向连接:在通信开始之前,需要建立连接(三次握手),通信结束后需要释放连接(四次挥手)。
  • 可靠交付:通过确认、重传和排序机制,确保数据准确无误地从发送端传输到接收端。
  • 字节流:TCP将数据视为字节流,不保证消息边界。

这些特点使得TCP适用于需要高可靠性的应用场景,如文件传输、网页浏览和即时通讯等。

二、群聊程序开发实践

基于TCP通信,我开发了一个简单的群聊程序,包括服务器端和客户端。

服务器端实现

服务器端的主要功能是监听客户端的连接请求,并在客户端之间转发消息。以下是服务器端的关键代码结构:

private ServerSocket serverSocket;
private List<Socket> clientList = Collections.synchronizedList(new ArrayList<>());

public GroupChatServer(int port) {
    try {
        serverSocket = new ServerSocket(port);
        System.out.println("服务器已启动,端口号:" + port);
        waitForConnection();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private void waitForConnection() {
    while (true) {
        try {
            Socket socket = serverSocket.accept();
            clientList.add(socket);
            new Thread(new ClientHandler(socket)).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
private class ClientHandler implements Runnable {
    private Socket socket;
    private BufferedReader reader;

    public ClientHandler(Socket socket) {
        this.socket = socket;
        try {
            reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
@Override
public void run() {
    String message;
    try {
        while ((message = reader.readLine()) != null) {
            broadcastMessage(message); // 核心消息分发逻辑
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            socket.close();
            clientList.remove(socket);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void broadcastMessage(String message) {
    synchronized (clientList) {
        for (Socket client : clientList) {
            try {
                PrintWriter writer = new PrintWriter(
                    client.getOutputStream(), true);
                writer.println(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

关键设计亮点:

  • 使用 Collections.synchronizedList 保证线程安全
  • 消息广播时使用同步代码块保证遍历安全
  • 每个客户端独立线程处理消息接收
  • 自动清理断开连接的客户端
  • 非阻塞式IO模型(每个连接独立线程)

客户端实现

客户端负责连接到服务器,并发送和接收消息。以下是客户端的关键代码结构:

public GroupChatClient(String host, int port) {
    try {
        socket = new Socket(host, port); // 连接服务器
        writer = new PrintWriter(socket.getOutputStream(), true); // 输出流初始化
        new Thread(new MessageReader(socket)).start(); // 启动消息接收线程
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private class MessageReader implements Runnable {
    private BufferedReader reader;
    
    public MessageReader(Socket socket) {
        try {
            reader = new BufferedReader( // 输入流初始化
                new InputStreamReader(socket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() { // 持续监听服务器消息
        String message;
        try {
            while ((message = reader.readLine()) != null) {
                System.out.println("收到服务器消息:" + message); // 消息展示
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public static void main(String[] args) {
    GroupChatClient client = new GroupChatClient("localhost", 8888);
    Scanner scanner = new Scanner(System.in);
    while (true) {
        String input = scanner.nextLine(); // 读取用户输入
        client.sendMessage(input); // 发送消息
    }
}
[用户输入] -> sendMessage() -> 输出流 -> 服务器
服务器 -> 输入流 -> MessageReader线程 -> 控制台输出

关键设计特点:

  • 双线程架构:主线程处理用户输入,独立线程处理消息接收
  • 阻塞式IO模型:readLine() 会阻塞等待服务器消息
  • 控制台实时交互:Scanner 持续监听用户输入
  • 单向流管理:独立维护输入/输出流对象
  • 简单错误处理:通过try-catch打印异常栈

运行效果

启动服务器后,多个客户端可以连接到服务器,并在群聊中发送和接收消息。每个客户端发送的消息都会被服务器转发给所有其他客户端,实现群聊功能。

三、TCP通信的BS架构

BS(浏览器/服务器)架构是一种基于Web的应用架构,客户端通过浏览器访问服务器上的应用程序。在TCP通信中,BS架构具有以下特点:

  • 客户端轻量化:客户端只需安装浏览器,无需安装额外的软件。
  • 跨平台性:浏览器可以在不同的操作系统上运行,使得应用具有良好的跨平台性。
  • 易于维护和更新:应用程序的更新只需在服务器端进行,客户端无需进行额外操作。

在BS架构中,TCP通信通常用于实现浏览器与服务器之间的数据传输。例如,HTTP协议就是基于TCP的,用于浏览器与Web服务器之间的通信。

四、学习记录

通过今天的学习,我对TCP通信技术有了比较深入的理解,并成功将其应用于群聊程序的开发。今日修炼就到此为止,但学习之路永无止境。希望以后能和大家一起进步。

全部评论
点赞 回复 分享
发布于 03-10 20:58 湖北

相关推荐

&nbsp;不难,你需要给自己植入这些信念🗝️“没有标答,你的回答就是标答”你的回答,来源于你的经验你的经验本身就是有价值的同个问题,面试官自己不一定有答案所以你的回答,也没有对错既然没有对错,怎知不是标答?带着这样的信念,修炼自己:•交流时正视对方的眼睛•声音有力量,不低声下气•语气坚定,不卑不亢•不害怕被质疑,质疑只是探讨•不害怕被压力面试,那只是测试手段🗝️“能进入到面试环节,意味着你配得上这个岗位”投了自己觉得“够不上”的岗位;“够不上”的公司意外被约面试千万不要妄自菲薄,觉得只是来凑人数的抓住机会,依旧大胆展示自己围绕着关键能力主动给自己和岗位做匹配换个角度,就算不行,也增加了一次面试经验不是么🗝️“薪资是以谈判的形式确定的,不是一锤子买卖没商量”面试通过,意味着你的关键能力足以胜任岗位大胆开价不丢脸薪酬谈判是一个互相试探和拉扯的过程最终的目标是双赢所以可以拿出自己的筹码和HR谈再换个角度就算没谈成,也知道了这个筹码好不好用不是么🗝️“对方面完你,你也要面试他”面试本身就是一场双选考察完你的综合素质,你也要考量对方是不是符合你的基本要求是不是尊重候选人是不是一个好的发展平台…🗝️“给自己高一点的容错率,别对自己太苛刻”简历被挂掉,不等于你什么都不行面试被淘汰,不等于你就是个失败的人天地如此广阔又怎么知道这份工作入职以后一定适合自己?重要的不是有多少经历而是在这些经历里沉淀下来多少经验能反哺自己“写简历的用户思维”、“求职管理的项目思维”“厘清自我的能力”、“定位自己优势的能力”“持续学习和输出的能力”、“面对困境的反脆弱力” 以上,愿所有人都接到满意的offer✨别忘记,最好的事业,就是做自己 #面试时最害怕被问到的问题#&nbsp;&nbsp;#如何判断面试是否凉了#&nbsp;&nbsp;#我发现了面试通关密码#&nbsp;&nbsp;#简历被挂麻了,求建议#&nbsp;&nbsp;#如何写一份好简历#&nbsp;&nbsp;#面试中的破防瞬间#&nbsp;&nbsp;#面试时最害怕被问到的问题#&nbsp;&nbsp;#牛客创作赏金赛#
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务