#java #sockets
#java #сокеты
Вопрос:
Я пытаюсь создать простую клиент-серверную программу, которая переносит клиента на сервер и возвращает его пользователю, а затем запрашивает у пользователя другой ввод. Проблема в том, что по какой-то причине программа продолжает ждать после первого ввода и при этом даже не отправляет входные данные на сервер. Любая помощь была бы высоко оценена.
СЕРВЕРНЫЙ КОД
import java.util.*;
import java.io.*;
import java.net.*;
public class Server {
public static final String ENDLINE = "rn";
public static void main(String[] args) throws Exception{
try(ServerSocket serverSocket = new ServerSocket(2000)){
System.out.println("Waiting for connection...");
Socket clientConnection = serverSocket.accept();
System.out.println("connection accepted from: " clientConnection.getInetAddress().getHostAddress());
OutputStream clientOutputStream = clientConnection.getOutputStream();
InputStream clientInputStream = clientConnection.getInputStream();
String msg = String.format("Hello: %s tell me something: ", clientConnection.getInetAddress().getHostAddress());
clientOutputStream.write(msg.getBytes());
while(true){
StringBuilder clientMessage = new StringBuilder();
int c = clientInputStream.read();
while(c != -1){
clientMessage.append((char)c);
c = clientInputStream.read();
}
String clientMessageString = String.valueOf(clientMessage);
String returnMsg = String.format("Okay got your message: %s, anything else? ",clientMessageString);
clientOutputStream.flush();
if (clientMessageString.equals("quit")) break;
}clientConnection.close();
}catch(IOException e){ e.printStackTrace(); }
}
}
КЛИЕНТСКИЙ КОД
import java.io.*;
import java.util.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try(Socket clientSocket = new Socket("localhost",2000)){
InputStream inputFromServer = clientSocket.getInputStream();
Reader newRead = new InputStreamReader(inputFromServer);
OutputStream toServer = clientSocket.getOutputStream();
int c = newRead.read();
while(true) {
while (c != -1) {
System.out.print((char) c);
c = newRead.read();
}
Scanner keyboard = new Scanner(System.in);
System.out.println("> ");
String keyboardInput = keyboard.nextLine();
toServer.write(keyboardInput.getBytes());
toServer.flush();
}
}catch(IOException e){e.printStackTrace();}
}
}
Комментарии:
1. Из того, что я вижу, ваша программа застревает, пытаясь получить информацию с сервера.
inputFromServer
Поток никогда не завершается, и клиент просто продолжает блокироватьnewRead.read()
ожидание нового ввода.2. Я думаю, что InputStream блокируется, потому что клиент не отправляет больше date, но сокет все еще открыт. Я думаю, у вас был бы лучший шанс использовать BufferedReader для чтения входных данных.
3. Прочитайте Javadoc для InputStreamReader.read(). «Конец потока» означает, когда он был закрыт. Попробуйте завершить цикл while, когда прочитаете полное сообщение.