Java实现TCP通信示例代码

 更新时间:2025年07月30日 09:41:20   作者:写代码的tonyxie  
TCP(传输控制协议)是一种面向连接的、可靠的通信协议,这篇文章主要介绍了Java实现TCP通信的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 Java 中,我们可以使用java.net包下的SocketServerSocket类来实现基于 TCP 协议的网络通信。

本文将详细介绍如何在 Java 中实现 TCP 通信,并通过示例代码进行说明。

TCP 通信基础概念

  • 客户端 - 服务器模型:TCP 通信采用客户端 - 服务器模型,服务器端监听特定端口,等待客户端连接;客户端主动连接服务器。
  • Socket:网络编程中的套接字,用于实现客户端和服务器之间的通信端点。
  • 端口号:用于标识同一台机器上的不同服务,范围从 0 到 65535,其中 0-1023 为系统保留端口。

Java 中的 TCP 通信实现

Java 提供了SocketServerSocket类来简化 TCP 通信的实现。下面我们通过一个简单的示例来展示如何实现客户端和服务器之间的通信。

服务器端实现

服务器端程序需要创建一个ServerSocket对象并绑定到指定端口,然后等待客户端连接。以下是一个简单的服务器端实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    private static final int PORT = 8888;

    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("服务器已启动,监听端口: " + PORT);

            while (true) {
                // 等待客户端连接
                try (Socket clientSocket = serverSocket.accept();
                     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                     BufferedReader in = new BufferedReader(
                             new InputStreamReader(clientSocket.getInputStream()))) {

                    System.out.println("客户端连接成功: " + clientSocket.getInetAddress());

                    String inputLine;
                    // 读取客户端发送的数据
                    while ((inputLine = in.readLine()) != null) {
                        System.out.println("客户端消息: " + inputLine);
                        
                        // 向客户端发送响应
                        if ("退出".equals(inputLine)) {
                            out.println("服务器关闭连接");
                            break;
                        }
                        out.println("服务器已收到: " + inputLine);
                    }
                } catch (IOException e) {
                    System.err.println("处理客户端连接时出错: " + e.getMessage());
                }
            }
        } catch (IOException e) {
            System.err.println("无法启动服务器,端口可能已被占用: " + PORT);
            e.printStackTrace();
        }
    }
}

客户端实现

