C#Socket 网络通信异步处理 SocketAsyncEventArgs

C#Socket 网络通信异步处理 SocketAsyncEventArgs 异步套接字操作

1.服务端简单实现:

    public partial class Form_Server : Form
    {
        private Socket socket;

        public Form_Server()
        {
            InitializeComponent();
        }

        private void Form_Server_Load(object sender, EventArgs e)
        {
            try
            {
                //获取本地ip地址
                IPAddress ipaddress = Dns.GetHostByName(Dns.GetHostName()).AddressList[0];
                txt_ip.Text = ipaddress.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //开启Socket监听
        private void btn_listent_open_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txt_ip.Text))
                {
                    MessageBox.Show("请输入IP地址");
                }

                //打开监听
                IPAddress ip = IPAddress.Parse(txt_ip.Text);
                IPEndPoint localEP = new IPEndPoint(ip, Int32.Parse(txt_port.Text));
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Bind(localEP);
                socket.Listen(1000);

                //AcceptAsync异步方式
                SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs();
                socketAsyncEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(socketAsyncEventArgs_Completed_AcceptAsync);
                socketAsyncEventArgs.RemoteEndPoint = localEP;
                socketAsyncEventArgs.UserToken = socket;
                socket.AcceptAsync(socketAsyncEventArgs);

                //消息提示
                this.lb_msg.Items.Add("[服务端]:");
                this.lb_msg.Items.Add("         监听成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //开始一个异步操作来接受一个传入的连接尝试
        void socketAsyncEventArgs_Completed_AcceptAsync(object ServerSocket, SocketAsyncEventArgs e)
        {
            //已关闭,重叠的操作被中止
            if (e.SocketError == SocketError.OperationAborted)
            {
                //已关闭,重叠的操作被中止
                this.lb_msg.Invoke(new Action(() =>
                {
                    this.lb_msg.Items.Add("[服户端]:");
                    this.lb_msg.Items.Add("         socketAsyncEventArgs_Completed_AcceptAsync:已关闭,重叠的操作被中止>SocketError:OperationAborted");
                }));
                return;
            }

            //此连接由远程对等计算机重置
            if (e.SocketError == SocketError.ConnectionReset && e.BytesTransferred == 0)
            {
                //此连接由远程对等计算机重置
                this.lb_msg.Invoke(new Action(() =>
                {
                    this.lb_msg.Items.Add("[服户端]:");
                    this.lb_msg.Items.Add("         socketAsyncEventArgs_Completed_AcceptAsync:此连接由远程对等计算机重置>SocketError:ConnectionReset");
                }));
                return;
            }

            if (e.LastOperation == SocketAsyncOperation.Accept)
            {
                try
                {
                    Socket acceptSocket = e.AcceptSocket;

                    //开始一个异步请求以便从连接的 System.Net.Sockets.Socket 对象中接收数据
                    SocketAsyncEventArgs socketAsyncEventArgsReceiveAsync = new SocketAsyncEventArgs();
                    socketAsyncEventArgsReceiveAsync.UserToken = acceptSocket;
                    byte[] receiveBuff = new byte[1024 * 4];
                    socketAsyncEventArgsReceiveAsync.SetBuffer(receiveBuff, 0, receiveBuff.Length);
                    socketAsyncEventArgsReceiveAsync.Completed += new EventHandler<SocketAsyncEventArgs>(socketAsyncEventArgs_Completed_ReceiveAsync);
                    acceptSocket.ReceiveAsync(socketAsyncEventArgsReceiveAsync);

                    //消息提示
                    this.lb_msg.Invoke(new Action(() =>
                    {
                        this.lb_msg.Items.Add("[客户端]:");
                        this.lb_msg.Items.Add("         连接成功");
                    }));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                //开始一个异步操作来接受一个传入的连接尝试,递归
                e.AcceptSocket = null;
                socket.AcceptAsync(e);
            }
        }

        //开始一个异步请求以便从连接的 System.Net.Sockets.Socket 对象中接收数据
        void socketAsyncEventArgs_Completed_ReceiveAsync(object acceptSocket, SocketAsyncEventArgs e)
        {
            //已关闭,重叠的操作被中止
            if (e.SocketError == SocketError.OperationAborted)
            {
                //已关闭,重叠的操作被中止
                this.lb_msg.Invoke(new Action(() =>
                {
                    this.lb_msg.Items.Add("[服户端]:");
                    this.lb_msg.Items.Add("         socketAsyncEventArgs_Completed_ReceiveAsync:已关闭,重叠的操作被中止>SocketError:OperationAborted");
                }));
                return;
            }

            //此连接由远程对等计算机重置
            if (e.SocketError == SocketError.ConnectionReset && e.BytesTransferred == 0)
            {
                //此连接由远程对等计算机重置
                this.lb_msg.Invoke(new Action(() => {
                    this.lb_msg.Items.Add("[服户端]:");
                    this.lb_msg.Items.Add("         socketAsyncEventArgs_Completed_ReceiveAsync:此连接由远程对等计算机重置>SocketError:ConnectionReset");
                }));
                return;
            }

            if (e.SocketError == SocketError.Success && e.Buffer.Length > 0)
            {
                try
                {
                    Socket socket = acceptSocket as Socket;

                    string ipAddress = socket.RemoteEndPoint.ToString();
                    int lengthuffer = e.BytesTransferred;

                    byte[] receiveBuffer = e.Buffer;
                    byte[] buffer = new byte[lengthuffer];
                    Buffer.BlockCopy(receiveBuffer, 0, buffer, 0, lengthuffer);
                    string message = Encoding.UTF8.GetString(buffer);

                    this.lb_msg.Invoke(new Action(() =>
                    {
                        this.lb_msg.Items.Add("[客户端]:");
                        this.lb_msg.Items.Add("         " + message);
                    }));

                    socket.Send(Encoding.UTF8.GetBytes(string.Format("收到消息{0}:{1}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), message)));
                    socket.ReceiveAsync(e);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        //关闭Socket监听
        private void btn_listent_Close_Click(object sender, EventArgs e)
        {
            try
            {
                if (socket != null)
                {
                    socket.Close();
                }
                this.lb_msg.Items.Add("[服务端]:");
                this.lb_msg.Items.Add("         关闭监听成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
    }

2.客户端简单实现:

    public partial class ClientMainForm : Form
    {
        private Socket _socket;
        public ClientMainForm()
        {
            InitializeComponent();
        }

        //登录
        private void btn_login_Click(object sender, EventArgs e)
        {
            try
            {
                IPAddress ip = IPAddress.Parse(this.txt_ip.Text);
                IPEndPoint ipendPoint = new IPEndPoint(ip, Int32.Parse(this.txt_port.Text));

                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _socket.Connect(ipendPoint);

                this.lb_msg.Items.Add("[客户端]:");
                this.lb_msg.Items.Add("         连接服务端成功");

                //开启新的接受消息异步操作事件
                SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs();
                //设置消息的缓冲区大小
                byte[] receiveBuff = new byte[1024 * 4];
                socketAsyncEventArgs.SetBuffer(receiveBuff, 0, receiveBuff.Length);
                socketAsyncEventArgs.UserToken = _socket;
                //绑定回调事件
                socketAsyncEventArgs.Completed += socketAsyncEventArgs_Completed_ReceiveAsync;
                _socket.ReceiveAsync(socketAsyncEventArgs);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //开始一个异步请求以便从连接的 System.Net.Sockets.Socket 对象中接收数据。
        void socketAsyncEventArgs_Completed_ReceiveAsync(object sender, SocketAsyncEventArgs e)
        {
            //已关闭,重叠的操作被中止
            if (e.SocketError == SocketError.OperationAborted)
            {
                this.lb_msg.Invoke(new Action(() =>
                {
                    this.lb_msg.Items.Add("[客户端]:");
                    this.lb_msg.Items.Add("         socketAsyncEventArgs_Completed_ReceiveAsync:已关闭,重叠的操作被中止:OperationAborted");
                }));
                return;
            }

            //此连接由远程对等计算机重置
            if (e.SocketError == SocketError.ConnectionReset && e.BytesTransferred == 0)
            {
                //此连接由远程对等计算机重置
                this.lb_msg.Invoke(new Action(() =>
                {
                    this.lb_msg.Items.Add("[客户端]:");
                    this.lb_msg.Items.Add("         socketAsyncEventArgs_Completed_ReceiveAsync:此连接由远程对等计算机重置:ConnectionReset");
                }));
                return;
            }

            Socket socket = sender as Socket;
            if(e.SocketError==SocketError.Success&&e.Buffer.Length>0)
            {
                string ipAddress = socket.RemoteEndPoint.ToString();
                int lengthuffer = e.BytesTransferred;

                byte[] receiveBuffer = e.Buffer;
                byte[] buffer = new byte[lengthuffer];
                Buffer.BlockCopy(receiveBuffer, 0, buffer, 0, lengthuffer);
                string message = Encoding.UTF8.GetString(buffer);

                this.lb_msg.Invoke(new Action(() =>
                {
                    this.lb_msg.Items.Add("[服务户端]:");
                    this.lb_msg.Items.Add("         " + message);
                }));

                socket.ReceiveAsync(e);
            }
        }

        //发送消息
        private void btn_sendmsg_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txt_msg.Text))
            {
                MessageBox.Show("请输入消息");
            }
            else
            {
                _socket.Send(System.Text.Encoding.UTF8.GetBytes(txt_msg.Text));
            }
        }
    }
时间: 2024-10-05 23:33:20

C#Socket 网络通信异步处理 SocketAsyncEventArgs的相关文章

C#网络编程系列文章(五)之Socket实现异步UDP服务器

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现.System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient.TCPListener 和 UDPCl

c#编写的基于Socket的异步通信系统封装DLL--SanNiuSignal.DLL

SanNiuSignal是一个基于异步socket的完全免费DLL:它里面封装了Client,Server以及UDP:有了这个DLL:用户不用去关心心跳:粘包 :组包:发送文件等繁琐的事情:大家只要简单的几步就能实现强大的通信系统:能帮助到大家是本人觉得最幸福的事情,也希望大家 在用的过程中找出DLL中不足的地方:好改正:此DLL的苹果版和java版正在努力开发中......交流QQ:365368248:此演示源码下载地址:http://pan.baidu.com/s/1eQw1npw 里面包括

python速成第二篇(小爬虫+文件操作+socket网络通信小例子+oop编程)

大家好,由于前天熬夜写完第一篇博客,然后昨天又是没休息好,昨天也就不想更新博客,就只是看了会资料就早点休息了,今天补上我这两天的所学,先记录一笔.我发现有时候我看的话会比较敷衍,而如果我写出来(无论写到笔记本中还是博客中,我都有不同的感觉)就会有不同的想法,我看书或者看资料有时候感觉就是有一种惰性,得过且过的感觉,有时候一个知识想不通道不明,想了一会儿,就会找借口给自己说这个知识不重要,不需要太纠结了,还是去看下一个吧,然后就如此往复下去,学习就会有漏洞,所以这更加坚定了我写博客来记录的想法.

JavaSE入门学习47:Socket网络通信编程(一)

今天既然我们学习Java的Socket网络通信编程,那么在我们的现实生活中那些是Socket编程的应用呢?可以想象 我们最常用的聊天工具软件QQ就是,当然MSN也是啦. 一网络基础知识 两台计算机通过网络进行通信的必要条件: 1)IP地址 2)网络协议 3)端口号 两台计算机网络通信示意图: (1)TCP/IP协议 1)TCP/IP协议是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也称 TCP/IP协议族或TCP/IP协议栈. 2)TCP:Transmissi

C#网络编程系列文章(一)之Socket实现异步TCPserver

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程系列文章(一)之Socket实现异步TCPserver C#网络编程系列文章(二)之Socket实现同步TCPserver C#网络编程系列文章(三)之TcpListener实现异步TCPserver C#网络编程系列文章(四)之TcpListener实现同步TCPserver C#网络编程系列文章

PHP实现简单的socket与异步应用

1.socket应用 (1)简单概念 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据的具体形式:Socket是发动机,提供了网络通信的能力. (2)什么是TCP/IP.UDP (概念与分析转发于原文连接:http://www.

c#编写的基于Socket的异步通信系统--SanNiuSignal.DLL已开源

自从推出了SanNiuSignal.DLL,用户反映还是满好的;为了更好的服务于大家,我已经修复了很多BUG,同时把这个DLL开源;下面就先来介绍下 使用这个DLL开发出的简单的通信系统;如图: 想使用哪个模块就启动哪个模块,可以和客户形成通信;具体的源码下载地址1:http://www.sanniub.com/down/html/?6.html  百度网盘下载地址:http://pan.baidu.com/s/1i346GML   里面包含了SanNiuSignal.DLL的源码以及它的一个使

socket网络通信

1.socket通常也称作“套接字”,用于描述IP地址和端口.在internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同的服务. 2.网络基础知识 1.IP地址:IP网络中每台主机具有唯一的ip地址,ip地址是一个逻辑地址,因特网上的ip地址是唯一的.IPV4由4个字节组成,经常以点分十进制表示 2.七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层.每层都规定了完成的功能以及相应的协议 物理层:提供

JavaSE入门学习48:Socket网络通信编程(二)

三Socket通信 (1)Socket 套接字Socket是网络通信的基础,简单来说,可以认为是IP地址+端口,用来区分实现不同应用程序的通信. 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一段称为一个Socket.Socket 通常用来实现client-server连接. java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server. (2)Socket通信模型 Socket通信: Socket通信实现