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();
        }
    }
}
阅读剩余 74%

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

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

相关文章

  • JsChart组件使用详解

    JsChart组件使用详解 简介 JsChart是一个基于JavaScript的图表库,可以通过该组件实现多种类型的图表(如折线图、柱形图、饼图等)展示,并支持自定义配置和风格。 安装 可以通过npm进行安装: npm install jchart 或者下载jchart.min.js文件,引入到HTML页面中: <script type="t…

    Java 2023年6月15日
    00
  • Java编程倒计时实现方法示例

    下面是详细讲解“Java编程倒计时实现方法示例”的完整攻略: 1. 关于Java编程倒计时的实现 Java编程中的倒计时通常通过计时器(Timer)和计时任务(TimerTask)来实现。Timer是Java提供的一个能够定时执行任务的工具类,TimerTask则是一个任务执行类,我们可以将需要定时执行的任务封装在TimerTask中,然后由Timer去执行…

    Java 2023年5月20日
    00
  • springboot的war和jar包的使用详解

    Spring Boot的WAR和JAR包使用详解 Spring Boot是一个非常流行的开源框架,可以帮助开发者快速建立基于Spring的应用程序。一般情况下,Spring Boot提供两种打包方式:JAR包和WAR包。本文将详细介绍这两种打包方式的使用方法。 JAR包 JAR包是最常见的Java应用程序打包方式,可以包含所有需要的类文件和资源文件,还可以包…

    Java 2023年5月19日
    00
  • springdata jpa使用Example快速实现动态查询功能

    下面是Spring Data JPA使用Example快速实现动态查询功能的完整攻略。 什么是Spring Data JPA Spring Data JPA 是Spring框架的一项子项目,它基于 Hibernate 实现了 JPA 规范,提供了一种简化 JPA 数据访问层的方法。 利用Spring Data JPA实现动态查询 使用Spring Data …

    Java 2023年5月20日
    00
  • 分享几个写简洁java代码的小技巧

    下面来分享一下几个写简洁 Java 代码的小技巧。 一、避免使用不必要的变量 在编写代码时,经常会定义很多变量,在一些场景下很有必要,但是在一些场景下并没有用处,反而会增加代码的复杂度。这时候我们可以尝试避免使用这些不必要的变量。 示例: // 不必要的变量 String name = "Alice"; String output = &…

    Java 2023年5月23日
    00
  • Java如何获取指定目录文件列表

    获取指定目录文件列表是 Java 编程中常见的操作之一,可以通过 Java 的 File 类来实现。下面是获取指定目录文件列表的完整攻略: 第一步:创建 File 对象 首先需要创建一个 File 对象来表示要获取的目录。File 对象可以接受一个目录路径作为参数,例如: File directory = new File("path/to/dir…

    Java 2023年5月20日
    00
  • JSP中使用JSTL按不同条件输出内容的方法

    下面我将详细讲解JSP中使用JSTL按不同条件输出内容的方法的完整攻略。 1. 什么是 JSTL? JavaServer Pages (JSP) 标准标记库(英文全称为:JavaServer Pages Standard Tag Library,简称为JSTL)是SUN公司内部开发的一套在JSP中使用的JSP标准标签库,它封装了JSP应用的通用核心功能,便于…

    Java 2023年6月15日
    00
  • 详解Java多线程编程中互斥锁ReentrantLock类的用法

    详解Java多线程编程中互斥锁ReentrantLock类的用法 简介 Java多线程编程中,为了保证线程安全,需要保证同一时间只有一个线程访问共享资源。使用互斥锁可以实现这个目的。在Java中,ReentrantLock类提供了互斥锁的功能。 ReentrantLock是可重入的互斥锁,它允许线程重复地获取同一把锁,而不会造成死锁。与synchronize…

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