簡體   English   中英

Java服務器套接字,從DataInputStream讀取內容

[英]Java server Socket, reading content from DataInputStream

因此,我已經建立了基本的客戶端/服務器連接,並且嘗試通過連接向彼此發送消息,我讓客戶端從服務器接收消息,但是服務器未收到客戶端消息。 這是我當前用於從客戶端讀取發送的數據的代碼:

ServerThread.socket = new ServerSocket(5556);
Socket client = ServerThread.socket.accept();
DataInputStream in = new DataInputStream
    (
        new BufferedInputStream(client.getInputStream())
    );
String s = in.readUTF();
System.out.println("Client: " + s);

使用它不會打印出任何內容,甚至不只是'Client:'

這是我的客戶端連接並發送消息的代碼。 注意:我在VB中編寫了這一部分:

client = New TcpClient()
client.Connect("myiphere", 5556)
Dim stream As NetworkStream = client.GetStream()
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Hello server")
stream.Write(sendBytes, 0, sendBytes.Length)

有什么理由不能接收數據? 還是為什么要推遲呢? 我嘗試用try catch塊替代代碼的Java部分,但沒有發出錯誤。

任何幫助將不勝感激。

DataInputStream中的UTF 前綴為0和長度。

我對VB的工作還不多,所以我不知道是否還有其他錯誤,但是請嘗試:

 
 
 
  
  stream.Write(0, sendBytes.Length, sendBytes)
 
  

我不應該使用我不知道的語言來建議代碼。 如果要使用readUTF進行讀取,則必須先發送一個0字節和一個等於字符串長度的字節,然后再發送文本字節。

編輯:您實際上可能根本不想使用DataInputStream。 它用於存儲二進制流。 如果您正在接收文本,請在Java方面嘗試以下操作:

BufferedReader in = new BufferedReader(
    new InputStreamReader(
        client.getInputStream()
    )
);
String s = in.readLine();

如果您不發送文本,則只需像創建一個BufferedInputStream一樣,然后讀取其中的字節即可。

作為maybeWeCouldStealAVan指出, readUTF需要兩個字節表示要多的內容的字節有。 有關詳細信息,請參見http://docs.oracle.com/javase/6/docs/api/java/io/DataInput.html#readUTF ()。

但是,他/她使用InputStreamReader解決方案不起作用,因為InputStreamReader期望輸入UTF-16(每個字符兩個字節),但是您的VB客戶端正在發送ascii。 如果可以的話,我建議讓您的VB客戶端發送UTF-16(然后使用也許WeCouldStealAVan的Java代碼)。 如果您不能這樣做(對不起,我不知道VB允許什么編碼),那么只需編寫使readUTF正常工作所需的額外兩個字節。

暫無
暫無

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

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