Socket客户端持续监听服务器端发来的消息


最近搞一个WP8的小程序,要用到TCP通信,但是发现WP的.net framework库里边就只让用Socket。无奈客户端这边就只能用Socket来做。

但是现在有一个问题就是我找了一些资料,都是写服务器端持续监听客户端的消息。但是这边有个需求就是客户端要持续监听服务器端发来的消息,然后进行处理。

我自己实现了客户端的receive 方法。单独调用是没问题的。但是我想开启一个线程,然后循环调用receive方法,发现只有第一次能receive到,以后都是超时。

附上这个receive的代码,其实就是网上一个现成的例子。


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

            if (_socket != null)
            {
                // Create SocketAsyncEventArgs context object
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

                socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

                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();
                });

                _clientDone.Reset();

                _socket.ReceiveAsync(socketEventArg);

                _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
            }
            else
            {
                response = "Socket is not initialized";
            }

            return response;
        }

主要就是想搞清楚:

  1. 是不是Socket本来就不允许客户端一直监听,只能在需要的时候Receive一下?
  2. 这个持续监听的需求大概应该怎么解决?
  3. 我这个开线程while(true)监听的做法可不可取的?

谢谢大大~~

c# socket

不来方·夕莉 10 years, 2 months ago

Your Answer