Windows phone 7:Socket不会从服务器返回整个图像

本文关键字:返回 服务器 图像 phone Socket Windows | 更新日期: 2023-09-27 18:29:58

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

但是,有些时候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);
     }
}

Windows phone 7:Socket不会从服务器返回整个图像

您无法安全地将字节数组转换为字符串,然后获得原始字节(使用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

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

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 ...
}

此测试:

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

无效。一次接收1个字节的数据是完全合法的(即使另一端同时发送所有数据)-在这种情况下,您得到了数据(> 0),但没有得到完整的缓冲区(== bufferSize)。这只是流的工作方式(套接字通常作为流操作)。您需要保持循环直到流(e.BytesTransferred <= 0)结束,(通常如果您想在同一个套接字上发送多条消息),您需要实现某种形式的"成帧"-最常见的是(因为这是二进制的),只需先将预期的字节数写入流,然后读取该字节数。

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