[英]TCP Client/Server in one class
我試圖同時編寫一個既是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: '
為什么我無法讀取輸入流?
可變socket
依次指向兩個不同的Socket
對象:首先,有一個您作為服務器客戶端創建的對象。 其次,有一個ServerSocket
返回的值,該值已連接到客戶端。 當您創建第二個時,您將放棄對第一個的引用。 但是,當您將數據打印到其中一個插槽時,它將顯示在另一個插槽上。 由於您僅引用了兩個套接字之一,因此您將永遠無法觀察到接收到的數據。
如果您要在同一進程中擁有一個客戶端和一個服務器,並且彼此交談,那么您確實需要使用單獨的線程。 通常,在像這樣的簡單程序中,服務器部分會創建一個新的線程來為每個連接提供服務。 在這里可以很好地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.