Я пытаюсь сделать так, чтобы клиент и сервер правильно отображали сообщения.
Это означает, что клиент должен отправить сообщение серверу, сервер должен получить и отправить одно и то же сообщение обратно клиенту, а затем клиент распечатает полученное сообщение.
У меня возникли проблемы с тем, чтобы клиент правильно дождался, пока сервер закончит отправку ответа, прежде чем клиент получит его и распечатает.
Единственный способ, которым это работает, - это когда я комментирую код EchoClient2.java RECEIVE MESSAGE.
EchoClient2.java
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class EchoClient2 {
private Socket clientSocket;
private DataOutputStream out;
private DataInputStream in;
private void start(String ip, int port) {
try {
clientSocket = new Socket(ip, port);
out = new DataOutputStream(clientSocket.getOutputStream());
in = new DataInputStream(clientSocket.getInputStream());
} catch (IOException e) {
System.out.println("Error when initializing connection");
}
}
private void sendMessage(String message) throws IOException {
//SENDING MESSAGE
byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
System.out.println("Client will send the text: " + message);
out.write(messageBytes);
out.flush();
//RECEIEVE MESSAGE - Doesn't give server a chance to respond?
byte[] data = new byte[8];
ByteArrayOutputStream getData = new ByteArrayOutputStream();
int numBytes;
while ((numBytes = in.read(data)) != -1) {
getData.write(data, 0, numBytes);
}
byte[] message2Bytes = getData.toByteArray();
String text = new String(message2Bytes, StandardCharsets.UTF_8);
System.out.println("Server sent the client text: " + text);
}
private void stop() {
try {
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
System.out.println("error when closing");
}
}
public static void main(String[] args) throws IOException {
EchoClient2 client = new EchoClient2();
client.start("127.0.0.1", 4444);
client.sendMessage("exit");
client.stop();
}
}
EchoServer2.java
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.io.*;
public class EchoServer2 {
private ServerSocket serverSocket;
private Socket clientSocket;
private DataOutputStream out;
private DataInputStream in;
public void start(int port) {
try {
serverSocket = new ServerSocket(port);
clientSocket = serverSocket.accept();
out = new DataOutputStream(clientSocket.getOutputStream());
in = new DataInputStream(clientSocket.getInputStream());
} catch (IOException e) {
System.out.println("Error when establishing/accepting server connection");
}
}
private void actionMessage() throws IOException {
//RECEIEVE MESSAGE
byte[] data = new byte[8];
ByteArrayOutputStream getData = new ByteArrayOutputStream();
int numBytes;
while ((numBytes = in.read(data)) != -1) {
getData.write(data, 0, numBytes);
}
byte[] messageBytes = getData.toByteArray();
String text = new String(messageBytes, StandardCharsets.UTF_8);
System.out.println("Server got " + text + " and will send this back to client");
//SENDING BACK SAME MESSAGE
out.write(messageBytes);
out.flush();
}
public void stop() {
try {
in.close();
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws IOException {
EchoServer2 server = new EchoServer2();
System.out.println("Now waiting for incoming connection...");
server.start(4444);
server.actionMessage();
server.stop();
}
}
Кто-нибудь знает, почему это не работает должным образом?
exit
не имеет смысла, ее можно заменить любой другой строкой. - person CHOCO BLOCK   schedule 07.10.2020