進度顯示 從C#客戶端發送一個4字節的消息頭到Java服務器




winform show progress bar (5)

如果你要交換大量的數據,我會建議實現(或發現)一個可以按網絡順序編寫和讀取int的Stream-wrapper。 但是,如果你真的只需要寫這個長度就可以這樣做:

using(Socket socket = ...){
  NetworkStream ns = new NetworkStream(socket);      
  ns.WriteByte((size>>24) & 0xFF);
  ns.WriteByte((size>>16) & 0xFF);
  ns.WriteByte((size>>8)  & 0xFF);
  ns.WriteByte( size      & 0xFF);
  // write the actual message
}

我正在嘗試將C#客戶端寫入用Java編寫的服務器。 服務器需要4個字節(Java中的DataInputStread readInt())消息頭,然後是實際的消息。

我絕對是C#的新手,我怎樣才能把這個消息頭髮送到Java服務器? 我嘗試了幾種方法(主要是試驗和錯誤,沒有深入C#語言),沒有任何工作。 Java端以不正確的(非常大的)消息長度結束。


我不知道C#,但你只需要做相當於這個:

out.write((len >>> 24) & 0xFF);
out.write((len >>> 16) & 0xFF);
out.write((len >>>  8) & 0xFF);
out.write((len >>>  0) & 0xFF);

正如其他海報所指出的那樣,直到排序。

Java DataInputStream期望數據是big-endian (網絡字節順序)。 從Mono文檔(對於BinaryWriter等價物)來看,C#傾向於小端(Win32 / x86的默認值)。

因此,當您使用標準類庫將32位int“1”更改為字節時,它們會產生不同的結果:

//byte hex values
Java: 00 00 00 01
  C#: 01 00 00 00

你可以改變你在C#中編寫整數的方式:

private static void WriteInt(Stream stream, int n) {
    for(int i=3; i>=0; i--)
    {
        int shift = i * 8; //bits to shift
        byte b = (byte) (n >> shift);
        stream.WriteByte(b);
    }
}

編輯:

一個更安全的方法是:

private static void WriteToNetwork(System.IO.BinaryWriter stream, int n) {
    n = System.Net.IPAddress.HostToNetworkOrder(n);
    stream.Write(n);
}

Sysetm.Net.IPAddress類有兩個靜態幫助器方法:HostToNetworkOrder()和NetworkToHostOrder(),為您做轉換。 您可以在流上使用BinaryWriter來寫入適當的值:

using (Socket socket = new Socket())
using (NetworkStream stream = new NetworkStream(socket))
using (BinaryWriter writer = new BinaryWriter(stream))
{
    int myValue = 42;
    writer.Write(IPAddress.HostToNetworkOrder(myValue));
}

正如大家在這裡已經指出的那樣,這個問題很可能是由C#應用程序以little-endian順序發送int而造成的,而Java應用程序則以網絡順序(big-endian)期望它們。 然而,不要在C#應用程序中明確地重新排列字節,正確的方法是依靠內置的函數從主機到網絡順序(htons等)轉換 - 這樣,即使在運行時代碼也能繼續工作在一個大型的機器上。

一般來說,在解決這些問題時,我發現使用netcat或wireshark等工具記錄正確的流量(例如Java到Java)是非常有用的,然後將其與錯誤的流量進行比較,以查看錯誤發生的位置。 作為一個額外的好處,你也可以使用netcat將捕獲/預先錄製的請求注入到服務器中,或將捕獲/預先錄製的響應注入到客戶端。 更不用說,您也可以修改文件中的請求/響應,並在修復代碼之前測試結果。







sockets