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;
           }


  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/kevinGao/p/2776051.html
Copyright © 2011-2022 走看看