Многопоточный сервер, который является клиентом для другого сервера
Я использую сокет сервера для приема клиентов в основном потоке, когда поток принимается, сокет клиентов передается обработчику, который запускается в новом потоке для обработки сообщений. Однако перед тем, как я запускаю свой сервер для доступа к клиентам, он подключается ко второму серверу, который он должен перечислить, чтобы иметь возможность отвечать и передавать сообщения, которые он получает своим клиентам.
Надеюсь, это изображение иллюстрирует то, что я имею в виду:
Маленький сервер должен постоянно прослушивать ввод с большого сервера, а также иметь возможность выводить ответы.
//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
и убедитесь, что он работает...