Я пишу простое приложение для программирования сокетов, которое использует сервер и один клиент. Я пытаюсь запустить поток (из клиентского файла), который считывает ввод из входного потока сокета, чтобы я мог писать сообщения на сервер, читать их обратно и одновременно выводить на экран. Однако когда я запускаю свой код, мой код застревает на
message = in.readLine();
В InputReader.java file
и не читает ввода?
Мой код выглядит следующим образом, пожалуйста, помогите.
SimpleServer1.java
public class SimpleServer1 {
public static void main(String args[]){
int portNumber = Integer.parseInt(args[0]);
ServerSocket serverSocket = null;
Socket clientConnection = null;
try{
//setup sockets
serverSocket = new ServerSocket(portNumber);
clientConnection = serverSocket.accept();
System.out.println("Connected to" + clientConnection.getInetAddress());
//setup streams
BufferedReader in = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
PrintWriter out = new PrintWriter(clientConnection.getOutputStream());
out.flush();
//read input from stream
String message;
while((message = in.readLine()) != null){
//return message to client
out.println("Echo: " + message);
System.out.println(clientConnection.getInetAddress() + ": " + message);
if (message.equalsIgnoreCase("bye")){
System.out.println("Closing connection...");
break;
}
}
//close streams
out.close();
in.close();
clientConnection.close();
}catch(Exception e){
e.printStackTrace();
}
}
SimpleClient1.java
public class SimpleClient1{
public static void main(String args[]){
String hostName = (args[0]);
int portNumber = Integer.parseInt(args[1]);
try{
Socket serverConnection = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(serverConnection.getOutputStream(), true);
out.flush();
Thread listener = new Thread(new InputReader(serverConnection));
listener.start();
Scanner keyboard = new Scanner(System.in);
String userInput;
while((userInput = keyboard.nextLine()) != null){
out.println(userInput);
if (userInput.equalsIgnoreCase("bye")){
break;
}
}
//closing streams
out.close();
serverConnection.close();
}catch(Exception e){
e.printStackTrace();
}
}
InputReader.java <- с чем я пытаюсь запустить свой поток
public class InputReader implements Runnable{
private Socket serverConnection;
private BufferedReader in;
public InputReader(Socket socket){
serverConnection = socket;
try{
in = new BufferedReader(new InputStreamReader(serverConnection.getInputStream()));
}catch(IOException ioE){ioE.printStackTrace();}
}
@Override
public void run() {
try{
String message;
while(true){
System.out.println("done");
message = in.readLine();
System.out.println(message);
}
}catch(IOException ioE){ioE.printStackTrace();}
}
В конечном итоге я хотел бы как читать, так и писать из потоков сокетов с помощью потоков.
Заранее спасибо :)
Cobezz
2 ответа
Я считаю, что вам нужно очистить поток, в который вы пишете, после того, как вы написали в него. Кажется, вы сбрасываете поток сразу после его создания, что не даст никакого эффекта.
В SimpleServer1.java вы должны добавить out.flush ();
While ((message = in.readLine ())! = null) {
Out.println ("Эхо:" + сообщение);
out.flush ();
System.out.println (clientConnection.getInetAddress () + ":" + сообщение);
If (message.equalsIgnoreCase ("пока")) {
System.out.println ("Закрытие соединения ...");
Перемена;
}
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.