Я создал простой класс сервера и простой класс клиента. У меня есть две клиентские программы, которые подключаются к серверу. Класс клиента и сервера может отправлять и получать сообщения.
Проблема заключается в том, что когда оба клиента подключаются к серверу, один из клиентов может отправлять на сервер несколько сообщений, тогда как другой клиент может отправлять только одно сообщение на сервер.
Здесь конструктор для моего класса сервера:
public MyServer () {
setUpConnection ();
}
Вот код, который подключает клиента к порту:
public void setUpConnection () {
clientOutputStreams = new ArrayList ();
try {
serverSocket = new ServerSocket (5000);
while (true) {
Socket clientSocket = serverSocket.accept ();
printWriter = new PrintWriter (clientSocket.getOutputStream ());
clientOutputStreams.add (printWriter);
Thread thread = new Thread (new clientHandler (clientSocket));
thread.start();
System.out.println ("Client is connected to server");
}
} catch (Exception e) {
e.printStackTrace ();
}
}
Это код, который отправляет сообщения, полученные сервером на другие клиенты:
public void tell everyone (String message) {
Iterator outputObject = clientOutputStreams.iterator();
while (outputObject.hasNext()) {
try {
PrintWriter writer = (PrintWriter) outputObject.next();
writer.println (message);
writer.flush ();
} catch (Exception e) {
e.printStackTrace ();
}
}
}
Этот код выполняется в отдельном потоке, который прослушивает сообщения, отправленные клиентами:
public class clientHandler implements Runnable {
Socket clientSocket;
public clientHandler (Socket socket) {
try {
clientSocket = socket;
isr = new InputStreamReader (clientSocket.getInputStream());
reader = new BufferedReader (isr);
} catch (Exception e) {
e.printStackTrace ();
}
}
public void run () {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println ("I recieved message: " + message);
tellEveryone (message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Вот конструктор для моего класса клиента:
public MyClient() {
initComponents();
setUpConnection ();
Thread thread = new Thread (new recievingMessages ());
thread.start ();
jtaRec.setEditable (false);
jtfSend.addFocusListener (this);
jtfSend.requestFocus();
}
Вот код, который запускается, когда клиент нажимает кнопку отправки:
private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
writer.println (jtfSend.getText ());
System.out.println (jtfSend.getText ());
writer.flush ();
System.out.println ("message has sent");
} catch (Exception e) {
e.printStackTrace ();
}//CLOSE CATCH STATEMENT
jtfSend.setText ("");
jtfSend.requestFocus();
}
Вот код, который соединяет клиента с сервером:
public void setUpConnection () {
try {
socket = new Socket ("127.0.0.1", 5000);
writer = new PrintWriter (socket.getOutputStream ());
stream = new InputStreamReader (socket.getInputStream ());
reader = new BufferedReader (stream);
System.out.println ("Connection Made");
} catch (Exception e) {
e.printStackTrace ();
}
}
Вот код запускается в отдельном потоке и прослушивает сообщения, отправленные сервером:
public class recievingMessages implements Runnable {
public void run () {
String message;
try {
while ((message = reader.readLine ()) != null) {
jtaRec.append (message + "\n");
System.out.println ("I recieved the message" + " " + message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Я пытался найти решение, но я просто не понимаю, почему один клиент может отправить только одно сообщение, в то время как другой клиент может отправлять несколько сообщений, даже если обе программы используют один и тот же класс.