java搭建一个Socket服务器响应多用户访问

  1. 首先,了解什么是Socket服务器?

Socket服务器是一个能够接收并处理多个客户端请求的服务器程序,它使用Socket来实现网络通信。Java中,使用ServerSocket和Socket类来实现一个基本的Socket服务器程序。

  1. 准备工作

在开始搭建Socket服务器之前,需要安装一个Java开发环境(JDK),下面以JDK11为例:

  • 下载JDK11,并安装到本地计算机。
  • 配置环境变量,在系统环境变量中添加JAVA_HOME,指向JDK11的安装路径。

  • 编写Java代码

下面给出一个最基本的Java Socket服务器程序示例,代码实现了一个简单的“Echo服务”,即接收客户端发送的消息,并将其原封不动地返回给客户端。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
    public static void main(String[] args) throws IOException {
        // 创建ServerSocket并监听指定端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Socket服务器已启动,监听端口8888...");

        while (true) {
            // 等待客户端连接
            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接:" + clientSocket.getRemoteSocketAddress());

            // 处理客户端请求
            InputStream inputStream = clientSocket.getInputStream();
            OutputStream outputStream = clientSocket.getOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) { // 读取客户端发送的消息
                outputStream.write(buffer, 0, len); // 将消息原封不动地返回给客户端
            }

            // 关闭客户端连接
            clientSocket.close();
            System.out.println("客户端已断开连接:" + clientSocket.getRemoteSocketAddress());
        }
    }
}
  1. 运行Socket服务器

在命令行中进入到代码所在的目录,然后使用以下命令编译并运行Java程序:

javac EchoServer.java
java EchoServer

此时,Socket服务器已经启动并在监听端口8888接收客户端的连接。可以使用telnet命令模拟多个客户端连接服务器:

telnet localhost 8888

连接成功后,可以输入任意字符串并按下Enter键,此时服务器会将输入的字符串原封不动地返回给客户端。

  1. 示例2

