C#Socket异步简易代码

简易代码

public class SocketAsync
    {
        public delegate void TextShow(string context);
        public delegate void GetPic(int i);
        private static TextShow show;
        private static GetPic pic;

        public static void MainFunc(TextShow show1, GetPic pic1)
        {
            show = show1;
            pic = pic1;
            Socket serverSk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            serverSk.Bind(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 6000));
            serverSk.Listen(1);

            SocketAsyncEventArgs AcceptSAE = new SocketAsyncEventArgs();
            AcceptSAE.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptSAE_Completed);
            serverSk.AcceptAsync(AcceptSAE);
        }
        static void AcceptSAE_Completed(object sender, SocketAsyncEventArgs e)
        {
            Socket serverSk = sender as Socket;
            if (e.SocketError == SocketError.Success)
            {
                serverSk = e.AcceptSocket;
                //发送的方法,暂时没用
                //SocketAsyncEventArgs SendSAE = new SocketAsyncEventArgs();
                //byte[] data = System.Text.Encoding.UTF8.GetBytes("OK,Just Put IT!");
                //SendSAE.SetBuffer(data, 0, data.Length);
                //SendSAE.Completed += new EventHandler<SocketAsyncEventArgs>(SendSAE_Completed);

                SocketAsyncEventArgs RecieveSAE = new SocketAsyncEventArgs();
                byte[] buffer = new byte[2048];//因为我们不知道上面的字符串究竟会场生多少字节,这里我们就设置一个理论上可以满足大小的值2046。
                RecieveSAE.SetBuffer(buffer, 0, buffer.Length);
                RecieveSAE.Completed += new EventHandler<SocketAsyncEventArgs>(RecieveSAE_Completed);

                serverSk.ReceiveAsync(RecieveSAE);
                //serverSk.SendAsync(SendSAE);
            }
            //else
                //Console.WriteLine("接受网络套接字连接请求失败!具体原因请自己调试!");
        }
        static void RecieveSAE_Completed(object sender, SocketAsyncEventArgs e)
        {
            Socket sk = sender as Socket;
            byte[] data = e.Buffer;  //注意这里,如何取关联到套接字的发送接受的缓冲区中的值。
            string res = System.Text.Encoding.UTF8.GetString(data);
            string deviceIP = sk.RemoteEndPoint.ToString();
            show($"接收客户端{deviceIP},消息{res}");
            if (res.IndexOf("+OCCH_ALL") == 0)
            {
                string temp = res.Substring(res.IndexOf("+OCCH_ALL:") + 10, res.IndexOf("\n", 0) + 1 - (res.IndexOf("+OCCH_ALL:") + 10)).Replace("\n", "").Replace("\r", "");
                if (temp == "0,1,0,0,0,0,0,0")
                {
                    pic(1);
                }
                if (temp == "0,0,0,0,0,0,0,0")
                {
                    pic(2);
                }
            }
            //下一个异步接收
            sk.ReceiveAsync(e);
        }
        //发送的方法,暂时没用
        //static void SendSAE_Completed(object sender, SocketAsyncEventArgs e)
        //{
        //    Socket sk = sender as Socket;
        //    if (e.SocketError == SocketError.Success)
        //    {
        //        //Console.WriteLine("Send complete!");


        //        byte[] data = e.Buffer;  //注意这里,如何取关联到套接字的发送接受的缓冲区中的值。
        //        string msg = System.Text.Encoding.UTF8.GetString(data);
        //        //Console.WriteLine("What you sent: " + msg);
        //    }
        //}
    }

其中TextShow和GetPic是我要执行的方法,相当于DOsomething

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#Socket 类库提供了异步操作的支持,这可以使我们更加高效地处理网络通信。在 Socket 类库中,异步操作包括异步发送和异步接收。 下面是一个简单的异步发送的示例代码: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class Program { static void Main(string[] args) { string hostname = "www.example.com"; int port = 80; IPAddress[] ips = Dns.GetHostAddresses(hostname); IPEndPoint remoteEP = new IPEndPoint(ips[0], port); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] sendData = Encoding.ASCII.GetBytes("Hello, world!"); clientSocket.BeginConnect(remoteEP, (result) => { clientSocket.EndConnect(result); clientSocket.BeginSend(sendData, 0, sendData.Length, SocketFlags.None, (sendResult) => { int bytesSent = clientSocket.EndSend(sendResult); Console.WriteLine("Sent {0} bytes to server.", bytesSent); clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); }, null); }, null); Console.ReadLine(); } } ``` 在上面的代码中,我们创建了一个 Socket 对象,然后使用 BeginConnect 方法异步连接到远程主机。在连接完成后,我们使用 BeginSend 方法异步发送数据。发送完成后,我们关闭 Socket 对象。 需要注意的是,异步操作通常是通过回调函数来完成的,这些回调函数都是在另一个线程中执行的。因此,在使用异步操作时,需要特别注意线程安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值