Java多线程实现TCP网络Socket编程(C/S通信)

Java多线程实现TCP网络Socket编程(C/S通信)攻略

TCP网络Socket编程是C/S(客户端/服务器)通信的常用方式之一。在Java中,可以使用多线程来实现TCP网络Socket编程,并达到高效的并发处理能力。下面就是Java多线程实现TCP网络Socket编程(C/S通信)的攻略,包含详细步骤和示例代码。

1. 创建服务器端Socket

在Java中,可以使用ServerSocket类来创建服务器端的Socket。需要指定端口号和连接请求队列的长度。示例代码如下:

try {
    int port = 8888; // 服务器端口号
    int backlog = 20; // 连接请求队列的长度
    ServerSocket serverSocket = new ServerSocket(port, backlog);
    System.out.println("服务器已启动,监听端口" + port + "...");
    // 等待客户端连接
    while (true) {
        Socket socket = serverSocket.accept(); // 接收客户端连接请求
        // 新建线程处理客户端请求
        new ServerThread(socket).start();
    }
} catch (IOException e) {
    e.printStackTrace();
}

2. 创建客户端Socket

在Java中,可以使用Socket类来创建客户端的Socket。需要指定服务器的地址和端口号。示例代码如下:

try {
    String host = "localhost"; // 服务器地址
    int port = 8888; // 服务器端口号
    Socket socket = new Socket(host, port);
} catch (UnknownHostException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

3. 处理客户端请求的线程

在服务器端,每当有一个客户端连接请求时,就会新建一个线程处理客户端请求。在Java中,可以继承Thread类,然后覆盖run()方法来定义线程的执行逻辑。具体的执行逻辑根据实际需求来编写。示例代码如下:

class ServerThread extends Thread {
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 发送和接收数据

在Java中,可以使用InputStreamOutputStream类来进行数据的收发。需要注意的是,在通信过程中,要对数据进行编码和解码,以确保数据的传输和读取的正确性。示例代码如下:

4.1 客户端发送数据

try {
    OutputStream out = socket.getOutputStream(); // 获取Socket输出流
    String data = "Hello, server!";
    byte[] bytes = data.getBytes("UTF-8"); // 对数据进行编码
    out.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
}

4.2 服务器端接收数据

try {
    InputStream in = socket.getInputStream(); // 获取Socket输入流
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read(buffer)) > 0) { // 循环读取数据
        String data = new String(buffer, 0, len, "UTF-8"); // 对数据进行解码
        System.out.println(data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

5. 示例

下面是一个完整的示例,演示如何使用Java多线程实现TCP网络Socket编程(C/S通信):

5.1 服务器端

public class Server {
    public static void main(String[] args) {
        try {
            int port = 8888; // 服务器端口号
            int backlog = 20; // 连接请求队列的长度
            ServerSocket serverSocket = new ServerSocket(port, backlog);
            System.out.println("服务器已启动,监听端口" + port + "...");
            // 等待客户端连接
            while (true) {
                Socket socket = serverSocket.accept(); // 接收客户端连接请求
                // 新建线程处理客户端请求
                new ServerThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ServerThread extends Thread {
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.2 客户端

public class Client {
    public static void main(String[] args) {
        try {
            String host = "localhost"; // 服务器地址
            int port = 8888; // 服务器端口号
            Socket socket = new Socket(host, port);
            OutputStream out = socket.getOutputStream(); // 获取Socket输出流
            String data = "Hello, server!";
            byte[] bytes = data.getBytes("UTF-8"); // 对数据进行编码
            out.write(bytes);
            socket.shutdownOutput(); // 发送完毕,关闭Socket输出流
            InputStream in = socket.getInputStream(); // 获取Socket输入流
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) > 0) { // 循环读取数据
                String reply = new String(buffer, 0, len, "UTF-8"); // 对数据进行解码
                System.out.println(reply);
            }
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程实现TCP网络Socket编程(C/S通信) - Python技术站

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

相关文章

  • 详解SpringMVC中的四种跳转方式、视图解析器问题

    以下是关于“详解SpringMVC中的四种跳转方式、视图解析器问题”的完整攻略,其中包含两个示例。 SpringMVC中的四种跳转方式 SpringMVC中有四种跳转方式,分别是: forward redirect internalRedirect sendRedirect 1. forward forward是一种服务器内部跳转方式,它将请求转发给另一个控…

    Java 2023年5月16日
    00
  • Java操作Jenkins操作凭证(Credential)信息方式

    Java 操作 Jenkins 操作凭证(Credential)信息方式 Jenkins的凭证(Credential)是一种安全机制,用于存储登录Jenkins服务器和与其他系统进行交互时所需的敏感信息,例如密码、API tokens等等。 使用Java操作Jenkins凭证可以让我们在Jenkins系统中实现更加安全的信息存储和交互,方便我们对Jenkin…

    Java 2023年5月20日
    00
  • java操作mysql实现增删改查的方法

    Java操作MySQL实现增删改查的方法完整攻略 1. 环境准备 在Java项目中,我们需要使用JDBC来操作MySQL数据库,因此需要引入MySQL的JDBC驱动包。以Maven项目为例,我们可以在pom.xml文件中加入以下依赖: <dependency> <groupId>mysql</groupId> <ar…

    Java 2023年5月20日
    00
  • 在java中由类名和方法名字符串实现其调用方式

    在Java中,可以通过类名和方法名字符串来实现对方法的调用。这通常用于在运行时动态执行代码,从而实现更加灵活的程序设计。 以下是实现该过程的完整攻略: 获取类名对应的Class对象 首先需要获取类名对应的Class对象,这可以通过Class.forName()方法来实现,该方法的参数为类的全名字符串,例如: Class<?> clazz = Cl…

    Java 2023年5月27日
    00
  • Spring 整合Shiro 并扩展使用EL表达式的实例详解

    一、前言 在Web应用中,身份认证和权限控制是非常重要的组成部分,Shiro作为一个灵活的、功能强大的Java安全框架,在开发过程中可以方便地实现各种安全需求,因此被广泛应用于各种Java项目中。而Spring则作为一个非常流行的开发框架,与Shiro的整合可以解决现代Web应用中的常见安全问题。 本文将详细讲解如何在Spring项目中集成Shiro,并使用…

    Java 2023年6月15日
    00
  • ​​​​​​​Spring多租户数据源管理 AbstractRoutingDataSource

    下面是关于Spring多租户数据源管理的完整攻略。 什么是Spring多租户数据源管理? Spring多租户数据源管理是指在一个应用程序中,为不同的租户(tenant)提供不同的数据库连接,并通过一个中心路由器(AbstractRoutingDataSource)将相应的数据库连接与请求的租户关联起来,实现多租户级别的数据隔离。 AbstractRoutin…

    Java 2023年6月2日
    00
  • Java利用哈夫曼编码实现字符串压缩

    Java利用哈夫曼编码实现字符串压缩 介绍 哈夫曼编码是一种可变长度编码,它在通信和数据压缩领域得到广泛的应用。在哈夫曼编码中,出现频率高的字符或词语将被分配短的编码,出现频率低的则分配长的编码,这样可以有效地减少数据的传输量和存储空间。 本攻略将介绍如何使用Java实现字符串的压缩和解压缩,其中包括使用哈夫曼编码来实现压缩。 步骤 以下是压缩和解压缩的完整…

    Java 2023年5月20日
    00
  • Java struts2请求源码分析案例详解

    Java struts2请求源码分析攻略 概述 在Java web开发中,struts2框架是一个常用的web应用框架。为了深入了解struts2框架的使用和工作原理,我们需要对其请求源码进行分析。 步骤 步骤1:打开struts2源码 首先,我们需要下载struts2框架的源代码,并导入到开发工具中。源代码可以在struts2官网或者GitHub上下载。 …

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