Java编程实现多线程TCP服务器完整实例

Java编程实现多线程TCP服务器完整实例

简介

本文将通过Java代码实现一个多线程的TCP服务器,包含完整的代码以供参考。该服务器能够同时服务多个客户端,每个客户端都在独立的线程中运行。本文将介绍如何实现TCP Socket编程,以及如何使用Java多线程进行并发编程。

实现目标

  1. 实现一个多线程TCP服务器,支持多客户端同时连接。
  2. 服务器能够接受客户端连接,并读取并输出客户端发送的消息。
  3. 服务器能够向客户端发送消息,并关闭连接。

代码实现

以下是实现该目标的Java代码,我们对其进行分析:

import java.io.*;
import java.net.*;

public class MultithreadedTCPServer {
    public static void main(String[] args) throws IOException {
        //创建一个ServerSocket监听端口
        int portNumber = 5000;
        try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
            System.out.println("服务器启动,监听端口号: " + portNumber);
            //循环等待客户端连接
            while (true) {
                //客户端连接成功,创建新的Socket来处理客户端请求
                new ClientThread(serverSocket.accept()).start();
            }
        } catch (IOException e) {
            System.err.println("无法监听端口 " + portNumber);
            System.exit(-1);
        }
    }
}

//处理客户端请求的线程类
class ClientThread extends Thread {
    private Socket socket;
    private PrintWriter out;
    private BufferedReader in;

    public ClientThread(Socket socket) {
        super("ClientThread");
        this.socket = socket;
    }

