温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#中怎么利用Socket实现异步通讯

发布时间:2021-07-20 11:01:56 阅读:322 作者:Leah 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章将为大家详细讲解有关C#中怎么利用Socket实现异步通讯,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

C# Socket异步通讯客户端之主程序:

using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.Text;// State object for receiving data from remote device.public class StateObject {// Client socket.public Socket workSocket = null;// Size of receive buffer.public const int BufferSize = 256;// Receive buffer.public byte[] buffer = new byte[BufferSize];// Received data string.public StringBuilder sb = new StringBuilder();}public class AsynchronousClient {// The port number for the remote device.private const int port = 11000;// ManualResetEvent instances signal completion.private static ManualResetEvent connectDone =new ManualResetEvent(false);private static ManualResetEvent sendDone =new ManualResetEvent(false);private static ManualResetEvent receiveDone =new ManualResetEvent(false);// The response from the remote device.private static String response = String.Empty;private static void StartClient() {// Connect to a remote device.try {// Establish the remote endpoint for the socket.// The name of the // remote device is "host.contoso.com".IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");IPAddress ipAddress = ipHostInfo.AddressList[0];IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); // 生成一个TCP/IP socket.  Socket client = new Socket(AddressFamily.InterNetwork,  SocketType.StreamProtocolType.Tcp);  // 与目标终端连接.  client.BeginConnect(remoteEP,  new AsyncCallback(ConnectCallback), client);  //等待,直到连接程序完成。在ConnectCallback中适当位置有connecDone.Set()语句  connectDone.WaitOne();  // 发送数据到远程终端.  Send(client, "This is a test<EOF>");  sendDone.WaitOne();  // 接收返回数据.  Receive(client);  receiveDone.WaitOne();  // Write the response to the console.  Console.WriteLine("Response received : {0}", response);  // Release the socket.  client.Shutdown(SocketShutdown.Both);  client.Close();  return 0;  } 

C# Socket异步通讯客户端之连接部分Callback:

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());  // 连接已完成,主线程继续.  connectDone.Set();} catch (Exception e) {Console.WriteLine(e.ToString());}}

C# Socket异步通讯客户端之数据接收:

   private static void Receive(Socket client)  try {{  // 构造容器state.  StateObject state = new StateObject();  state.workSocket = client;  // 从远程目标接收数据.  client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,  new AsyncCallback(ReceiveCallback), state);  } catch (Exception e) {Console.WriteLine(e.ToString());}}private static void ReceiveCallback(IAsyncResult ar)  {  // 从输入参数异步state对象中获取statesocket对象  StateObject state = (StateObject)ar.AsyncState;  Socket client = state.workSocket;  //从远程设备读取数据  int bytesRead = client.EndReceive(ar);  if (bytesRead > 0)  {  // 有数据,存储.  state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));  // 继续读取.  client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,  new AsyncCallback(ReceiveCallback), state);  }  else {  // 所有数据读取完毕.  if (state.sb.Length > 1)  {  response = state.sb.ToString();  }  // 所有数据读取完毕的指示信号.  receiveDone.Set();  }  } catch (Exception e) {Console.WriteLine(e.ToString());}}

C# Socket异步通讯客户端之发送数据:

private static void Send(Socket client, String data)  {  // 格式转换.  byte[] byteData = Encoding.ASCII.GetBytes(data);  // 开始发送数据到远程设备.  client.BeginSend(byteData, 0, byteData.Length, 0,  new AsyncCallback(SendCallback), client);  }   private static void SendCallback(IAsyncResult ar)  {  // 从state对象中获取socket  Socket client = (Socket)ar.AsyncState;  // 完成数据发送.  int bytesSent = client.EndSend(ar);  Console.WriteLine("Sent {0} bytes to server.", bytesSent);  // 指示数据已经发送完成,主线程继续.  sendDone.Set();  } } catch (Exception e) {Console.WriteLine(e.ToString());}}public static int Main(String[] args) {StartClient();return 0;}}

关于C#中怎么利用Socket实现异步通讯就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×