客户端程序需要创建一个Socket对象并连接到服务器的指定 IP 地址和端口。以下是一个简单的客户端实现:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient {
    private static final String SERVER_ADDRESS = "localhost";
    private static final int PORT = 8888;

    public static void main(String[] args) {
        try (Socket socket = new Socket(SERVER_ADDRESS, PORT);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(
                     new InputStreamReader(socket.getInputStream()));
             Scanner scanner = new Scanner(System.in)) {

            System.out.println("已连接到服务器: " + SERVER_ADDRESS + ":" + PORT);
            System.out.println("输入消息发送到服务器,输入'退出'结束通信");

            String userInput;
            while (true) {
                System.out.print("请输入消息: ");
                userInput = scanner.nextLine();
                
                // 向服务器发送消息
                out.println(userInput);
                
                // 读取服务器响应
                String response = in.readLine();
                System.out.println("服务器响应: " + response);
                
                if ("退出".equals(userInput) || "服务器关闭连接".equals(response)) {
                    break;
                }
            }
        } catch (IOException e) {
            System.err.println("与服务器通信时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

代码解析

服务器端解析

  1. 创建 ServerSocket:通过new ServerSocket(PORT)创建服务器套接字并绑定到指定端口。
  2. 等待连接:调用serverSocket.accept()方法等待客户端连接,此方法会阻塞直到有客户端连接。
  3. 获取输入输出流:通过clientSocket.getInputStream()clientSocket.getOutputStream()获取与客户端通信的输入输出流。
  4. 处理客户端消息:使用循环读取客户端发送的消息,并发送响应。
  5. 资源管理:使用 try-with-resources 语句确保资源自动关闭。

客户端解析

  1. 创建 Socket:通过new Socket(SERVER_ADDRESS, PORT)创建客户端套接字并连接到服务器。
  2. 获取输入输出流:与服务器端类似,获取与服务器通信的输入输出流。
  3. 发送和接收消息:使用循环读取用户输入并发送给服务器,同时接收服务器响应。
  4. 关闭连接:当用户输入 "退出" 时,关闭连接。

运行示例

  1. 首先运行服务器端程序,控制台会显示 "服务器已启动,监听端口: 8888"。
  2. 然后运行客户端程序,控制台会显示 " 已连接到服务器: localhost:8888"。
  3. 在客户端输入消息,按回车发送,客户端和服务器端都会显示相应的消息。
  4. 输入 "退出" 结束通信。

改进与扩展

上面的示例是一个基础的 TCP 通信实现,实际应用中可能需要考虑以下几点改进:

  1. 多线程处理:当前服务器只能处理一个客户端连接,可以使用多线程来处理多个客户端连接。
  2. 异常处理:增强异常处理机制,确保程序在各种异常情况下都能正常工作。
  3. 消息格式:定义更复杂的消息格式,支持不同类型的消息。
  4. 资源管理:确保所有资源都能被正确关闭,避免资源泄漏
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedTCPServer {
    private static final int PORT = 8888;
    private static final int THREAD_POOL_SIZE = 10;

    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("服务器已启动,监听端口: " + PORT);
            
            // 创建线程池 xieyifan
            ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);

            while (true) {
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("客户端连接成功: " + clientSocket.getInetAddress());
                
                // 将客户端连接交给线程池处理
                threadPool.execute(new ClientHandler(clientSocket));
            }
        } catch (IOException e) {
            System.err.println("无法启动服务器,端口可能已被占用: " + PORT);
            e.printStackTrace();
        }
    }

    private static class ClientHandler implements Runnable {
        private final Socket clientSocket;

        public ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }

        @Override
        public void run() {
            try (PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                 BufferedReader in = new BufferedReader(
                         new InputStreamReader(clientSocket.getInputStream()))) {

                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    System.out.println("客户端 " + clientSocket.getInetAddress() + " 消息: " + inputLine);
                    
                    if ("退出".equals(inputLine)) {
                        out.println("服务器关闭连接");
                        break;
                    }
                    out.println("服务器已收到: " + inputLine);
                }
            } catch (IOException e) {
                System.err.println("处理客户端连接时出错: " + e.getMessage());
            } finally {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

提高了服务器的并发处理能力。

总结

通过SocketServerSocket类,Java 提供了简单而强大的 TCP 通信功能。本文介绍了 TCP 通信的基本概念,展示了如何实现一个简单的客户端 - 服务器程序,并讨论了如何改进和扩展这个基础实现。掌握这些知识后,你可以开发更复杂的网络应用,如聊天程序、文件传输系统等。

到此这篇关于Java实现TCP通信的文章就介绍到这了,更多相关Java实现TCP通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java局部变量表的基础知识点及实例

    java局部变量表的基础知识点及实例

    在本篇文章里小编给大家整理的是一篇关于java局部变量表的基础知识点及实例,有需要的朋友们可以学习参考下。
    2021-06-06
  • Java正则表达式API Matcher类方法

    Java正则表达式API Matcher类方法

    这篇文章主要介绍了Java正则表达式API Matcher类方法,对Matcher类的一些有用方法进行功能对它们进行分组展开介绍,需要的朋友可以参考一下
    2022-06-06
  • JAVA基础之控制台输入输出的实例代码

    JAVA基础之控制台输入输出的实例代码

    下面小编就为大家带来一篇JAVA基础之控制台输入输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 聊聊maven与jdk版本对应关系

    聊聊maven与jdk版本对应关系

    这篇文章主要介绍了maven与jdk版本对应关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java读取csv文件示例分享(java解析csv文件)

    java读取csv文件示例分享(java解析csv文件)

    这篇文章主要介绍了java读取csv文件示例,这个java解析csv文件的例子很简单,下面直接上代码,大家参考使用吧
    2014-03-03
  • Java返回文件时为图片或pdf等设置在线预览或下载功能

    Java返回文件时为图片或pdf等设置在线预览或下载功能

    这篇文章主要介绍了Java返回文件时为图片或pdf等设置在线预览或下载功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 深入理解Maven的坐标与依赖

    深入理解Maven的坐标与依赖

    这篇文章主要介绍了深入理解Maven的坐标与依赖,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Java实现多个wav文件合成一个的方法示例

    Java实现多个wav文件合成一个的方法示例

    这篇文章主要介绍了Java实现多个wav文件合成一个的方法,涉及java文件流读写、编码转换、解析等相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • java中brew安装rabbitmq以及简单实例

    java中brew安装rabbitmq以及简单实例

    RabbitMQ是基于AMQP协议,由Erlang语言开发的开源消息队列系统,广泛应用于分布式系统中,用于应用程序间的消息传递,它支持多种交换机类型,如直连交换机、扇形交换机和主题交换机等,能够满足不同的消息路由需求
    2024-10-10
  • 对数据进行分页显示到table中的实现方法

    对数据进行分页显示到table中的实现方法

    这篇文章主要介绍了对数据进行分页显示到table中的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05

最新评论