C# Socket异步通讯

客户端:       

Socket sock = null;
        byte[] buffer = new byte[1024];
        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {

                sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtServer.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
                //获得要连接的远程服务器应用程序的IP地址和端口号
                //sock.BeginConnect(point, new AsyncCallback(ConnectServer), sock);
                //铜鼓
                sock.Connect(point);
                ShowTxtLog("连接成功");

                sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(CallReveive), sock);
                btnStart.Enabled = false;
            }
            catch 
            {
                Action ac = () => { btnStart.Enabled = true; };
            }
            
        }

        private void ConnectServer(IAsyncResult Iay) 
        {
            Socket sock = Iay.AsyncState as Socket;
            if (sock != null)
            {
                sock.EndConnect(Iay);
            }

        }


        private void CallReveive(IAsyncResult Iay)
        {
            try
            {
                Socket sock = Iay.AsyncState as Socket;
                if (sock != null && IsSocketConnected(sock))
                {
                    int len = sock.EndReceive(Iay);
                    string s = Encoding.Default.GetString(buffer, 0, len);
                    ShowTxtLog(s);


                }

                if (sock != null && IsSocketConnected(sock))
                {
                    sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(CallReveive), sock);
                }
            }
            catch (Exception e) { Action ac = () => { btnStart.Enabled = true; }; }
        }

        public bool IsSocketConnected(Socket s)
        {
            if (s == null)
                return false;
            return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
        }
        private void ShowTxtLog(string s) 
        {
            Action ac = () => {
                txtLog.AppendText(s+"\r\n");
            
            };
            Invoke(ac);
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (sock != null && IsSocketConnected(sock)) 
            {
                byte[] data = Encoding.Default.GetBytes(txtMsg.Text);
                sock.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(CallBackSend), sock);
            }
        }

        private void CallBackSend(IAsyncResult Iay) 
        {
            Socket sock = Iay.AsyncState as Socket;
            if (sock != null) 
            {
                int len= sock.EndSend(Iay);
                ShowTxtLog("客户端发送"+len +"个字节");
            }
        }

服务端:     

  //服务端buffer为4字节
        static byte[] buffer = new byte[1024];
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
              

                Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketServer.Bind(new IPEndPoint(IPAddress.Parse(textBox1.Text ), Convert.ToInt32(textBox2.Text)));
                socketServer.Listen(int.MaxValue);
                ShowText3("服务端已启动,等待连接...");
                //接收连接
                //Socket ts = socketServer.Accept();
                socketServer.BeginAccept(new AsyncCallback(ClientAccepted), socketServer);

                //ShowText3("客户端已连接");

                //开始异步接收
                //ts.BeginServer(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), ts);
                button1.Enabled = false;
            }
            catch (Exception ex)
            {
                Action ac = () => { button1.Enabled = true; };
                
                Console.WriteLine(ex.Message);
            }
        }


        Socket socketsend = null;
        public  void ClientAccepted(IAsyncResult ar)
        {
            var socket = ar.AsyncState as Socket;
            //客户端Socket实例,后续保存
            if (socket != null)
            {
                socketsend = socket.EndAccept(ar);
                //客户端IP地址和端口信息
                //IPEndPoint colientip = (IPEndPoint)client.RemoteEndPoint;
                //Console.WriteLine(colientip + "客户已连接", ConsoleColor.Yellow);
                ShowText3("客户已连接");
                //接受客户端消息
                socketsend.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMsg), socketsend);
                //socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);

            }

            //准备接受下一个客户端连接请求
            if (socket != null) socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
        }

       
        //接受客户端的消息
        public  void ReceiveMsg(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            //客户端IP地址和端口消息
            if (socket != null )
            {
                try
                {
                    var length = socket.EndReceive(ar);
                    var message = Encoding.UTF8.GetString(buffer, 0, length);
                    //Console.WriteLine(clientipe + ":" + message, ConsoleColor.White);
                    ShowText3(message);
                    //socket.Send(Encoding.UTF8.GetBytes("服务器收到消息"));
                   
                }
                catch (Exception)
                {
                    Action ac = () => { button1.Enabled = true; };
                    //count--;
                    //Console.WriteLine(clientipe + "断开连接" + (count), ConsoleColor.Red);
                }
            }

            if (socket != null && IsSocketConnected(socket)) 
            {
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMsg), socket);
            }
        }

        /// 另一种判断connected的方法,但未检测对端网线断开或ungraceful的情况
        public bool IsSocketConnected(Socket s)
        {
            #region 过程
            if (s == null)
                return false;
            return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
            #endregion
        }

        void ReceiveCallback(IAsyncResult result)
        {
            Socket ts = (Socket)result.AsyncState;
            ts.EndReceive(result);
            result.AsyncWaitHandle.Close();
            ShowText3(string.Format("收到消息:{0}", Encoding.ASCII.GetString(buffer)));

            //清空数据,重新开始异步接收
            buffer = new byte[buffer.Length];
            ts.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), ts);
        }


        private void ShowText3(string s) 
        {
            Action ac = () => {

                textBox3.AppendText(s +"\r\n");
            };
            Invoke(ac);

        }


        private void ShowText4(string s)
        {
            Action ac = () =>
            {

                textBox4.AppendText(s + "\r\n");
            };
            Invoke(ac);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (socketsend != null && IsSocketConnected(socketsend))
            {
                //同步
                //socket.Send(Encoding.Default.GetBytes(textBox4.Text));

                //异步
                byte[] byteData = Encoding.Default.GetBytes(textBox4.Text);
                socketsend.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), socketsend);
            }
        }


        public void SendCallback(IAsyncResult Iay) 
        {
            Socket handler = (Socket)Iay.AsyncState;
            // Complete sending the data to the remote device.     
            int bytesSent= handler.EndSend(Iay);
            ShowText3(string.Format("发送了 {0} 字节到客户端.", bytesSent));
            //handler.Shutdown(SocketShutdown.Both);
            //handler.Close();
        
        }

