zoukankan      html  css  js  c++  java
  • 【C#】 Socket通讯客户端程序

    这段时间一直在优化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;
           }


  • 相关阅读:
    HashSet集合保证元素唯一性的原理 底层代码 ---有用
    集合(下) ---有用
    集合(上) Colection方法 并发修改异常
    Hive -- Hive面试题及答案sql语句 ---阿善有时间看
    hive面试题总结(2020最新版) hive优化方面 ---阿善重要
    hive面试题总结(2020最新版)
    Hive常见面试题1.0
    Hive面试题收集 ---阿善重要
    promise的三个缺点
    js中常见的高阶函数
  • 原文地址:https://www.cnblogs.com/kevinGao/p/2294465.html
Copyright © 2011-2022 走看看