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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值