2011-12-10 59 views
0

我正在嘗試編寫一個既是TCP客戶端又是TCP服務器的程序,以便在分佈式網絡上廣播消息。在我能夠將這些程序的多個實例連接在一起後,我發現我無法從套接字讀取數據。我簡化了實現,但仍然有同樣的問題。一個類中的TCP客戶端/服務器

簡化代碼如下:

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 = new Socket(「localhost」,1234); Socket Ssocket = ssocket.accept(); out = new PrintWriter(Ssocket.getOutputStream(),true); (新的InputStreamReader(((Socket)Csocket).getInputStream())); 而且它仍然不起作用我假設在真正的實現中我將不得不使用線程,但我認爲我應該能夠在沒有線程的情況下使其工作。 – longshorts