Socket通信常用方法



使用tcp協議,鏈接服務器的方法
/// <summary> /// 連接使用tcp協議的服務端 /// </summary> /// <param name="ip">服務端的ip</param> /// <param name="port">服務端的端口號</param> /// <returns></returns> public static Socket ConnectServer(string ip, int port) { Socket s = null; try { IPAddress ipAddress = IPAddress.Parse(ip); IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port); s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); s.Connect(ipEndPoint); if (s.Connected == false) s = null; } catch (Exception) { } return s; }

發送數據:

        /// <summary>
        /// 向遠程主機發送數據
        /// </summary>
        /// <param name="socket">連接到遠程主機的socket</param>
        /// <param name="buffer">待發送數據</param>
        /// <param name="outTime">發送超時時長,單位是秒(為-1時,將一直等待直到有數據需要發送)</param>
        /// <returns>0:發送成功;-1:超時;-2:出現錯誤;-3:出現異常</returns>
        public static int SendData(Socket socket, byte[] buffer, int outTime)
        {
            if (socket == null || socket.Connected == false)
            {
                throw new ArgumentException("參數socket為null,或者未連接到遠程計算機");
            }
            if (buffer == null || buffer.Length == 0)
            {
                throw new ArgumentException("參數buffer為null ,或者長度為 0");
            }

            int flag = 0;
            try
            {
                int left = buffer.Length;
                int sndLen = 0;
                int hasSend = 0;

                while (true)
                {
                    if ((socket.Poll(outTime * 1000, SelectMode.SelectWrite) == true))
                    {   
                        // 收集了足夠多的傳出數據后開始發送
                        sndLen = socket.Send(buffer, hasSend, left, SocketFlags.None);
                        left -= sndLen;
                        hasSend += sndLen;

                        // 數據已經全部發送
                        if (left == 0)
                        {                                        
                            flag = 0;
                            break;
                        }
                        else
                        {
                            // 數據部分已經被發送
                            if (sndLen > 0)
                            {                                    
                                continue;
                            }
                            else // 發送數據發生錯誤
                            {                                                
                                flag = -2;
                                break;
                            }
                        }
                    }
                    else // 超時退出
                    {                                                        
                        flag = -1;
                        break;
                    }
                }
            }
            catch (SocketException)
            {
                //Log
                flag = -3;
            }
            return flag;
        }

發送string數據,用到方法System.Text.Encoding.Default.GetBytes對上面的方法進行封裝

     /// <summary>
        /// 向遠程主機發送數據
        /// </summary>
        /// <param name="socket">連接到遠程主機的socket</param>
        /// <param name="buffer">待發送的字符串</param>
        /// <param name="outTime">發送數據的超時時間,單位是秒(為-1時,將一直等待直到有數據需要發送)</param>
        /// <returns>0:發送數據成功;-1:超時;-2:錯誤;-3:異常</returns>
        public static int SendData(Socket socket, string buffer, int outTime)
        {
            if (buffer == null || buffer.Length == 0)
            {
                throw new ArgumentException("buffer為null或則長度為0.");
            }
            return SendData(socket, System.Text.Encoding.Default.GetBytes(buffer), outTime);
        }

接收數據:

        /// <summary>
        /// 接收遠程主機發送的數據
        /// </summary>
        /// <param name="socket">要接收數據且已經連接到遠程主機的</param>
        /// <param name="buffer">接收數據的緩沖區(需要接收的數據的長度,由 buffer 的長度決定)</param>
        /// <param name="outTime">接收數據的超時時間,單位秒(指定為-1時,將一直等待直到有數據需要接收)</param>
        /// <returns></returns>
        public static int RecvData(Socket socket, byte[] buffer, int outTime)
        {
            if (socket == null || socket.Connected == false)
            {
                throw new ArgumentException("socket為null,或者未連接到遠程計算機");
            }
            if (buffer == null || buffer.Length == 0)
            {
                throw new ArgumentException("buffer為null ,或者長度為 0");
            }

            buffer.Initialize();
            int left = buffer.Length;
            int curRcv = 0;
            int hasRecv=0;
            int flag = 0;

            try
            {
                while (true)
                {
                    if (socket.Poll(outTime * 1000, SelectMode.SelectRead) == true)
                    {   
                        // 已經有數據等待接收
                        curRcv = socket.Receive(buffer, hasRecv, left, SocketFlags.None);
                        left -= curRcv;
                        hasRecv += curRcv;

                        // 數據已經全部接收 
                        if (left == 0)
                        {                                    
                            flag = 0;
                            break;
                        }
                        else
                        {
                            // 數據已經部分接收
                            if (curRcv > 0)
                            {                                
                                continue;
                            }
                            else  // 出現錯誤
                            {                                           
                                flag = -2;
                                break;
                            }
                        }
                    }
                    else // 超時退出
                    {                                                    
                        flag = -1;
                        break;
                    }
                }
            }
            catch (SocketException)
            {
                //Log
                flag = -3;
            }
            return flag;
        }

原文地址:http://blog.csdn.net/love__coder/article/details/6649688


免責聲明!

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



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