[英]Read data from tcp socket published by another tool
一種工具是將數據推送到端口,而Java套接字應該讀取它。 我檢查是否使用Netcat nc -lv ip端口接收到數據
而且我的java代碼讀取數據如下:
ServerSocket server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
Socket socket = server.accept();
System.out.println("Client accepted");
// takes input from the client socket
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
while (true) {
String line = in.readUTF();
System.out.println(line);
}
盡管Netcat命令顯示數據,程序仍將永遠等待請求。 任何幫助是極大的贊賞。
提前致謝
沙克蒂
理想情況是server.accept(); 呼叫將在該端口上等待某些請求。 在服務器端的情況下,應使用Server.accept(),其中您將在某個端口上偵聽,而客戶端將向該端口發出請求。
在您的情況下,您應該從套接字讀取而不是創建服務器套接字。
您可以參考以下鏈接來解決您的目的
https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html
DataInput.readUTF()的約定是,要讀取的字符串的長度包含在前兩個字節中:
首先, 讀取兩個字節,並以與readUnsignedShort方法完全相同的方式來構造一個無符號的16位整數。 此整數值稱為UTF長度,它指定要讀取的其他字節數 。
如果您的其他工具沒有以完全相同的方式對UTF數據字符串進行編碼,則您的服務器很可能會將發送的數據的第一個字節誤解為要讀取的數據長度,而只是掛起等待剩余的數據數據到達。
例如,假設您的工具發送了以ASCII編碼的字符串“ Hello World”。 以十六進制表示
48 65 6C 6C 6F 20 57 6F 72 6C 64
您的服務器接收到數據,並且DataInput類根據合同開始將其解碼為UTF8。 前兩個字節讀取為無符號的short:
utf_length = (((48 & 0xff) << 8) | (65 & 0xff))
產生的長度為18533字節。 一旦讀取了流的剩余9個字節,服務器將簡單地阻塞以等待剩余的18524個字節到達,因為這正是預期的結果。 我的猜測是這就是您的程序只是掛起的原因。
由於您沒有說明客戶端工具是什么,也不是客戶端工具如何對您正在讀取的數據進行編碼,因此很難知道這是不是原因。
如果這不是正確的答案,請使用其他詳細信息甚至是可能對將來的訪問者有所幫助的測試數據來更新您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.