    public void run() {
        try {
            System.out.println("客户端连接成功。地址:" + socket.getRemoteSocketAddress());

            //获取Socket的输入输出流,用于向客户端发送和接收消息
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                //客户端发送了"Bye"时,关闭连接
                if (inputLine.equals("Bye")) {
                    break;
                }
                //向客户端发送消息
                out.println("服务器响应:" + inputLine);
            }

            //关闭连接
            out.close();
            in.close();
            socket.close();
            System.out.println("客户端断开连接。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码实现分析

程序入口

程序入口使用了Java的main方法,其创建了一个ServerSocket并循环等待客户端的连接。

int portNumber = 5000;
try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
    System.out.println("服务器启动,监听端口号: " + portNumber);
    //循环等待客户端连接
    while (true) {
        //客户端连接成功,创建新的Socket来处理客户端请求
        new ClientThread(serverSocket.accept()).start();
    }
} catch (IOException e) {
    System.err.println("无法监听端口 " + portNumber);
    System.exit(-1);
}

其创建一个ServerSocket并绑定在5000端口,表示该服务器将会监听5000端口连接请求。当客户端连接时,主线程将创建一个新的ClientThread线程,并传入连接的Socket作为参数,然后启动该线程。

客户端线程

当客户端连接时,程序将通过一个ClientThread对象来处理客户端请求。该线程需要完成以下任务:

  1. 获取Socket的输入输出流,用于向客户端发送和接收消息。
  2. 读取客户端发送的消息,并向客户端发送响应消息。
  3. 关闭连接。
class ClientThread extends Thread {
    private Socket socket;
    private PrintWriter out;
    private BufferedReader in;

    public ClientThread(Socket socket) {
        super("ClientThread");
        this.socket = socket;
    }

    public void run() {
        try {
            System.out.println("客户端连接成功。地址:" + socket.getRemoteSocketAddress());

            //获取Socket的输入输出流,用于向客户端发送和接收消息
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                //客户端发送了"Bye"时,关闭连接
                if (inputLine.equals("Bye")) {
                    break;
                }
                //向客户端发送消息
                out.println("服务器响应:" + inputLine);
            }

            //关闭连接
            out.close();
            in.close();
            socket.close();
            System.out.println("客户端断开连接。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该线程包含了一个私有成员变量Socket,一个PrintWriter对象用于向客户端发送消息,一个BufferedReader对象用于接收客户端的消息。

当客户端连接服务器时,线程的run方法会被执行。在该方法中,首先获取了Socket的输入输出流,用于向客户端发送和接收消息。接着,它会读取客户端发送的消息,并向客户端发送响应消息。当客户端发送了"Bye"时,该线程将关闭连接。

示例

示例1

现在我们可以启动服务器,这可以通过执行MultithreadedTCPServer类的main方法来实现。当服务器开始监听端口时,我们可以启动多个客户端,这通过执行以下客户端代码和使用telnet命令行工具来实现:

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        String hostName = args[0];
        int portNumber = Integer.parseInt(args[1]);

        try (
            Socket socket = new Socket(hostName, portNumber);
            PrintWriter out =
                new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in =
                new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            BufferedReader stdIn =
                new BufferedReader(
                    new InputStreamReader(System.in))
        ) {
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("服务器响应: " + in.readLine());
                if (userInput.equals("Bye"))
                    break;
            }
        } catch (UnknownHostException e) {
            System.err.println("无法确定主机: " + hostName);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("无法连接到主机: " + hostName);
            System.exit(1);
        }
    }
}

执行代码java TCPClient localhost 5000可以启动一个客户端并连接到之前启动的服务器。这将打开一个输入流,可以在其中输入消息并将其发送到服务器。服务器会处理这些请求,然后返回响应消息。

示例2

我们可以使用telnet命令来手动连接到之前启动的服务器。在终端输入命令telnet localhost 5000 就能连接到服务器。输入消息并按Enter键发送,服务器将会打印出消息并返回响应消息。当要断开连接时,输入"Bye"即可关闭TCP连接。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程实现多线程TCP服务器完整实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java实现汽车租赁系统

    Java实现汽车租赁系统的完整攻略 应用背景 汽车租赁系统是现代化社会的必需品,便捷舒适的汽车租赁服务为人们的出行带来了便捷性。利用 Java 编程语言可以很方便地实现汽车租赁系统,提供一个方便用户租赁汽车的平台,同时也可以有利于租车公司的管理。 目标设置 本项目的主要目标是设计和实现一个汽车租赁系统,使用户可以通过平台查询和租用汽车,实现汽车租赁的在线化和…

    Java 2023年5月23日
    00
  • CentOS7和8中安装Maven3.8.4的简单步骤

    下面我为你详细讲解 “CentOS7和8中安装Maven3.8.4的简单步骤”的完整攻略。 安装Java环境 在安装Maven之前,需要先在服务器上安装Java环境,否则Maven将无法正常使用。 # 在终端输入以下命令进行Java环境的安装 yum install java-1.8.0-openjdk-devel -y 安装完成后,检查Java环境是否正常…

    Java 2023年5月19日
    00
  • 详解如何在springcloud分布式系统中实现分布式锁

    下面是“详解如何在springcloud分布式系统中实现分布式锁”的完整攻略: 一、什么是分布式锁 分布式锁是指多个节点之间共享同一个锁,能够协作完成某一段代码的互斥操作。在分布式系统中使用分布式锁可以实现对共享资源的协调访问,防止多个节点同时对同一资源进行修改而引发数据一致性问题。 二、实现分布式锁的原理 在分布式系统中实现分布式锁需要考虑节点之间的共享和…

    Java 2023年5月20日
    00
  • Spring Data JPA实现数据持久化过程详解

    Spring Data JPA实现数据持久化过程详解 Spring Data JPA是Spring Framework和Hibernate框架的共同合作产物,它简化了JPA(Java Persistence API)的实现,提供了许多方便的功能,可以使我们更加容易地访问和操作持久化数据。下面将详细介绍Spring Data JPA实现数据持久化的过程。 添加…

    Java 2023年5月20日
    00
  • JSP实现的简单分页显示效果代码

    下面就是关于如何实现JSP简单分页显示效果的完整攻略。 一、分页原理介绍 分页是指将大量数据拆分成若干个小的单元,分别显示在不同的页面上。通过这种方式来展示大量数据可以更加清晰和直观。实现分页需要考虑到以下因素: 每页显示的数据数量 总共要显示的数据量 当前页数据的起始位置 当前页数和总页数 二、实现分页的方法 在JSP中,常用的实现分页的方法有两种:使用J…

    Java 2023年6月15日
    00
  • JAVA计算两个日期相差的实例

    下面为大家详细讲解“JAVA计算两个日期相差的实例”的完整攻略。 准备工作 首先,我们需要引入Java内置的日期类——java.util.Date和java.text.SimpleDateFormat,其中SimpleDateFormat类可以用于日期的格式化操作。 import java.util.Date; import java.text.Simple…

    Java 2023年5月20日
    00
  • 刺激!ChatGPT给我虚构了一本书?

    ChatGPT很强大,可以帮我们处理很多问题,但这些问题的答案的正确性您是否有考证过呢? 昨晚,DD就收到了一个有趣的反馈: 提问:有什么关于数据权限设计的资料推荐吗?ChatGPT居然介绍了一本根本不存在的书《数据权限设计与实现》,作者居然还是我… 那么你在使用ChatGPT的时候,有碰到过类似的问题​吗?在使用AI辅助工作的时候,你是否会对结果进一步…

    Java 2023年5月4日
    00
  • java web开发之实现购物车功能

    Java Web开发之实现购物车功能 购物车功能介绍 在在线购物系统中,购物车是不可或缺的一个功能,它可以记录用户选购的商品,方便用户在后续的商品结算中进行批量操作,也可以提高用户的购物体验和满意度。购物车功能的实现需要涉及到会话管理、数据库操作等多个方面,需要开发者掌握一定的技术。 实现步骤 购物车功能一般可以分为以下几个步骤: 1. 添加商品到购物车 添…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部