Java Socket套接字如何处理并发连接

发布时间:2025-05-27 06:44:49 作者:小樊
来源:亿速云 阅读:98

在Java中,使用Socket套接字处理并发连接通常有两种方法:多线程和NIO(非阻塞I/O)。下面分别介绍这两种方法的实现。

  1. 多线程方法:

在这种方法中,为每个客户端连接创建一个新的线程。当客户端连接到服务器时,服务器将创建一个新的线程来处理该连接。这种方法简单易实现,但在大量并发连接的情况下可能会导致性能问题。

示例代码:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server started on port 8888");

        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("New client connected");

            Thread thread = new Thread(new ClientHandler(socket));
            thread.start();
        }
    }
}

class ClientHandler implements Runnable {
    private Socket socket;

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));

            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);

            String message;
            while ((message = reader.readLine()) != null) {
                System.out.println("Received message: " + message);
                writer.println("Server response: " + message);
            }

            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. NIO(非阻塞I/O)方法:

NIO提供了更高效的I/O操作方式,可以在单个线程中处理多个并发连接。这种方法使用Selector和Channel对象来实现。Selector用于检查多个Channel的状态(例如,是否有数据可读或可写),从而实现非阻塞I/O操作。

示例代码:

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;

public class NIOServer {
    public static void main(String[] args) throws IOException {
        Selector selector = Selector.open();
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8888));
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        System.out.println("Server started on port 8888");

        while (true) {
            selector.select();
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectedKeys.iterator();

            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();

                if (key.isAcceptable()) {
                    handleAccept(key, selector);
                } else if (key.isReadable()) {
                    handleRead(key);
                }

                iterator.remove();
            }
        }
    }

    private static void handleAccept(SelectionKey key, Selector selector) throws IOException {
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
        SocketChannel socketChannel = serverSocketChannel.accept();
        socketChannel.configureBlocking(false);
        socketChannel.register(selector, SelectionKey.OP_READ);
        System.out.println("New client connected");
    }

    private static void handleRead(SelectionKey key) throws IOException {
        SocketChannel socketChannel = (SocketChannel) key.channel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        int bytesRead = socketChannel.read(buffer);

        if (bytesRead > 0) {
            buffer.flip();
            String message = new String(buffer.array(), 0, bytesRead);
            System.out.println("Received message: " + message);

            ByteBuffer responseBuffer = ByteBuffer.wrap(("Server response: " + message).getBytes());
            socketChannel.write(responseBuffer);
        } else if (bytesRead < 0) {
            socketChannel.close();
        }
    }
}

这两种方法都可以实现Java Socket套接字处理并发连接。多线程方法适用于连接数较少且每个连接的处理时间较长的场景;而NIO方法适用于连接数较多且每个连接的处理时间较短的场景。

推荐阅读:
  1. 12.4-全栈Java笔记:Java网络编程(二)
  2. java 网络编程之TCP通信和简单的文件上传功能实例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:ListView组件在OpenHarmony中怎样定制

下一篇:ListView组件在OpenHarmony里怎么交互

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》