簡體   English   中英

一類的TCP客戶端/服務器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM