Привет, сообщество stackoverflow,Связь с сервером Java Server кажется застрявшей
Я застрял в проблеме связи сокетов в Java.
Вот пример кода моего сервера и клиента класса:
Сервер:
public class OTPServer {
static ServerSocket serverSocket;
final static int PORT = 4242;
static Socket clientConnection;
public static void main(String[] args) {
try {
serverSocket = new ServerSocket(PORT);
System.out.println("Socket initialized");
String serverMessage = "Hello, I am the Host";
ServerTool serverTool = new ServerTool();
while (true) {
clientConnection = serverSocket.accept();
if(clientConnection.isConnected()) {
System.out.println("Client connected");
}
BufferedReader clientInputReader = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
DataOutputStream serverOutput = new DataOutputStream(clientConnection.getOutputStream());
System.out.println("Sending message to client: " + serverMessage);
serverOutput.writeBytes(serverTool.encodeMessage(serverMessage));
serverOutput.flush();
String clientMessage = clientInputReader.readLine();
System.out.println("Encoded answer from client: " + clientMessage);
String decodedMessage = serverTool.decodeMessage(clientMessage);
System.out.println("Decoded answer from client: " + decodedMessage);
serverOutput.close();
clientInputReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Hello, I am the OTP Server!");
}
Вот Клиент:
public class OTPClient {
static Socket clientSocket;
final static int PORT = 4242;
final static String HOST = "localhost";
public static void main(String[] args) {
System.out.println("I am the OTP Client!");
String serverMessage;
String clientResponse = "I am the Client";
OTPTool otpTool = new OTPTool();
try {
clientSocket = new Socket(HOST, PORT);
BufferedReader serverInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream outputStream = new DataOutputStream(clientSocket.getOutputStream());
System.out.println("Connection to Host established");
serverMessage = serverInput.readLine();
System.out.println("Encoded Message from Server: " + serverMessage);
String decodedMessage = otpTool.decodeMessage(serverMessage);
System.out.println("Decoded message from Server: " + decodedMessage);
System.out.println("Answering with own message: " + clientResponse);
outputStream.writeBytes(clientResponse);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Теперь, когда моя проблема:
Соединение устанавливается, и Сервер, кажется, отправляет свое сообщение клиенту и ждет ответ. Клиент не распечатывает сообщение, полученное с сервера. Как только я отменяю сервер, клиент печатает сообщение, которое он получает с сервера, а также информацию, что ответ отправляет конечные выходы с кодом выхода 0, поэтому кажется, что эта часть в порядке, она просто застряла как-то. Я уже пытался очистить выходной поток, как вы видите в приведенном примере кода.
Есть ли что-то очевидное, пропавшее без вести? Я знаю, это действительно базовый материал, но его первый раз, используя сокеты для общения.
Спасибо заранее!
С наилучшими пожеланиями, Ronny
Btw: я знаю, что сервер подключается только к одному клиенту запрашивает соединение. Это абсолютно для моего использования.
Определенно проблема взаимоблокировки/параллелизма. В каком порядке вы запускаете каждый из этих классов? – vontell
Вы вызываете readLine. Является ли ваш 'serverTool.encodeMessage', включая разрыв строки в конце сообщения? –
@BrettOkken в момент, когда 'serverTool.encodeMessage' возвращает строку параметров. @ vontell сначала я запускаю сервер, а затем клиент, который не должен быть проблемой, так как сервер ждет от клиента подключения к нему. – LongRon