Многопоточный сервер, который является клиентом для другого сервера

Я использую сокет сервера для приема клиентов в основном потоке, когда поток принимается, сокет клиентов передается обработчику, который запускается в новом потоке для обработки сообщений. Однако перед тем, как я запускаю свой сервер для доступа к клиентам, он подключается ко второму серверу, который он должен перечислить, чтобы иметь возможность отвечать и передавать сообщения, которые он получает своим клиентам.

Надеюсь, это изображение иллюстрирует то, что я имею в виду:

Изображение клиент-сервер клиент-модель

Маленький сервер должен постоянно прослушивать ввод с большого сервера, а также иметь возможность выводить ответы.

//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) {
            }
        }
    }
}

Из вышесказанного может ли кто-нибудь понять, почему клиент большого сервера не отвечает на большой сервер при отправке сообщения? Я предполагаю, что это связано с тем, что основной поток блокирует второй поток, но я не уверен... Любая помощь будет принята с благодарностью.

1 ответ

Вы потеряли меня в своем коде...
Упростите это.
Ваш smallServer (см. соглашения об именах классов) должны иметь постоянную связь с BigServer (фактически это BigServer клиент) - вы можете реализовать это в своем smallServer класс, он должен подключиться (один раз) и открыть ввод / вывод для BigServer (один раз) и закройте все, как только соединение разорвано.
Как твой smallServer будет обрабатывать несколько клиентов и передавать их запросы BigServer нет гарантии заказа BigServer ответы - вы должны что-то сделать для этого (возможно, передать UUID с запросами?)
Упростите свой smallServer и убедитесь, что он работает...

Другие вопросы по тегам