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

首先,我们需要明确一下什么是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日

相关文章

  • Windows8系统Metro(Modern UI)界面应用程序安装失败的解决方法

    针对“Windows8系统Metro(Modern UI)界面应用程序安装失败”的解决方法,下面提供完整攻略,包括以下步骤: 1. 确认系统环境与要求 在安装前,需要确认系统的环境是否符合要求。要求如下: 操作系统至少是 Windows 8 或更新的版本 设备应该使用有线或无线网络连接 用户应该具有管理员权限 如果系统环境满足要求,并仍然无法安装应用程序,则…

    other 2023年6月25日
    00
  • Java JDK动态代理的基本原理详细介绍

    以下是使用标准的Markdown格式文本,详细讲解Java JDK动态代理的基本原理的完整攻略: Java JDK动态代理的基本原理详细介绍 什么是动态代理 动态代理是一种设计模式,它允许我们在运行时创建代理对象,而不需要显式地编写代理类。在Java中,JDK提供了一种动态代理的机制,即通过java.lang.reflect.Proxy类和java.lang…

    other 2023年10月14日
    00
  • access中insertinto用法

    Access中Insert Into用法 在Access中,INSERT INTO语句用于向表中插入新的记录。本文将介绍INSERT INTO语句的用法,并提供两个示例说明。 语法 INSERT INTO语句的基本语法如下: INSERT INTO table_name (column1, column2, column3, …) VALUES (val…

    other 2023年5月7日
    00
  • Maven一键部署Springboot到Docker仓库为自动化做准备(推荐)

    下面是详细讲解Maven一键部署Springboot到Docker仓库为自动化做准备的完整攻略。 一、前提条件 在开始使用Maven一键部署Springboot到Docker仓库之前,需要确保以下条件都满足: 1.已安装Docker,并正确配置了Docker环境; 2.已安装Maven,并正确配置了Maven环境; 3.已有一个可部署的Springboot项…

    other 2023年6月27日
    00
  • Java服务器端跨域问题解决方案

    Java 服务器端跨域问题指的是当客户端所在的网页的域名、端口、协议与Web服务器所在的域名、端口、协议不一致时,客户端无法直接向Web服务器发起请求的问题。 方案一:使用CORS CORS (Cross-Origin Resource Sharing)是W3C规范,允许Web服务器在响应客户端请求时,明确指示客户端的跨源请求是允许的。通过在响应头中设置Ac…

    other 2023年6月27日
    00
  • cmake源码包安装后的卸载问题

    以下是“cmake源码包安装后的卸载问题”的完整攻略: cmake源码包安装后的卸载问题 CMake是一款跨平台的自动化构建工具,可以帮助开发人员管理构建C++项目。在安装CMake,您可能会遇到卸载问题。本攻略将介绍如何卸载CMake源码包。 步骤1:使用make卸载 打开终端并进入CMake源码包的目录。 运行以下命令以卸载CMake: sudo mak…

    other 2023年5月7日
    00
  • 怎么查看隐藏文件

    查看隐藏文件需要在操作系统中设置,下面是Windows和macOS两种操作系统的查看隐藏文件的具体方法: Windows 在Windows系统中,可以通过下面的步骤来查看隐藏文件: 打开”文件夹选项”对话框。按下Win + E打开文件资源管理器,然后在菜单栏中点击”查看”,在下拉菜单中选择”选项”。 在”文件夹选项”对话框中选择”查看”标签页,向下滚动找到”…

    其他 2023年4月16日
    00
  • redis通过pipeline提升吞吐量的方法

    Redis是一款内存型的NoSQL数据库,其在处理大规模数据集时对吞吐量的要求非常高。pipeline是Redis提供的一项技术,可以有效地提升Redis读写操作的吞吐量。本文将详细讲解如何通过pipeline提升Redis的吞吐量,并提供两个示例说明。 什么是pipeline 当应用要对Redis进行操作时,会向Redis发送一次请求,Redis对该请求进…

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