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日

相关文章

  • jQuery中数据缓存$.data的用法及源码完全解析

    以下是详细的“jQuery中数据缓存$.data的用法及源码完全解析”的攻略。 什么是数据缓存? jQuery中数据缓存指的是将数据缓存到元素上,使用 $.data() 方法来读取和修改数据。这样的好处是可以节约 DOM 操作,提高性能。数据缓存适用于元素的事件处理、动画效果、Ajax等场景。 jQuery中数据缓存的用法 读取数据 通过标签属性读取 除了使…

    jquery 2023年5月28日
    00
  • jQWidgets jqxDataTable selectionMode属性

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxDataTable,它是用于显示和编辑表格数据的件。jqxDataTable 提供多个属性和,之一是 selectionMode。下面是关于 jqxDataTable 的 selectionMode 属性的详攻略: selectionMod…

    jquery 2023年5月11日
    00
  • 什么是x-tmpl

    x-tmpl是一个在HTML页面中定义script标签类型的属性,用于声明该script标签中存放的内容为一个模板文本。在jQuery的使用中,x-tmpl常常是选择器$()函数返回的DOM元素结果的一个属性。 使用x-tmpl定义的模板,可以用于在不更新整个页面的情况下,动态修改页面的内容。 以下是两个示例: 示例一:使用x-tmpl定义模板 <sc…

    jquery 2023年5月12日
    00
  • jquery简单实现图片切换效果的方法

    当使用 jQuery 时,实现图片切换非常简单。以下是使用 jQuery 简单实现图片切换效果的方法攻略: 步骤一:添加HTML和CSS代码 首先添加一个 HTML 显示图片的标记,可以是 div,span 或 img 元素。每个元素都应具有唯一的 ID 或类。 例如: <div id="slideshow"> <img…

    jquery 2023年5月28日
    00
  • 分享12个实用的jQuery代码片段

    下面是详细的攻略。 分享12个实用的jQuery代码片段 1. 显示/隐藏密码 当需要用户在进行密码输入时,为了避免输入错误,通常要求用户再次确认密码,这时候可以提供一个显示/隐藏密码的按钮,以方便用户查看密码。下面的代码可以实现这一功能。 $("#show-password").click(function() { var type =…

    jquery 2023年5月28日
    00
  • jquery 圆形旋转图片滚动切换效果

    下面我将为你讲解实现“jQuery 圆形旋转图片滚动切换效果”的步骤和示例。 思路分析 1.准备好一个存放图片的容器和导航圆点。 2.对于导航圆点,可以使用 HTML 标签结构模拟,或者使用 CSS 画 circle。 3.图片在容器中使用 HTML 标签 img 插入。 4.为图片容器中的图片添加相同的宽度和高度,使得图片形成一个正方形。 5.使用 jQu…

    jquery 2023年5月19日
    00
  • 如何使用jQuery在一个元素上应用样式

    jQuery是一个流行的JavaScript库,它提供了许多实用的功能,包括在一个元素上应用样式。在本攻略中,我们将详细介绍如何使用jQuery在一个元素上应用样,并提供两个示例来说明它们的用途。 使用css()方法 jQuery的css()方法用于在一个元素上设置CSS属性。它接受一个包含CSS属性和值的对象作为参数,并将这些属性和值用于元素。 以下是一个…

    jquery 2023年5月9日
    00
  • jQWidgets jqxWindow倒塌事件

    当使用jQWidgets jqxWindow插件创建窗口时,有一种情况是当用户尝试拖动窗口到一个不合法的位置时,窗口会出现倒塌的现象。这时候需要通过监听jqxWindow的倒塌事件来进行处理。 以下是jQWidgets jqxWindow倒塌事件的完整攻略: 1. 监听jqxWindow倒塌事件 要监听jqxWindow倒塌事件,需要使用以下代码: $(‘#…

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