Java 实现 TCP 多发多收通信程序

在网络通信中,TCP 协议的可靠传输特性使其在需要持续交互的场景中被广泛应用。本文将围绕一段实现 TCP 多发多收功能的 Java 代码,详细解析其实现原理、运行流程及技术特点,帮助开发者深入理解 TCP 持续通信的实现方式。

核心代码展示

以下是实现 TCP 多发多收通信的完整代码,包含客户端与服务器端两个部分:

客户端(Client)代码

package com.practical.agreement.tcp.tcp_2;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.io.DataOutputStream;
/*
@description:
@ClassName Client
@author chen
@create 2025-07-21 15:26
@Version 1.0
*/
public class Client
{
    public static void main(String[] args) throws Exception
    {
        // 1、创建Socket对象,并同时请求与服务端程序的连接。
        Socket socket = new Socket("127.0.0.1", 8888);

        // 2、从socket通信管道中得到一个字节输出流,用来发数据给服务端程序。
        OutputStream os = socket.getOutputStream();

        // 3、把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);

        while (true)
        {
            System.out.println("请说:");
            String msg = sc.nextLine();

            // 一旦用户输入了exit,就退出客户端程序
            if("exit".equals(msg))
            {
                System.out.println("欢迎您下次光临!退出成功!");
                dos.close();
                socket.close();
                break;
            }

            // 4、开始写数据出去了
            dos.writeUTF(msg);
            dos.flush();
        }

    }
}

服务器端(Server)代码

package com.practical.agreement.tcp.tcp_2;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
@description:
@ClassName Server
@author chen
@create 2025-07-21 15:39
@Version 1.0
*/
public class Server
{
    public static void main(String[] args) throws Exception
    {
        System.out.println("-----服务端启动成功-------");
        // 1、创建ServerSocket的对象,同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8888);

        // 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求
        Socket socket = serverSocket.accept();

        // 3、从socket通信管道中得到一个字节输入流。
        InputStream is = socket.getInputStream();

        // 4、把原始的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);

        while (true)
        {
            try
            {
                // 5、使用数据输入流读取客户端发送过来的消息
                String rs = dis.readUTF();
                System.out.println(rs);
            }catch (Exception e)
            {
                System.out.println(socket.getRemoteSocketAddress() + "离线了!");
                dis.close();
                socket.close();
                break;
            }
        }
    }
}

一、TCP 多发多收功能与代码概述

TCP 作为面向连接的可靠传输协议,在持续通信场景中具有天然优势。本次展示的代码实现了 TCP 多发多收的核心功能:客户端可以通过控制台持续输入消息并发送给服务器端,服务器端则能实时接收并显示这些消息,直到客户端主动输入 “exit” 退出或异常离线,服务器端能感知到客户端的离线状态并做出相应处理。

这种多发多收的通信模式是很多实时交互系统的基础,如在线聊天工具、远程控制程序等,其核心在于通过循环结构实现持续的数据传输与接收,并加入异常处理机制保障通信的稳定性。

二、核心代码解析

1. 客户端(Client)实现

客户端代码的核心是构建持续发送消息的机制,其关键实现步骤如下:

  • 建立连接:通过new Socket("127.0.0.1", 8888)创建 Socket 对象,与服务器端的 8888 端口建立连接,底层通过 TCP 三次握手完成连接建立。
  • 获取输出流:从 Socket 对象中获取字节输出流OutputStream,并将其包装为DataOutputStream,便于进行字符串的发送操作。
  • 循环发送机制:使用while(true)构建无限循环,结合Scanner实现从控制台持续读取用户输入的消息。
  • 退出逻辑:当用户输入 “exit” 时,关闭数据输出流和 Socket 对象,释放资源并跳出循环,结束客户端程序。
  • 数据发送与刷新:使用DataOutputStream的writeUTF方法发送字符串消息,同时调用flush方法确保数据立即发送,避免因缓冲区问题导致消息延迟。

2. 服务器端(Server)实现

服务器端代码的核心是实现持续接收消息并处理客户端离线的功能,其关键实现步骤如下:

  • 端口注册与等待连接:通过new ServerSocket(8888)创建服务器端对象并注册 8888 端口,然后调用accept方法阻塞等待客户端的连接请求,当有客户端连接时返回对应的 Socket 对象。
  • 获取输入流:从 Socket 对象中获取字节输入流InputStream,并包装为DataInputStream,方便读取客户端发送的字符串。
  • 循环接收机制:利用while(true)构建无限循环,持续接收客户端发送的消息。
  • 异常处理与离线感知:在接收消息的过程中加入try-catch块,当客户端异常离线时,捕获异常并打印客户端离线信息,同时关闭相关资源并跳出循环。
  • 消息读取与显示:使用DataInputStream的readUTF方法读取客户端发送的消息,并将其打印出来。

三、运行流程与交互逻辑

  1. 启动顺序:首先启动服务器端,使其进入监听状态等待客户端连接;然后启动客户端,客户端与服务器端建立 TCP 连接。
  2. 消息交互:客户端通过控制台输入消息,每条消息都会被实时发送到服务器端,服务器端接收后立即打印;这个过程可以重复进行,实现多发多收。
  3. 正常退出:客户端输入 “exit” 后,主动关闭连接,服务器端在读取消息时会捕获到相应异常,打印客户端离线信息并关闭资源。
  4. 异常离线处理:若客户端因意外情况(如强制关闭)离线,服务器端会通过异常捕获机制感知到,同样会打印离线信息并释放资源。

四、技术特点与优势

  • 持续通信能力:通过循环结构实现了客户端与服务器端的持续消息交互,满足实时通信场景的需求。
  • 可靠传输保障:基于 TCP 协议的特性,确保消息的有序、完整传输,避免了数据丢失或乱序的问题。
  • 完善的退出机制:客户端的 “exit” 退出逻辑和服务器端的异常处理机制,保证了资源的正确释放,提升了程序的健壮性。
  • 实时性:客户端发送消息时的flush操作和服务器端的即时接收处理,保证了消息传输的实时性。

五、扩展方向与应用场景

扩展方向

  • 双向通信:在现有代码基础上,为客户端添加输入流、服务器端添加输出流,实现客户端与服务器端的双向消息交互。
  • 多客户端支持:引入多线程技术,使服务器端能够同时处理多个客户端的连接请求,每个客户端的通信由独立的线程负责。
  • 消息格式规范:定义统一的消息格式(如添加消息发送时间、发送者标识等),使通信内容更具结构性和可读性。
  • 日志记录:添加日志功能,将客户端发送的消息、连接状态、离线信息等记录到日志文件中,便于后续分析和调试。

应用场景

  • 在线聊天系统:作为基础通信模块,支持用户之间的实时消息交互。
  • 远程监控:客户端持续发送监控数据,服务器端实时接收并处理这些数据。
  • 命令控制系统:客户端发送控制命令,服务器端接收并执行相应操作,实现远程控制功能。

总结

本文介绍的 TCP 多发多收程序,通过简洁的代码实现了客户端与服务器端的持续通信功能,展现了 TCP 协议在可靠传输和实时交互方面的优势。代码中循环结构的运用、异常处理机制的加入以及输入输出流的合理使用,共同保障了程序的稳定性和实用性。

开发者可以基于此代码,根据实际需求进行扩展和优化,构建出更复杂、功能更完善的 TCP 通信应用,充分发挥 TCP 协议在网络通信中的重要作用。

你可能感兴趣的:(java,开发语言,tcp/ip,网络,网络协议)