0

基本上,我编写了一个 windows phone 7 客户端,它应该从服务器接收一个很长的字符串。但是,电话网络代码似乎存在一些限制,并且无法弄清楚如何执行此操作。以下是我正在使用的代码:

public string Receive()
    {
        string response = "Operation Timeout";
        StringBuilder content = new StringBuilder();

        // We are receiving over an established socket connection
        if (_socket != null)
        {
            // Create SocketAsyncEventArgs context object
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

            // Setup the buffer to receive the data
            socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

            // Inline event handler for the Completed event.
            // Note: This even handler was implemented inline in order to make this method self-contained.
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                        response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                        response = response.Trim('\0');
                }
                else
                {
                    response = e.SocketError.ToString();
                }

                _clientDone.Set();
            });

            // Sets the state of the event to nonsignaled, causing threads to block
            _clientDone.Reset();

            // Make an asynchronous Receive request over the socket
            _socket.ReceiveAsync(socketEventArg);

            // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
            // If no response comes back within this time then proceed
            _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            response = "Socket is not initialized";
        }

        return response;
    }

就目前而言,这将仅接受消息的前 N ​​个字节并返回...任何有关如何执行此操作的帮助将不胜感激!谢谢!

4

2 回答 2

2

首先,我会尝试重新设计您的代码以适当地异步 - 解决 WP7 不通过构建自己的同步 IO 的事实并不像拥抱异步那么干净。

其次,您假设您只需要一次ReceiveAsync调用即可获取整个数据。假设您使用 TCP,这是一个基于流的协议。您需要添加某种分隔符或长度前缀,或者继续阅读,直到对方关闭连接(如果这是您的协议的工作方式)。

(顺便说一句,您有什么理由不使用 HTTP 和WebClientorWebRequest来执行此操作?)

于 2012-05-04T08:19:04.923 回答
0

首先,我会尝试将您的代码重新设计为适当的异步 - 解决 WP7 不通过构建自己的同步 IO 并不像拥抱异步一样干净这一事实。

其次,您假设您只需要一个 ReceiveAsync 调用即可获取整个数据。假设您使用 TCP,这是一个基于流的协议。您需要添加某种分隔符或长度前缀,或者继续阅读,直到对方关闭连接(如果这是您的协议的工作方式)。

(顺便说一句,您有什么理由不使用 HTTP 和 WebClient 或 WebRequest 执行此操作?)

于 2013-03-26T06:23:00.030 回答