【问题标题】:MultiThreaded Server, which is a client to another server多线程服务器,它是另一个服务器的客户端
【发布时间】:2014-03-09 13:13:10
【问题描述】:

我正在使用服务器套接字在主线程上接受客户端,当一个线程被接受时,客户端套接字被提供给一个处理程序,该处理程序在一个新线程中启动以处理通信。但是,在我开始运行我的服务器以访问客户端之前,它会连接到第二台服务器,它必须列出并能够响应并将它收到的消息传递给它的客户端。

希望这张图片能说明我的意思:

小服务器必须不断地监听来自大服务器的输入,并且能够输出响应。

//Default constructor
private smallServer(){}

//method to initialise and start the server
public static void StartServer(int port) throws IOException {
    smallServer ss = new smallServer();
    ss.bs= new bigServerClient(ss);
    Thread nsc_Thread = new Thread(ss.bsc);
    bsc_Thread.start();
    //accepts clients and starts new thread for them
    ss.ServerRun(port);
        }

private void ServerRun(int port) throws IOException {
    ServerSocket server = new ServerSocket(port);
    server.setSoTimeout(50);
    while (run) {
        Socket client = null;
        try {
            client = server.accept();
        } catch (SocketTimeoutException e) {
        }

        if (client != null) {
            ClientHandler handler = new ClientHandler(client, this);
            Thread handleThread = new Thread(handler);
            handleThread.start();
        }
    }

    if (!run) {
        synchronized (ClientHandler.handlers) {
            for (ClientHandler handler : ClientHandler.handlers) {
                handler.terminateHandler();
            }
        }
        System.exit(0);
    }
}

public void processBigServerCommand(String toProcess) {
    System.out.println("RESEAVED: " + toProcess);
}

大服务器客户端(在小服务器上)然后这样做:

public class bigServerClient implements Runnable {

    private smalsServer ss;
    private PrintWriter printer;
    private BufferedReader reader;
    private Socket socket;

    public bigServerClient(smallServer _ss) throws IOException {
        ss = _ss;
        socket = new Socket("Localhost", 5000);
        printer = new PrintWriter(socket.getOutputStream());
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        printer.flush();
        SendBigServerMessage("Starting String");
    }

    private void SendBigServerMessage(String toSend) {
        printer.print(toSend);
        printer.flush();
    }

    @Override
    public void run() {
        try {
            while (ss.state()) {
                String inputLine;
                while ((inputLine = reader.readLine()) != null) {
                    ss.processBigServerCommand(inputLine);
                    System.out.println(inputLine);
                }
            }
        } catch (IOException e) {
        } finally {
            try {
                socket.close();
            } catch (IOException ex) {
            }
        }
    }
}

从以上内容,任何人都可以看出为什么大型服务器客户端在发送消息时没有响应大型服务器?我猜这与阻塞第二个线程的主线程有关,但我不确定......任何帮助将不胜感激。

【问题讨论】:

  • smallserver 的代码是什么?
  • 哎呀!忘记了,我已经在上面添加了。 :)

标签: java multithreading sockets client java-server


【解决方案1】:

你在你的代码中迷失了我......
简化它。
您的smallServer(参见类名约定)应该与BigServer(实际上是BigServer 客户端)具有持久连接-您可以在smallServer 类中实现它,它应该连接(一次)并打开I/O到BigServer(一次)并在连接终止后关闭所有内容。
由于您的smallServer 将处理多个客户端并将他们的请求传递给BigServer,因此无法保证BigServer 响应的顺序 - 您应该采取一些措施来处理这个问题(也许通过请求传递 UUID?)
简化您的 smallServer 并确保它运行...

【讨论】:

  • 是的,我自己觉得这太复杂了,但这正是我设法将它破解的方式。我让小型服务器对所有客户端都像服务器一样工作,但是在这样做的同时,我似乎无法让它与大型服务器通信,我不太担心在客户端之间传递消息和大服务器,我只需要小服务器能够与客户端和大服务器交谈(对不起名字,我应该称它们为底部中间和顶部:P
  • 重新编辑您的代码并添加缺失的方法。 SmallServer 也应该实现 Runnable,ClientHandler 也应该实现。确保代码编译并且它应该运行,没有明显的问题应该阻止它运行......
猜你喜欢
  • 1970-01-01
  • 2014-12-21
  • 2011-04-28
  • 1970-01-01
  • 2017-10-10
  • 2019-05-17
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多