下面给出另一个示例,实现了一个简单的聊天室程序,多个客户端可以在同一个聊天室中实现互相聊天。具体实现方式就是在服务器端维护一个客户端列表,并在接收到客户端消息时,将消息广播给所有连接到服务器的客户端。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatRoomServer {
    private List<ClientHandler> clients = new ArrayList<>(); // 客户端列表

    public static void main(String[] args) throws IOException {
        // 创建ServerSocket并监听指定端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Socket服务器已启动,监听端口8888...");
        ChatRoomServer chatRoomServer = new ChatRoomServer();

        while (true) {
            // 等待客户端连接
            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接:" + clientSocket.getRemoteSocketAddress());

            // 处理客户端请求
            ClientHandler clientHandler = chatRoomServer.new ClientHandler(clientSocket);
            clients.add(clientHandler); // 添加到客户端列表
            clientHandler.start(); // 启动客户端处理线程
        }
    }

    private class ClientHandler extends Thread {
        private Socket clientSocket;
        private InputStream inputStream;
        private OutputStream outputStream;
        private String nickname; // 客户端昵称

        public ClientHandler(Socket clientSocket) throws IOException {
            this.clientSocket = clientSocket;
            inputStream = clientSocket.getInputStream();
            outputStream = clientSocket.getOutputStream();
        }

        @Override
        public void run() {
            try {
                // 接收客户端昵称
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);
                nickname = new String(buffer, 0, len, "UTF-8");
                broadcast(nickname + "加入了聊天室\n"); // 广播消息

                while (true) {
                    // 读取客户端发送的消息
                    len = inputStream.read(buffer);
                    String message = new String(buffer, 0, len, "UTF-8");
                    if ("exit".equals(message)) {
                        broadcast(nickname + "离开了聊天室\n"); // 广播消息
                        clients.remove(this); // 从客户端列表中移除
                        clientSocket.close(); // 关闭客户端连接
                        System.out.println("客户端已断开连接:" + clientSocket.getRemoteSocketAddress());
                        break;
                    }
                    broadcast(nickname + ":" + message); // 广播消息
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void broadcast(String message) throws IOException {
            System.out.println(message);
            for (ClientHandler client : clients) { // 遍历客户端列表广播消息
                if (client != this) {
                    client.outputStream.write(message.getBytes("UTF-8"));
                    client.outputStream.flush();
                }
            }
        }
    }
}
  1. 运行聊天室服务器

同样的,在命令行中进入到代码所在的目录,使用以下命令编译并运行Java程序:

javac ChatRoomServer.java
java ChatRoomServer

此时,聊天室服务器已经启动并在监听端口8888接收客户端的连接。同样可以使用telnet命令模拟多个客户端连接到服务器,并在聊天室中互相通信。

以上就是Java搭建一个Socket服务器响应多用户访问的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java搭建一个Socket服务器响应多用户访问 - Python技术站

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

相关文章

  • jQWidgets jqxRadioButton hasThreeStates属性

    以下是关于 jQWidgets jqxRadioButton 组件中 hasThreeStates 属性的详细攻略。 jQWidgets jqxRadioButton hasThreeStates 属性 jQWidgets jqxRadioButton 组件的 hasThreeStates 属性用于定单选按钮是否具有三种状态。 语法 // 设置单选按钮是否具…

    jquery 2023年5月12日
    00
  • jQuery实现的简单拖拽功能示例【测试可用】

    下面是“jQuery实现的简单拖拽功能示例【测试可用】”的完整攻略。 一、示例说明 该示例通过使用 jQuery 配合 HTML 和 CSS ,实现了简单的拖拽功能,即将鼠标按下的元素拖动到指定区域。该示例包含两个实现方式,分别为: 拖拽一个固定在页面中央的方块到指定区域。 拖拽一个动态生成的方块到指定区域,该方块可以无限创建和拖拽。 二、实现步骤 1. 准…

    jquery 2023年5月27日
    00
  • mui上拉加载更多下拉刷新数据的封装过程

    我会按照以下几个步骤详细讲解“mui上拉加载更多下拉刷新数据的封装过程”。 1. 引入mui的基础样式和相关js文件,创建页面html结构 首先,在你的项目中引入mui的基础样式文件mui.css,以及mui.js和mui.pullToRefresh.js两个js插件文件。然后,你需要创建一个页面的html结构,包括一个用于展示数据的列表,并在页面底部添加一…

    jquery 2023年5月27日
    00
  • 使用Dform和jQuery动态地创建一个表单

    使用Dform和jQuery动态地创建一个表单可以让我们更加灵活地控制表单的创建与修改。以下是实现方式的详细攻略。 1. 安装Dform和jQuery 在使用Dform和jQuery之前,需要安装这两个库。可以通过CDN获取,也可以将这两个库下载到本地。 <!– 引入jQuery –> <script src="https:/…

    jquery 2023年5月13日
    00
  • jQuery Mobile页面创建事件

    下面是有关“jQuery Mobile页面创建事件”的完整攻略。 1. 什么是jQuery Mobile页面创建事件 在jQuery Mobile中,页面创建事件是在页面创建时触发的事件,可以在此事件中执行一些初始化操作,如绑定事件、设置样式等。 2. 如何绑定页面创建事件 可以使用pagecreate事件来绑定页面创建事件,该事件可以在页面的任何元素上绑定…

    jquery 2023年5月12日
    00
  • 无限树Jquery插件zTree的常用功能特性总结

    无限树Jquery插件zTree的常用功能特性总结 zTree是一个基于jquery的树插件,提供了丰富的功能,适合各种web应用场景。以下是zTree的常用功能特性总结。 1. zTree的基本用法 <div id="treeDemo" class="ztree"></div> var zNo…

    jquery 2023年5月28日
    00
  • jQWidgets jqxKnob allowValueChangeOnMouseWheel属性

    jQWidgets jqxKnob allowValueChangeOnMouseWheel属性攻略 jQWidgets 是一个基于 jQuery 的 UI 组件库,提供了丰富的 UI 组件和工具,可于创建现代化 Web 应用程序。 jqxKnob旋钮组件,用于可视化调整数值。攻略将详细介绍 jqxKn 的 allowValueChangeOnMouseWh…

    jquery 2023年5月10日
    00
  • jQWidgets jqxTabs getContentAt()方法

    下面我将为您详细讲解“jQWidgets jqxTabs getContentAt()方法”的完整攻略。 什么是getContentAt()方法 在jQWidgets中,jqxTabs是一个用于创建标签页的插件,可以用来切换不同的内容。而getContentAt()方法是jqxTabs插件中的一个方法,用于获取指定页面的内容。 使用方式 getContent…

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