博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[置顶] 【C#】 Socket通讯客户端程序
阅读量:4981 次
发布时间:2019-06-12

本文共 3949 字,大约阅读时间需要 13 分钟。

这段时间一直在优化Socket通讯这块,经常和Socket打交道,现在分享给大家一个小的案例,

代码如下:

byte[] m_dataBuffer = new byte [10];

        IAsyncResult m_result;
        public AsyncCallback m_pfnCallBack ;
        private System.Windows.Forms.Button btnClear;
        public Socket m_clientSocket;

//关闭连接

void ButtonCloseClick(object sender, System.EventArgs e)

        {
            if ( m_clientSocket != null )
            {
                m_clientSocket.Close ();
                m_clientSocket = null;
            }        
            Close();
        }

//连接服务器

void ButtonConnectClick(object sender, System.EventArgs e)

        {
            // See if we have text on the IP and Port text fields
            if(textBoxIP.Text == "" || textBoxPort.Text == ""){
                MessageBox.Show("IP Address and Port Number are required to connect to the Server\n");
                return;
            }
            try
            {
                UpdateControls(false);
                // Create the socket instance
                m_clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
                
                // Cet the remote IP address
                IPAddress ip = IPAddress.Parse (textBoxIP.Text);
                int iPortNo = System.Convert.ToInt16 ( textBoxPort.Text);
                // Create the end point
                IPEndPoint ipEnd = new IPEndPoint (ip,iPortNo);
                // Connect to the remote host
                m_clientSocket.Connect ( ipEnd );
                if(m_clientSocket.Connected) {
                    
                    UpdateControls(true);
                    //Wait for data asynchronously
                    WaitForData();
                }
            }
            catch(SocketException se)
            {
                string str;
                str = "\nConnection failed, is the server running?\n" + se.Message;
                MessageBox.Show (str);
                UpdateControls(false);
            }        
        }     

//发送消息

void ButtonSendMessageClick(object sender, System.EventArgs e)

        {
            try
            {
                string msg = richTextTxMessage.Text;
                // New code to send strings
                NetworkStream networkStream = new NetworkStream(m_clientSocket);
                System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
                streamWriter.WriteLine(msg);
                streamWriter.Flush();
                  
              
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }    
        }

      //等待接收数据

       public void WaitForData()

        {
            try
            {
                if  ( m_pfnCallBack == null )
                {
                    m_pfnCallBack = new AsyncCallback (OnDataReceived);
                }
                SocketPacket theSocPkt = new SocketPacket ();
                theSocPkt.thisSocket = m_clientSocket;
                // Start listening to the data asynchronously
                m_result = m_clientSocket.BeginReceive (theSocPkt.dataBuffer,
                                                        0, theSocPkt.dataBuffer.Length,
                                                        SocketFlags.None,
                                                        m_pfnCallBack,
                                                        theSocPkt);
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }
        }
        public class SocketPacket
        {
            public System.Net.Sockets.Socket thisSocket;
            public byte[] dataBuffer = new byte[1024];
        }
      
        public  void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                SocketPacket theSockId = (SocketPacket)asyn.AsyncState ;
                int iRx  = theSockId.thisSocket.EndReceive (asyn);
                char[] chars = new char[iRx +  1];
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
                System.String szData = new System.String(chars);
                richTextRxMessage.Text = richTextRxMessage.Text + szData;
                WaitForData();
            }
            catch (ObjectDisposedException )
            {
                System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }
        }    
        private void UpdateControls( bool connected )
        {
            buttonConnect.Enabled = !connected;
            buttonDisconnect.Enabled = connected;
            string connectStatus = connected? "Connected" : "Not Connected";
            textBoxConnectStatus.Text = connectStatus;
        }
        void ButtonDisconnectClick(object sender, System.EventArgs e)
        {
            if ( m_clientSocket != null )
            {
                m_clientSocket.Close();
                m_clientSocket = null;
                UpdateControls(false);
            }
        }
       //----------------------------------------------------    
       // This is a helper function used (for convenience) to
       // get the IP address of the local machine
          //----------------------------------------------------
          String GetIP()
       {       
               String strHostName = Dns.GetHostName();
        
               // Find host by name
               IPHostEntry iphostentry = Dns.GetHostByName(strHostName);
        
               // Grab the first IP addresses
               String IPStr = "";
               foreach(IPAddress ipaddress in iphostentry.AddressList){
                IPStr = ipaddress.ToString();
                   return IPStr;
               }
               return IPStr;
       }

转载于:https://www.cnblogs.com/kevinGao/archive/2011/12/20/2776051.html

你可能感兴趣的文章
Codeforces Round #394 (Div. 2) 题解
查看>>
hdu 4694 Important Sisters 支配树
查看>>
JSP新闻系统之四后台主页面
查看>>
CSS 垂直居中
查看>>
ASP.NET MVC 在控制器中接收视图表单POST过来的数据方法
查看>>
day20 模块
查看>>
day 27 模块和包 面向对象的复习
查看>>
08-Location总结图解
查看>>
python装饰器使用及理解
查看>>
JAVA规则引擎JSR-94笔札
查看>>
Azure IOT (EventHub + Stream Analytics + Table Storage)的使用
查看>>
centos7安装lamp
查看>>
ASP.NET Core 1.0中的管道-中间件模式
查看>>
Docker 安装mysql以及外部访问
查看>>
spring boot中yml配置文件里横线的意思
查看>>
Numpy——进阶篇
查看>>
Django - Xadmin 组件(一)
查看>>
LeetCode OJ 之 Number of Digit One (数字1的个数)
查看>>
也谈如何获取真实正确的 Windows 系统版本号
查看>>
git基本操作
查看>>