簡體   English   中英

一個應用程序中的Server和ServerSocket:不起作用

[英]Server and ServerSocket in one Application: not working

我試圖編寫一個小程序,打開服務器,創建連接到該服務器並從中接收消息的客戶端。

到目前為止,這是《守則》

public static void main(String[] args) {
final ServerSocket serverSocket;
try {
    serverSocket = new ServerSocket(12345);
    Thread t = new Thread(){
        public void run(){
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String message = reader.readLine();

        System.out.println("Received " + message);
    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

如果我運行程序,它將一直在readLine()中等待-因此很明顯,客戶端不會從服務器收到消息。 有誰知道為什么這行不通?

您的閱讀線程正在等待數據流中的換行符。 只需更改服務器即可使用:

writer.write("Hello World\r\n");

您將獲得預期的結果。 或者,您可以只關閉服務器套接字,然后當readLine到達數據流的末尾時將返回它。

您應該將readline放入循環中,如下所示:

public static void main(String[] args) {
    final ServerSocket serverSocket;
    try {
        serverSocket = new ServerSocket(12345);
        Thread t = new Thread() {
            public void run() {
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            // Check this --------------------------------------------------->
            String message = null;
            while ((message = in.readLine()) != null) {   
                    System.out.println("Received " + message);
                    break; //This break will exit the loop when the first message is sent by the server
            }

    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

您可以閱讀該文檔以獲取進一步的說明: http : //download.oracle.com/javase/tutorial/networking/sockets/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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