2011-12-10 3 views
0

Я пытаюсь написать программу, которая одновременно является TCP-клиентом и TCP-сервером, для передачи сообщений по распределенной сети. После того, как я смог подключить несколько экземпляров этих программ, я обнаружил, что не смог прочитать их из сокетов. Я упростил реализацию и все еще имею ту же проблему.TCP Client/Server в одном классе

Упрощенный код выглядит следующим образом:

public class Server { 
public static void main(String[] args){ 
    try { 
     ServerSocket ssocket = new ServerSocket(1234); 
     Socket socket = new Socket("localhost", 1234); 
     socket = ssocket.accept(); 

     String data = "Hello World"; 
     PrintWriter out; 
     out = new PrintWriter(socket.getOutputStream(), true); 
     System.out.print("Sending string: '" + data + "'\n"); 
     out.print(data); 
     out.flush(); 

     BufferedReader in = new BufferedReader(new 
       InputStreamReader(((Socket) socket).getInputStream())); 
     System.out.print("Received string: '"); 

     while (!in.ready()) {} 
     System.out.println(in.readLine()); 
     System.out.print("'\n..."); 
     in.close(); 
    } catch (UnknownHostException e2) { 
     e2.printStackTrace(); 
    } catch (IOException e2) { 
     e2.printStackTrace(); 
    } 
} 
} 

При выполнении кода я получаю следующий результат:

Sending string: 'Hello World' 
Received string: ' 

Почему я не могу читать входной поток?

ответ

1

Переменная socket указывает на два разных объекта Socket, в свою очередь: во-первых, есть тот, который вы создаете в качестве клиента на сервере. Во-вторых, есть тот, который возвращает ServerSocket, который подключен к клиенту. Когда вы создаете вторую, вы удаляете свою ссылку на первую. Но когда вы печатаете данные в один из сокетов, он будет отображаться на другом. Поскольку у вас есть только ссылка на один из двух сокетов, вы никогда не сможете наблюдать за полученными данными.

Если вы собираетесь иметь клиент и сервер в одном процессе, разговаривая друг с другом, вам действительно нужно использовать отдельные потоки. Обычно в простых программах, подобных этому, серверная часть создает новый поток, в котором обслуживается каждое соединение. Это будет хорошо работать.

+0

Спасибо, спасибо, я был под интерпретацией, что вам нужен только один сокет между сервером и клиентом, а ServerSocket возвращал тот же сокет. Я попытался реализовать следующее ... Socket Csocket = новое гнездо («localhost», 1234); Socket Ssocket = ssocket.accept(); out = new PrintWriter (Ssocket.getOutputStream(), true); BufferedReader in = new BufferedReader (новый InputStreamReader (((Socket) Csocket) .getInputStream())); И все еще не работает. Я предполагал, что в реальной реализации мне придется использовать потоки, но я думал, что смогу заставить это работать без потоков. – longshorts

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