在网络框架 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);
这个socket的ReceiveMsg方法会一直处于“自动模式”,这样它就可以等待接收SocketServer广播的消息了吗?
还是使用 System.Threading.Thread.Sleep() 使 ReceiveMsg 方法始终处于活动状态,以便在 SocketServer 广播消息时处于就绪模式以响应?
如何在 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 = "套接字未初始化"; } 返回响应; }