2011-12-16 3 views
4

Я попытался проверить соединение сокета на Java, но не удалось. Вот мой код (два простых приложений, сервер и клиент):Соединение сокетов Java

public class TestServer { 

public static void main(String args[]) throws IOException { 
    ServerSocket serverSocket = new ServerSocket(1111); 
    System.out.println("Server socket created"); 
    Socket socket = serverSocket.accept(); 
    System.out.println("Socket accepted"); 
    PrintWriter output = new PrintWriter(socket.getOutputStream(), true); 
    System.out.println("Output created"); 
    output.write("Output string"); 
    socket.close(); 
    serverSocket.close();  
} 
} 

public class TestClient { 

public static void main(String args[]) throws IOException { 

    Socket socket = new Socket("127.0.0.1", 1111); 
    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    System.out.println("Input: " + input.readLine()); 
    socket.close(); 

} 

} 

Выход (после запуска сервера, и после этого, клиент):

Server socket created 
Socket accepted 
Output created 
Input: null 

Я никогда не знаю, что это проблема и почему клиент не получил строку, отправленную ему. Буду признателен за любую помощь.

ответ

6

Обычно, когда я использую классы, такие как PrintWriter или OutputStream, мне нужно очистить его содержимое, чтобы отправить данные через сокет или записать его в файл.

+0

Именно в этом и была моя проблема. Благодарю. –

+0

Добро пожаловать! ;) – Felipe

2

input.readLine ожидает ввода строки в строке ввода. Попробуйте заменить output.write на output.println.

Я только что протестировал его, и он должен работать правильно, как это.

+1

Вы имеете в виду 'println'? ;) –

+0

@Peter Lawrey: да, извините, я был в спешке. Должен работать сейчас. – Tudor

1
//Put the line 

output.flush(); 

//in the end of the TestServer.java 

//and in the TestClient.java I have used the code as given below 

Socket socket = new Socket("127.0.0.1", 1111); 
    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    String str; 
    while((str=input.readLine())!=null){ 
     System.out.println("Input: " + str); 
    } 
    socket.close(); 

} 
2

В дополнении ко всем другим комментариям, вы не должны закрывать сам сокет, следует закрыть самый наружный выходной поток, который вы создали вокруг выходного потока сокета. Это будет:

(а) промывка выходного потока (б) закрыть его (с) закрыть входной поток, и (д) закрыть сокет.

Смежные вопросы