下载地址:Sock异步通信(客户端和服务端).zip-C#代码类资源-CSDN下载

### 回答1: c是指光速(speed of light)的符号,也被称为光速常数。它是一个物理学中重要的常数,通常用符号c来表示。 光速是指在真空中光传播的速度,它的数值约等于299,792,458米每秒(或约等于30万公里每秒)。光速是宇宙中最快的速度,而且具有不变性,即在任何非加速的惯性参考系中光速都是常数。 光速在物理学中扮演着非常重要的角色,它不仅是相对论理论的基础,也被用作其他物理学定律的参考。许多物理现象和理论都需要考虑光速对其影响,例如光传播的折射、反射和散射现象都与光速有关。 在相对论理论中,光速还是一个极限速度。根据狭义相对论,任何物体的速度都无法超过光速,而且存在着类似时间膨胀和长度收缩等奇特的相对论效应。 总之,光速是一个非常重要且特殊的物理常数,在物理学的许多领域都扮演着重要角色。它的不变性和作为速度极限的特性使得我们对宇宙和时间的理解产生了重大影响。 ### 回答2: 关于"c"这个字母,它是英文字母表中的第三个字母。在英语中,它的发音为 /siː/。除了在英语中使用外,它也是其他语言中的一个重要字母,如法语、德语、西班牙语等。在这些语言中,字母"c"有时会有不同的发音和用法。 在汉字中,虽然没有类似于"c"这个字母的发音,但是在现代汉语拼音中,有一些音标使用了"c"这个字母,如"ca"、"ce"、"ci"等。这些音标是为了帮助学习者正确发音,并将其建立在英语字母的基础上。同时,汉字的字形中也有一些与字母"c"类似的形状,如"勺"字的部分,有点类似于字母"c"的样子。 此外,"c"也有一些特殊的意义和用法。在数学中,它可以代表圆的周长,符号为"2πr"。在化学中,它代表摄氏度的单位。在计算机科学中,它是一种编程语言。在音乐中,"C"也是一个音符,在唱名上代表do。在体育比赛中,也可以用"c"代表"center"的意思,如篮球比赛中的中锋位置。 总之,"c"是一个广泛使用的字母,在不同的语言和领域都有特殊的意义和用法。无论是在英语中还是在汉语中,它都有着重要的地位,并且被广泛应用在各个领域中。 ### 回答3: 简单点说,c语言是一种高级编程语言,于1972年由贝尔实验室的丹尼斯·里奇开发。它是一种用于开发各种应用程序的通用语言,包括系统软件、应用软件以及嵌入式系统。c语言非常受欢迎,因为它具有简洁、高效、可移植和灵活的特点。 c语言有许多特点和优势。它具有简洁明了的语法,易于学习和理解。同时,c语言提供了丰富的基本数据类型和运算符,使得开发者可以很方便地进行各种计算操作。此外,c语言还提供了丰富的控制结构,如if语句、循环语句等,使得开发者可以轻松地控制程序的流程。 c语言的另一个优势是其高效性。c语言的编译器可以将c代码直接转换为机器代码,这使得c语言程序的执行效率非常高。此外,c语言还允许开发者直接访问计算机的底层硬件资源,如内存和寄存器,从而可以更好地进行优化。 c语言的可移植性也是其受欢迎的原因之一。c语言的标准库提供了一系列的函数和工具,可以很方便地进行跨平台开发。这意味着开发者可以编写一次代码,然后在不同的操作系统和硬件平台上进行编译和运行。 总之,c语言作为一种通用的高级编程语言,具有简洁、高效、可移植和灵活的特点。它已经成为许多计算机科学和软件工程学科的基础,并且在各个领域都得到了广泛应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CnLg.NJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值