Мне нужно, чтобы несколько клиентов общались с несколькими серверами и обрабатывали ответы от них.
До сих пор мне удавалось написать серверный код, который привязывается к нескольким клиентам (создает поток для каждого клиента), а клиент подключается к нескольким серверам.
Место, где я столкнулся с проблемой, находится на стороне клиента - я не могу получать ответы от серверов.
Последовательность операций следующая:
Предположим, у меня есть 2 сервера и 1 клиент. клиент подключается к обоим серверам, отправляет им сообщения, оба сервера получают его и оба отправляют ответ клиенту - я не могу получить этот ответ.
Код сервера -
@Override
public void run() {
try {
// create a serversocket to listen to requests
ServerSocket serverSocket = new ServerSocket(port);
// create n sockets to listen to 5 client
for (int i = 0; i < n; i++) {
Socket socket = serverSocket.accept();
// create a processor thread for each to read and process the incoming Messages
Processor processor = new Processor(socket);
processor.start();
}
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
Процессор в коде сервера -
@Override
public void run() {
try {
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
while (true) {
String str = in.readObject();
System.out.println(message);
out.write("Got your message " + message.toString());
}
} catch (IOException e) {
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Processor completed " );
}
Код клиента -
public static void main(String[] args) throws IOException, InterruptedException {
// make the connections with other nodes
connections = connect();
// connect() creates connections from the client to all servers and stores the socket and out objects in the object called Connections.Code omitted to avoid clutter
// process all the commands
while(!commands.isEmpty()){
for(int i=0 ; i<2; i++){
send(commands.poll() , i);
}
Thread.sleep(500);
}
}
// Sends Message m to the node i
public static synchronized void send(Message m, int i) {
try {
connections.outs[i].writeInt(m.nodeId);
connections.outs[i].writeInt(m.timestamp);
connections.outs[i].writeObject(m.type);
connections.outs[i].writeObject(m.value);
connections.outs[i].flush();
InputStreamReader isr = new InputStreamReader(connections.sockets[i].getInputStream());
final BufferedReader br = new BufferedReader(isr);
new Thread() {
public void run() {
try {
while (true) {
String message = br.readLine();
System.out.println("Message received from the server : " +message);
}
} catch(IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
Я уверен, что делаю что-то не так, когда слушаю сообщение. Любое предложение о том, как получать и обрабатывать сообщения с нескольких серверов, было бы очень полезно.
ТИА
connections.out
- person Grim   schedule 25.03.2017connect()
- person slim   schedule 25.03.2017