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 を提供しないという事実を回避するために、独自の IO を構築することは、非同期を受け入れるほどクリーンではありません。

第 2 に、データ全体を取得するために必要なReceiveAsync呼び出しは 1 回だけであると想定しています。TCP を使用していると仮定すると、これはストリームベースのプロトコルです。ある種の区切り文字または長さのプレフィックスを追加するか、プロトコルがそのように機能する場合は、反対側が接続を閉じるまで読み続ける必要があります。

WebClient(ちなみに、これを HTTP およびorで行っていない理由はありますWebRequestか?)

于 2012-05-04T08:19:04.923 に答える
0

まず、コードを適切に非同期になるように再設計しようとします。WP7 が同期 IO を提供しないという事実を回避するために、独自の IO を構築することは、非同期を受け入れるほどクリーンではありません。

次に、データ全体を取得するために ReceiveAsync を 1 回呼び出すだけでよいと想定しています。TCP を使用していると仮定すると、これはストリームベースのプロトコルです。ある種の区切り文字または長さの接頭辞を追加するか、プロトコルがそのように機能する場合は、反対側が接続を閉じるまで読み続ける必要があります。

(ちなみに、HTTP と WebClient または WebRequest でこれを行っていない理由はありますか?)

于 2013-03-26T06:23:00.030 に答える