簡體   English   中英

Java通過套接字發送和接收多個消息

[英]Java send and receive multiple messages via Socket

我們需要實現一個套接字客戶端,該客戶端應該連接到接受TCP連接的服務器。 如果我通過netcap與服務器通信,我會立即從服務器獲得響應(通過命令行)。

工作流程為:

nc 99.0.99.84 20000

然后我向服務器發送連接請求

*99*0##

我收到了ACK響應

*#*1##

我發送我的請求

*#18*802*86##

我得到回應

*#18*802*86*222241400##*#*1##

通過命令行,一切都很快。

所以我試圖以這種方式與Socket客戶端一起執行此操作

try {

            Socket socket = new Socket("99.0.99.84", 20000);

            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("Start");
            Thread.sleep(1000);
            String connectionRequest ="*99*0##";
            System.out.println("Sending connection request " + connectionRequest);
            out.println(connectionRequest);
            String connResponse = in.readLine();

            System.out.println("Response to connection is " + connResponse);
            Thread.sleep(500);
            String payload ="*#18*802*86##";
            System.out.println("Sending " + payload);
            out.println(payload);
            String response = in.readLine();


            System.out.println("Response is " + response);
            out.close();
            in.close();
            socket.close();

        } catch (UnknownHostException e) {

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

            e.printStackTrace();
        }
    }

使用它時,客戶端會在很長時間內獲取連接響應,然后以response = null退出

Sending connection request*99*0##
Response to connection is *#*1##*#*1##
Sending *#18*802*86##
Response is null

有什么不對?

如您所見: https : //docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()

如果流在到達“ \\ n”或“ \\ r”之類的行尾提要之前已終止,則readLine()將返回null。

就像您的情況一樣,您不發送EOL,然后關閉流,因此返回null。

嘗試在味精的末尾添加“ \\ n”。

希望這可以幫助。

暫無
暫無

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

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