C#Socket 异步通讯实现详解(客户端)
代码
C# Socket异步通讯是如何实现的呢?C# Socket异步通讯客户端设计的思路是什么呢?那么本⽂就向你介绍具体的内容。
C# Socket异步通讯客户端实现源码
C# Socket异步通讯客户端之主程序:
public static int Main(String[] args) { IPAddress ipAddress = IPAddress.Parse("192.168.1.104"); int port = 20000; IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); // ⽣成⼀个TCP/IP socket. Socket client = new Socket(AddressFa private static void ConnectCallback(IAsyncResult ar) { // 从state对象获取socket. Socket client = (Socket)ar.AsyncState; // 完成连接. client.EndConnect(ar); Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString()); private static void Receive(Socket client) { // 构造容器state. StateObject state = new StateObject(); state.workSocket = client; // 从远程⽬标接收数据. client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(R private static void Send(Socket client, String data) { // 格式转换. byte[] byteData = En
coding.ASCII.GetBytes(data); // 开始发送数据到远程设备. client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client);
代码
以SOCKET通信中的异步⽅法为例:
public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
public static void ConnectCallback(IAsyncResult ar)
{
Socket sClient = (Socket)ar.AsyncState;socket通信报文格式
sClient.EndConnect(ar);
Console.WriteLine("Socket connected to {0}", sClient.RemoteEndPoint.ToString());
ConnectDone.Set();
}
public static void Main(string[] arg)
{
try
{
IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 11000);
Socket sClient = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sClient.BeginConnect(endPoint, new AsyncCallback(ConnectCallback),
sClient);
for (int i = 0; i <5; i++)
Console.WriteLine("Do Some Other Work.");
byte[] byteData = Encoding.ASCII.GetBytes("Some Data.");
ConnectDone.WaitOne();
sClient.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), sClient);
………
}
(注:ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及⼀个线程在其他线程进⾏之前必须完成的任务。
ManualResetEvent就像⼀个信号灯,可以利⽤它的信号来通知其它线程。它有⼏个重要的⽅法:Reset(),Set(),WaitOne()。初始化该对象时,⽤户可以指定其默认的状态(有信号/⽆信号),在初始
化以后,该对象将保持原来的状态不变直到它的R 本例中,主线程调⽤ConnectDone.WaitOne();后,主线程阻塞,直到连接操作(即 ConnectCallback)完成,因为连接操作完成之后,执⾏了ConnectDone.Set()将信号灯设置为有信号,由于调⽤了 ManualResetEvent.WaitOne()⽅法⽽处在等待状态同步与异步:
简单地说,同步即程序执⾏⼀个⽅法,等该⽅法返回之后,继续往下⾛,
异步:即程序调⽤⼀个⽅法后⽴即返回,“宏观”⽽⾔,主线程与⽅法线程并⾏执⾏。
就本例⽽⾔,socket的异步⽅法BeginConnect被调⽤后,接着执⾏主线程中该语句之后的代码,即:
for (int i = 0; i <5; i++)
Console.WriteLine("Do Some Other Work.");
byte[] byteData = Encoding.ASCII.GetBytes("Some Data.");
如果调⽤的是同步⽅法,那么,输出“Socket connected to…”⼀定会在“Do Some Other Work.”之前,因为主线程必须等待同步⽅法的返回,但是在异步的情况下,将可能在5⾏“Do Some Other Work.”之间的某个时刻出现“Socket connected to…”的输⾄于在 sClient.BeginSend(…)⽅法之前调⽤ConnectDone.W
aitOne(),则是由于前者依赖于连接操作(即 ConnectCallback)的完成,须得同步⼀下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论