在网络框架 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 = "套接字未初始化";
}
返回响应;
}