Java使代理套接字多线程

标签 java multithreading sockets proxy

我已经构建了一个 java 代理,它可以工作,但只允许 1 个客户端。我知道我需要进行多线程处理,这就是我这样做的原因,这样它会打开新线程,但由于某种原因我无法让它工作......

这是我的代理类:

public class Proxy {

    private static ServerSocket server;
    private static int port = 9339;
    private static String originalHost = "game.boombeachgame.com";

    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("INFO: Proxy started");
        new Thread(new Runnable() {

            @Override
            public void run() {
                Proxy.startThread();
            }

        }).start();
    }

    public static void startThread() {
        try {
            server = new ServerSocket(port);
            Socket clientSocket = server.accept();
            new Thread(new Server(originalHost)).start();
            new Thread(new Client(clientSocket)).start();
        } catch (Exception e) {
            System.out.println(e);
        }
    }


}

最佳答案

您需要的是一个运行循环的线程,该循环通过调用 ServerSocket 上的 accept() 方法来检查服务器套接字是否有新连接。对于每个连接,您需要生成一个线程来处理该连接。

您的代码实际做的是检查服务器套接字是否有新连接,通过调用 accept(),恰好一次。然后,您正确地产生了一个客户端线程来处理该连接。但是,您再也不会调用 accept() 了。这就是您的代码有效的原因,但仅适用于一个客户。您还为“服务器”对象生成了一个线程;我不确定这是否合适。

您需要更改的是在循环中运行“server.accept()”语句和关联的线程生成。您还需要确保正确处理线程,以便不同的连接不会最终使用彼此的数据。这可能需要以某种适当的方式连接您的“服务器”对象和“客户端”对象。

关于Java使代理套接字多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30829110/

相关文章:

java - Flex 或 Actionscript 中的 Java 语法荧光笔

c# - 在不阻塞的情况下防止一个线程上出现多个 MessageBox

java - 同步块(synchronized block)是否会触发数组的完整内存栅栏?

node.js - nginx tcp SYN 数据包未收到 ACK

java - 我可以设置默认的全局 Java 套接字超时吗?

java - 如何使用 IP 地址从另一台机器运行 java 动态 Web 项目

java - 如何使用 S3AsyncClient 从 S3 读取 JSON 文件

java - Android 应用程序关闭而不打开

php - 用于 GCM 和 MySQL 访问的 PHP 套接字是否需要多线程

java - 在客户端/服务器应用程序中阻止 c 中的读取函数