0

我正在研究 Windows Phone 中的 TCP 套接字。我创建了一个应用程序,我必须从服务器接收图像。为此,我将图像转换为字节数组以传输到 Windows Phone。

但是,有时windows phone 会得到整个字节数组,有时没有得到图像的整个字节数组。

所以,我在这里编码,

public void ReceiveMessage()
{
    var responseListener = new SocketAsyncEventArgs();
    responseListener.Completed += OnMessageReceivedFromServer;
    var responseBuffer = new byte[bufferSize];
    responseListener.SetBuffer(responseBuffer, 0, bufferSize);
    connection.ReceiveAsync(responseListener);
}

收到消息后,我调用了 OnMessageReceivedFromServer。

在那里面

public void OnMessageReceivedFromServer(object sender, SocketAsyncEventArgs e)
{
   // Convert the received message into a string
      var message = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);

   //trailingmessage is the string declared with null.
   //it will store the message if the message is greater than the bufferSize.
     trailingMessage = trailingMessage + message;
   //This checks wheather the message is remaining or not.
   //if yes then it will again receives the message until it resumes.
     if (e.BytesTransferred > 0 && e.BytesTransferred == bufferSize)
     {
            ReceiveMessage();               
     }
     else
     {
            receivedstring = trailingMessage;
            trailingMessage = null;
            ReceiveMessage();
            onMsg.Invoke(receivedstring);
     }
}
4

3 回答 3

0

您不能安全地将字节数组转换为字符串,然后获取原始字节(使用 Encoding.GetString、Encoding.GetBytes)。

这是一个显示它不起作用的代码

byte[] buf = { 255, 255, 255 };
var newBuf = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(buf));

newbuf的内容: 239,191,189,239,191,189,239,191,189

于 2013-09-02T12:07:29.707 回答
0

不要使用字符串来存储图像,而是使用字节列表:

List<byte> trailingBuffer = new List<byte>();

将接收到的字节添加到此列表中:

public void OnMessageReceivedFromServer(object sender, SocketAsyncEventArgs e)
{
    for(int i = 0; i < e.BytesTransferred; i++)
    {
        trailingBuffer.Add(e.Buffer[i]);
    }

    // handling of complete / non-complete message ...
}
于 2013-09-02T12:16:03.627 回答
0

本次测试:

 if (e.BytesTransferred > 0 && e.BytesTransferred == bufferSize)
 {
        ReceiveMessage();               
 }

无效。一次接收 1 个字节的数据是完全合法的(即使另一端一次发送所有数据)——在这种情况下,的,你得到了数据(the > 0),但你没有得到一个完整的缓冲区(the == bufferSize)。这就是流的工作方式(套接字通常作为流运行)。您需要保持循环直到结束(只需先将预期的字节数写入流中,然后准确读取该数量。e.BytesTransferred <= 0

另见: http: //marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html

于 2013-09-02T22:17:52.053 回答