socket 異步 發送 接收 數據


                Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //偵聽socket
                //socketClints.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                socketClints.Bind(new IPEndPoint(IPAddress.Any, portSocketInt));

                socketClints.Listen(100);
                socketClints.BeginAccept(new AsyncCallback(ClientAccepted), socketClints);  //開始接收來自瀏覽器的http請求(其實是socket連接請求)
        #region 客戶端連接成功

        byte[] buffer = new byte[1024];
        /// <summary>  
        /// 客戶端連接成功  
        /// </summary>  
        /// <param name="ar"></param>  
        public void ClientAccepted(IAsyncResult ar)
        {
            #region            
            var socket = ar.AsyncState as Socket;
            //這就是客戶端的Socket實例,我們后續可以將其保存起來  
            var client = socket.EndAccept(ar);
       

            //接收客戶端的消息(這個和在客戶端實現的方式是一樣的)異步  
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
            //准備接受下一個客戶端請求(異步)  
            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
            #endregion
        }
        #endregion

        #region 接收客戶端的信息
        /// <summary>  
        /// 接收某一個客戶端的消息  
        /// </summary>  
        /// <param name="ar"></param>  
        public void ReceiveMessage(IAsyncResult ar)
        {
            int length = 0;
           
            var socket = ar.AsyncState as Socket;
            //客戶端IP地址和端口信息          
            try
            {
                #region
                //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx  
                length = socket.EndReceive(ar);
              
                //讀取出來消息內容                
                string recv_request = Encoding.UTF8.GetString(buffer, 0, length);
                //輸出接收信息  
                //WriteLine(clientipe + " :" + message, ConsoleColor.White);
                //消息處理    
                socketResolve(recv_request, socket); 
                //服務器發送消息  
                //socket.Send(Encoding.UTF8.GetBytes("server received data")); //默認Unicode  
                //接收下一個消息(因為這是一個遞歸的調用,所以這樣就可以一直接收消息)異步  
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
                #endregion
            }
            catch 
            {
                //設置計數器  
               
              
            }
        }
//發送方法 需要修改數據
public void sendData()
{

        byte[] data=System.Text.Encoding.UTF8.GetBytes(Encrypt(txt,sKey));
            byte[] byLen = BitConverter.GetBytes(data.Length);
            socket.Send(byLen);
            //socket.Send();
            socket.Send(data);
}
#endregion

 

 

客戶端:

  ThStartBool=true;          
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); while (ThStartBool) { try { newSocket.Connect(ip, int.Parse(port)); socketSend("url/" + obj.ToString() + "_OK/"); Invoke(updateLableText, "連接成功"); //ReceiveObject state = new ReceiveObject() { Client = newSocket }; //newSocket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), state);    newSocket.BeginReceive(m_byLen, 0, m_byLen.Length, SocketFlags.None, new AsyncCallback(RecvLen), newSocket); ThStartBool = false; } catch (Exception) { Thread.Sleep(3000);//3秒后重新連接 } }
    
      int m_nIndex = 0, m_nRecvLen = 0;
        byte[] m_byLen = new byte[4];
        byte[] m_byData = null;


        private void RecvLen(IAsyncResult ar)
        {
            try
            {
                Socket sock = ar.AsyncState as Socket;
                int nLen = sock.EndReceive(ar);

                m_nRecvLen += nLen;
                if (m_nRecvLen != m_byLen.Length)
                {
                    m_nIndex += nLen;
                    sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
                }
                else
                {
                    m_nIndex = m_nRecvLen = 0;
                    m_byData = new byte[BitConverter.ToUInt32(m_byLen, 0)];
                    sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock);

                }
            }

            catch (Exception ex)
            {
                Invoke(updateLableText, "與服務器失去聯系,正在嘗試重連");
                ThStartBool = true;
                th = new Thread(new ParameterizedThreadStart(ThStartData));
                th.Start(signID);
            }
        }

        private void RecvData(IAsyncResult ar)
        {
            Socket sock = ar.AsyncState as Socket;
            int nLen = sock.EndReceive(ar);
            m_nRecvLen += nLen;
            if (m_nRecvLen != m_byData.Length)
            {
                m_nIndex += nLen;
                sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock);
            }
            else
            {
                m_nIndex = m_nRecvLen = 0;
                //MessageBox.Show(Encoding.UTF8.GetString(m_byData));
                string sKey = signID.Substring(2, 3) + signID.Substring(5, 3) + signID.Substring(10, 2);
                //讀取出來消息內容  
                var message = Encoding.UTF8.GetString(m_byData);           
             
                dataParsing(Decrypt(message.ToString(), sKey));
                sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM