JAVA实现SOCKET多客户端通信的案例

yizhihongxing

首先,我们需要明确一下什么是Socket,Socket是一种抽象的概念,是对地址和端口的封装。在计算机网络中,Socket指的就是TCP/IP协议网络编程接口,它是应用层与传输层之间的连接门户,使得网络应用程序能够访问传输层协议,进行数据传输。本文将详细讲解如何用Java实现Socket多客户端通信的案例。

1. 服务器端的实现

1.1 创建ServerSocket对象

首先,我们需要创建ServerSocket对象作为服务器端的接口,监听本机的指定端口号,以便可以与客户端建立TCP连接。这里以创建端口号为8888的ServerSocket对象为例,代码如下:

int port = 8888;
ServerSocket serverSocket = new ServerSocket(port);

1.2 接收客户端请求

接下来,我们需要创建一个循环,不断地接收客户端请求,根据客户端请求的不同,采取不同的处理方式。代码如下:

while (true) {
    //等待客户端的连接请求
    Socket socket = serverSocket.accept();
    //创建一个新的线程处理客户端请求
    new ServerThread(socket).start();
}

1.3 创建线程处理客户端请求

为了同时处理多个客户端请求,我们需要创建一个线程处理每个客户端请求。代码如下:

public class ServerThread extends Thread {
    private Socket socket;
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //获取输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //获取输出流
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            //读取客户端发送的数据
            String s = in.readLine();
            //处理客户端请求,并将响应发送回客户端
            out.println("Hello, " + s);
            out.flush();
            //关闭流和客户端连接
            in.close();
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 客户端的实现

2.1 创建Socket对象

客户端需要创建一个Socket对象,指定服务器的IP地址和端口号,代码如下:

String host = "127.0.0.1";
int port = 8888;
Socket socket = new Socket(host, port);

2.2 发送请求并接收响应

客户端需要向服务器发送请求,并接收服务器的响应。代码如下:

//获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取输出流
PrintWriter out = new PrintWriter(socket.getOutputStream());
//向服务器发送请求
String s = "world";
out.println(s);
out.flush();
//接收服务器的响应
String res = in.readLine();
System.out.println("服务器响应:" + res);
//关闭流和客户端连接
in.close();
out.close();
socket.close();

3. 完整代码示例

下面是一个完整的Java Socket多客户端通信的案例代码示例:

3.1 服务器端代码

public class Server {
    public static void main(String[] args) throws IOException {
        int port = 8888;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("服务器启动成功!");
        while (true) {
            //等待客户端的连接请求
            Socket socket = serverSocket.accept();
            System.out.println("客户端连接成功!");
            //创建一个新的线程处理客户端请求
            new ServerThread(socket).start();
        }
    }
    public static class ServerThread extends Thread {
        private Socket socket;
        public ServerThread(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            try {
                //获取输入流
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //获取输出流
                PrintWriter out = new PrintWriter(socket.getOutputStream());
                //读取客户端发送的数据
                String s = in.readLine();
                System.out.println("接收到客户端发送的数据:" + s);
                //处理客户端请求,并将响应发送回客户端
                out.println("Hello, " + s);
                out.flush();
                //关闭流和客户端连接
                in.close();
                out.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.2 客户端代码

public class Client {
    public static void main(String[] args) throws IOException {
        String host = "127.0.0.1";
        int port = 8888;
        Socket socket = new Socket(host, port);
        //获取输入流
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //获取输出流
        PrintWriter out = new PrintWriter(socket.getOutputStream());
        //向服务器发送请求
        String s = "world";
        out.println(s);
        out.flush();
        System.out.println("发送数据:" + s);
        //接收服务器的响应
        String res = in.readLine();
        System.out.println("服务器响应:" + res);
        //关闭流和客户端连接
        in.close();
        out.close();
        socket.close();
    }
}

以上就是Java实现Socket多客户端通信的完整攻略,我们通过创建ServerSocket对象监听客户端请求,创建线程处理客户端请求,并通过Socket对象实现客户端与服务器之间的通信。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA实现SOCKET多客户端通信的案例 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 史上最详细的vsftpd配置文件详解

    下面是“史上最详细的vsftpd配置文件详解”的完整攻略。 什么是vsftpd? vsftpd(Very Secure FTP Daemon)是一个开源的FTP服务器软件,它采用C语言编写,专为安全性、速度和稳定性而设计。目前,vsftpd是Linux服务器上最流行的FTP服务器软件之一。 安装vsftpd 要使用vsftpd,首先需要在Linux服务器上安…

    other 2023年6月25日
    00
  • MySQL约束(创建表时的各种条件说明)

    MySQL约束是用于保证数据完整性和一致性的重要措施之一,创建表时可以通过添加约束来定义表中的一些条件限制,以下是MySQL约束的详细说明: 1. NOT NULL约束 NOT NULL约束用于保证该列的值不能为空,这是一个非常常见的约束。 语法: column_name data_type NOT NULL 示例: CREATE TABLE student…

    other 2023年6月25日
    00
  • C89标准库函数手册(待整理)

    C89标准库函数手册(待整理)的完整攻略 C89标准库函数手册是C语言程序员必备的参考资料之一,它包含了C语言标准库中的所有函数及其用法。本文将为您提供一份详细的C89标准库函数手册的完整攻略,包括手册的结构、使用方法和两个示例说明。 手册结构 C89标准库函数手册通常按照以下结构组织: 头文件:列出了所有C语言标准库的头文件及其包含的函数。 函数列表:按照…

    other 2023年5月5日
    00
  • latex怎么自适应表格宽度

    在LaTeX中,可以使用tabularx宏包来实现自适应表格宽度。以下是使用tabularx宏包的详细说明: 基本用法 要使用tabularx宏包,需要在导言区中添加以下代码: latex \usepackage{tabularx} 然后,可以使用tabularx环境来创建自适应表格。以下是一个基本的示例: latex \begin{tabularx}{\t…

    other 2023年5月7日
    00
  • postman接口做关联测试的方法步骤

    Postman接口做关联测试的方法步骤攻略 Postman是一款常用的API开发和测试工具,它提供了丰富的功能来进行接口测试。在进行关联测试时,我们可以使用Postman的环境变量和脚本功能来实现接口之间的数据传递和关联。下面是使用Postman进行接口关联测试的详细步骤: 步骤一:创建环境变量 打开Postman,点击左上角的齿轮图标,选择\”Manage…

    other 2023年7月29日
    00
  • mysql 8.0.13手动安装教程

    请您耐心看完以下的“MySQL 8.0.13手动安装教程”完整攻略。 目录 前置条件 步骤一:下载MySQL安装包 步骤二:解压安装包 步骤三:创建MySQL用户和用户组 步骤四:创建MySQL数据存放目录 步骤五:安装MySQL 步骤六:初始化MySQL数据库 步骤七:启动MySQL服务 步骤八:登录MySQL 前置条件 在开始安装之前,确保您已经满足以下…

    other 2023年6月27日
    00
  • 一文轻松了解Python中类的继承

    一文轻松了解Python中类的继承 在 Python 中,我们可以通过类的继承机制来创建一个新的类,它会自动继承父类的属性和方法,同时可以添加一些新的属性和方法来扩充其功能。本文将会深入探讨 Python 中类的继承,包括如何继承以及如何调用父类的方法和属性等知识点。 如何实现类的继承 在 Python 中,我们可以通过在子类声明时,将父类作为参数传递来实现…

    other 2023年6月27日
    00
  • C/C++练习题之合并k个已排序的链表

    这是一道经典的算法题,解决方法可以使用分治或者堆。 题目描述 合并k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其时间复杂度和空间复杂度。 示例1: 输入:[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表可视化如下: 1 -> 4 -> 5 1 -> 3 -> 4 2 -&g…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部