Java编程Socket实现多个客户端连接同一个服务端代码

需要实现Java编程Socket实现多个客户端连接同一个服务端的功能,通常需要遵循以下步骤:

1. 创建服务端Socket
在服务端,我们需要创建一个ServerSocket对象。这个对象可以监听客户端连接请求,并为每个新的连接创建一个Socket对象。以下是示例代码:

ServerSocket serverSocket = new ServerSocket(8888);

上面的代码中,我们创建了一个端口号为8888的ServerSocket对象,可以通过该对象监听客户端的连接请求。

2. 创建多个客户端Socket
在客户端,我们需要创建一个Socket对象,并连接到服务端的IP地址和端口号。以下是示例代码:

Socket socket = new Socket("localhost", 8888);

上面的代码中,我们创建了一个连接到本地IP地址和端口号为8888的ServerSocket的客户端Socket对象。如果需要连接到其他IP地址和端口号,可以替换localhost和8888为合适的值。

需要注意的是,我们可以在客户端代码中创建多个Socket对象,以实现多个客户端连接同一个服务端的功能。

3. 处理客户端连接请求
在服务端,我们需要使用while循环监听客户端的连接请求,并为每个新的连接创建一个新的线程。以下是示例代码:

while (true) {
    Socket socket = serverSocket.accept();
    ServerThread serverThread = new ServerThread(socket);
    serverThread.start();
}

上面的代码中,我们使用while循环不断检查是否有新的客户端连接请求。当有新的连接请求时,我们创建一个新的Socket对象,并为该连接创建一个新的线程。

4. 处理客户端消息
在服务端的线程中,我们需要不断读取客户端发送的消息,并进行处理。以下是示例代码:

InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
    String message = reader.readLine();
    if (message == null) {
        break;
    }
    // 处理消息逻辑
}

上面的代码中,我们使用InputStream和BufferedReader对象读取客户端发送的消息,并进行处理。

5. 向客户端发送消息
在服务端的线程中,如果需要向客户端发送消息,我们可以使用Socket对象的OutputStream和PrintWriter对象。以下是示例代码:

OutputStream outputStream = socket.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
writer.println("hello");
writer.flush();

上面的代码中,我们使用OutputStream和PrintWriter对象向客户端发送消息。

以下是示例代码:

public class ServerThread extends Thread {
    private Socket socket;
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        try {
            InputStream inputStream = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
            while (true) {
                String message = reader.readLine();
                if (message == null) {
                    break;
                }
                System.out.println("收到客户端消息:" + message);
                writer.println("收到消息:" + message);
                writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

上面的代码中,我们创建了一个ServerThread类,继承自Thread类,并在run()方法中处理服务端的逻辑。在该类中,我们重写了run()方法,包含了处理客户端消息的逻辑。我们通过覆盖run()方法来实现多线程的功能。

接下来是客户端的示例代码:

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8888);
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
            InputStream inputStream = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            writer.println("hello");
            writer.flush();
            String message = reader.readLine();
            System.out.println("收到消息:" + message);
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的代码中,我们创建了一个Client类,并使用Socket对象连接到服务端。在该类中,我们使用PrintWriter对象向服务端发送了一条消息,并通过BufferedReader对象读取服务端的返回消息。

以上是Java编程Socket实现多个客户端连接同一个服务端的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程Socket实现多个客户端连接同一个服务端代码 - Python技术站

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

相关文章

  • k8s 中的 service 如何找到绑定的 Pod 及实现 Pod 负载均衡的方法

    为了实现Pod的负载均衡,Kubernetes中的服务(Service)控制器可以通过按照服务标签匹配的方式,直接查找到绑定的Pod。下面来详细讲解k8s服务如何找到绑定的Pod以及实现Pod负载均衡的方法。 1.服务如何找到绑定的Pod Kubernetes服务控制器根据其服务标签选择器(Label Selector)中定义的标签选择器,找到所有符合选择器…

    other 2023年6月27日
    00
  • Java 获取本机IP地址的实例代码

    获取本机IP地址是Java编程中的一个常见需求。下面是一个完整的攻略,包含了两个示例说明。 步骤1:使用InetAddress类获取本机IP地址 Java提供了InetAddress类来获取本机的IP地址。以下是获取本机IP地址的示例代码: import java.net.InetAddress; import java.net.UnknownHostExc…

    other 2023年7月30日
    00
  • C++类成员函数后面加const问题

    当在C++中定义类成员函数时,在函数声明的末尾添加const关键字可以指定该函数为常量成员函数。这意味着该函数不能修改类的成员变量(除非它们被声明为mutable),并且不能调用非常量成员函数,以确保该函数不会对对象的状态产生任何影响。 常量成员函数的语法如下: 返回类型 函数名() const { // 函数体 } 下面是关于在C++中使用常量成员函数的完…

    other 2023年7月29日
    00
  • 白夜追凶一家五口谁杀的

    “白夜追凶”是一部中国大陆的犯罪悬疑剧,讲述了一起家庭灭门案的调查过程。在剧中,警方通过各种手段,最终揭开了真相。下面是“白追凶”一家五口谁杀的的完整攻略,包括两个示例说明。 方法一:分析案件细节 在调查家庭灭门案件时,我们需要仔细分析案件细节,包括现场痕迹、死者遗物、家庭成员关系等。通过分析这些细节,我们可以逐步缩小嫌疑人范围,最终找到真凶。下面是一个示例…

    other 2023年5月9日
    00
  • VS2015编译Qt5.7.0生成支持XP的静态库(很不错)

    下面是“VS2015编译Qt5.7.0生成支持XP的静态库(很不错)”的完整攻略,包括环境配置、编译过程、示例说明等方面。 环境配置 在开始编译Qt5.7.0之前,需要先进行环境配置。以下是环境配置的步骤: 安装Visual Studio 2015。 安装Windows SDK 7.1。 安装Perl。 安装Python。 安装Ruby。 安装Git。 编译…

    other 2023年5月5日
    00
  • C++11新特性std::tuple的使用方法

    当我们需要返回多个值的时候,一般会选择使用结构体或者数组来实现。但使用结构体时,需要事先定义一个结构体,并在调用函数时传入已经定义好的结构体类型;使用数组时,就需要定义数组的长度,也不方便返回不同类型的数据。针对这些问题,C++11引入了std::tuple,可以便捷地封装多组不同类型的数据。 下面先给出std::tuple的定义和一些基本用法。头文件为 s…

    other 2023年6月26日
    00
  • 详解go语言单链表及其常用方法的实现

    详解Go语言单链表及其常用方法的实现 什么是单链表 单链表是一种常见的数据结构,它由一系列节点组成。每个节点分为两个部分,第一个部分存储当前节点的值,第二个部分存储下一个节点的地址。最后一个节点指向空(null)。单链表中保存的数据不存在顺序关系,且每个节点仅知道下一个节点的地址,不知道前一个节点的地址。因此,无法随机访问单链表中的元素,只能从链表的头部一个…

    other 2023年6月27日
    00
  • ppt2013菜单中没有控件工具怎么办?

    当用户在使用Microsoft PowerPoint 2013时,若发现菜单中没有控件工具,可能是由于某些原因显示方式被修改导致的。此时可按照以下步骤解决: 第一步:确认显示方式 确认“开始”选项卡下的“段落”中的“对齐方式”右侧是否有“显示方式”按钮。 如果没有“显示方式”按钮,则需通过“文件”选项卡下的“选项”菜单进入“自定义功能区”界面,并添加“开发工…

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