0

在网络框架 v2 中,套接字使用 Invoke (BeginRead) 方法来调用方法(例如 ReceiveMsg),如下所示:

客户端 = 新的 TcpClient();
client.Connect(SERVERIP, PORTNO);
数据 = 新字节 [client.ReceiveBufferSize];
SendMessage("你好\n");

client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(client.ReceiveBufferSize), ReceiveMsg, null);

  1. 这个socket的ReceiveMsg方法会一直处于“自动模式”,这样它就可以等待接收SocketServer广播的消息了吗?

  2. 还是使用 System.Threading.Thread.Sleep() 使 ReceiveMsg 方法始终处于活动状态,以便在 SocketServer 广播消息时处于就绪模式以响应?

  3. 如何在 Netframework v4 或 4.5 套接字中为此 ReceiveMsg 方法执行此操作,因为不再需要 BeginRead()。

谢谢。

下面是网络框架 v4 中套接字的代码:http: //msdn.microsoft.com/en-us/library/hh202858 (v=vs.92).aspx(适用于 WP mango/ Wp8)

客户端.连接();Client.Send(); Client.Receive();

公共字符串接收()
        {

            //-- 接收来自服务器的回复

           string response = "接收操作超时";

            // 我们通过已建立的套接字连接接收
            如果(_socket!= null)
            {
                // 创建 SocketAsyncEventArgs 上下文对象
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

                // 设置缓冲区以接收数据
                socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

                // Completed 事件的内联事件处理程序。
                // 注意:这个偶数处理程序是内联实现的,以便使这个方法自包含。
                socketEventArg.Completed += new EventHandler(delegate(object s, SocketAsyncEventArgs e)
                {
                    如果(e.SocketError == SocketError.Success)
                    {
                        // 从缓冲区中取出数据

                        response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                        response = response.Trim('\0');
                    }
                    别的
                    {
                        响应 = e.SocketError.ToString();
                    }

                    _clientDone.Set();
                });

                // 将事件的状态设置为无信号,导致线程阻塞
                _clientDone.Reset();

                // 通过套接字发出异步接收请求
                _socket.ReceiveAsync(socketEventArg);

                // 最多阻塞 UI 线程 TIMEOUT_MILLISECONDS 秒。
                // 如果在这段时间内没有响应,则继续
                _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
            }
            别的
            {
                response = "套接字未初始化";
            }

            返回响应;
        }

4

0 回答 0