0

Windows で TCP ソケットを使用したサーバーとクライアントの通信を作成し、正常に動作しましたが、クライアント側を Windows Phone に移植しようとしていますが、データの受信で本当に行き詰まっています。私は StreamSocket を使用しているため、データの長さを知る必要があります。例えば:

DataReader dataReader = new DataReader(clientSocket.InputStream);

uint bytesRead = 0;

bytesRead = await dataReader.LoadAsync(SizeOfTheData); // Here i should write the size of data, but how can I get it? 

if (bytesRead == 0)
    return;

byte[] data = new byte[bytesRead];

dataReader.ReadBytes(data);

サーバー側でこれを実行しようとしましたが、これは良い解決策ではないと思います:

byte[] data = SomeData();

byte[] length = System.Text.Encoding.ASCII.GetBytes(data.Length.ToString());

// Send the length of the data
serverSocket.Send(length);
// Send the data
serverSocket.Send(data);

私の質問は、長さとデータを同じパケットで送信するにはどうすればよいですか? また、クライアント側でそれを適切に処理するにはどうすればよいですか?

4

1 に答える 1

0

これに対処するための一般的な手法は、データの長さをデータの先頭に追加することです。たとえば、100 バイトを送信する場合は、数値「100」を 4 バイトの整数 (または 2 バイトの整数) としてエンコードし、バッファの先頭に追加します。したがって、実際には 104 バイトを送信し、最初の 4 バイトは 100 バイトが続くことを示します。受信側では、最初の 4 バイトを読み取ります。これは、さらに 100 バイトを読み取る必要があることを示しています。わかる?

プロトコルが進歩するにつれて、さまざまな種類のメッセージが必要になることがあります。したがって、4 バイトの長さに加えて、4 バイトのメッセージ タイプ フィールドを追加できます。これは、メッセージの長さを示す長さで、どのタイプのメッセージが送信されているかを受信に指定します。

byte[] data   = SomeData();
byte[] length = System.BitConverter.GetBytes(data.Length);
byte[] buffer = new byte[data.Length + length.Length];
int offset = 0;

// Encode the length into the buffer.
System.Buffer.BlockCopy(length, 0, buffer, offset, length.Length);
offset += length.Length;

// Encode the data into the buffer.
System.Buffer.BlockCopy(data, 0, buffer, offset, data.Length);
offset += data.Length;  // included only for symmetry

// Initialize your socket connection.
System.Net.Sockets.TcpClient client = new ...;

// Get the stream.
System.Net.Sockets.NetworkStream stream = client.GetStream();

// Send your data.
stream.Write(buffer, 0, buffer.Length);
于 2014-05-10T18:02:10.193 に答える