C#服務端判斷客戶端socket是否已斷開的方法

剛開始,用Socket類的Connected屬性來實現,卻發現行不通,connected只表示  是在上次 仍是 操做時鏈接到遠程主機。若是在這以後[鏈接的另外一方]斷開了,它還一直返回true, 除非你再經過socket來發送數據。因此經過個屬性來判斷是行不通的!
 後來有人說能夠用Socket.Available屬性來判斷,Socket.Available表示獲取已經從網絡接收且可供讀取的數據量。網絡

msdn中說:若是[鏈接的另外一方]斷開了,它就會拋出異常。然而,這個BUG報告(http://dam.mellis.org/2004/08/net_socket_bugs_gotchas/)卻指出:msdn的說法並不徹底正確,這個屬性只有在少數狀況下才拋出異常。因此,這一招仍是行不通!socket

最後使用socket.Poll()方法來完成實現,此方法是肯定socket的狀態。看下面的代碼:spa

服務端代碼: .net

class Program

    {
        private static List<Socket> list=new List<Socket>(); 
        static void Main(string[] args)
        {            
            Timer timer=new Timer(1000);
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Start();
            Thread thread = new Thread(Listener);
            thread.Start();
        }

        //每秒服務端向客戶端推送

        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (list.Count > 0)
            {
                for (int i = list.Count-1; i >=0; i--)
                {
                    
                    string sendStr = "Server Information";
                    byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                    if (list[i].Poll(1000, SelectMode.SelectRead)) 
            //SelectMode.SelectRead表示,若是已調用 而且有掛起的鏈接,true。             //- 或 - 若是有數據可供讀取,則爲 true。- 或 - 若是鏈接已關閉、重置或終止,則返回 true(此種狀況就表示若客戶端斷開鏈接了,則此方法就返回true); 不然,返回 false
{ list[i].Close();
//關閉socket list.RemoveAt(i);//從列表中刪除斷開的socke continue; } list[i].Send(bs, bs.Length, 0); } } } public static void Listener() { int port = 11000; string host = "192.168.7.36"; /**/ ///建立終結點(EndPoint) IPAddress ip = IPAddress.Parse(host);//把ip地址字符串轉換爲IPAddress類型的實例 IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint類的新實例 /**/ ///建立socket並開始監聽 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立一個socket對像,若是用udp協議,則要用SocketType.Dgram類型的套接字 s.Bind(ipe);//綁定EndPoint對像(2000端口和ip地址) s.Listen(10);//開始監聽 Console.WriteLine("等待客戶端鏈接"); while (true) { /**/ ///接受到client鏈接,爲此鏈接創建新的socket,並接受信息 list.Add(s.Accept());//爲新建鏈接建立新的socket Console.WriteLine("創建鏈接"); string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = list[list.Count-1].Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); /**/ ///給client端返回信息 Console.WriteLine("server get message:{0}", recvStr);//把客戶端傳來的信息顯示出來 string sendStr = "ok!Client send message successful!"; byte[] bs = Encoding.ASCII.GetBytes(sendStr); list[list.Count-1].Send(bs, bs.Length, 0);//返回信息給客戶端 //temp.Close(); } s.Close(); } }

 

 

轉自:http://hi.baidu.com/jack1865/item/3dcba2d3b0e2e29932db904d3d

相關文章
相關標籤/搜索