1. 程式人生 > >C# socket連線斷開問題

C# socket連線斷開問題

這一篇文章,我將圖文並茂地介紹Socket程式設計的基礎知識,我相信,如果你按照步驟做完實驗,一定可以對Socket程式設計有更好地理解。

第一步:建立解決方案

image

第二步:建立服務端程式

這裡可以選擇“Console Application”這個型別,比較方便除錯

image

然後編寫如下程式碼,實現伺服器的基本功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;

namespace
SocketServer { class Program { /// <summary> /// Socket Server 演示 /// 作者:陳希章 /// </summary> /// <param name="args"></param> static void Main(string[] args) { //建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字) var socket = new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //將該socket繫結到主機上面的某個埠 //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx socket.Bind(new IPEndPoint(IPAddress.Any, 4530)); //啟動監聽,並且設定一個最大的佇列長度 //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4); Console.WriteLine("Server is ready!"); Console.Read(); } } }

現在可以啟動除錯一下看看效果如何,正常情況下應該會看到一個提示,因為我們需要在TCP 4530埠進行監聽,所以防火牆會有提示。

image

點選“Allow access”

image

這樣,我們的伺服器就可以開始監聽了。但是這有什麼用呢?是的,沒有什麼用。

我們還需要為伺服器新增一些功能,例如接受傳入的請求,給客戶端傳送訊息,或者從客戶端接收訊息等等

第三步:接受傳入的請求

我們需要通過Accept,或者(BeginAccept)來接受傳入的請求,請注意下面程式碼中的紅色部分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;

namespace SocketServer
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //將該socket繫結到主機上面的某個埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

            //啟動監聽,並且設定一個最大的佇列長度
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
            socket.Listen(4);

            //開始接受客戶端連線請求
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
            socket.BeginAccept(new AsyncCallback((ar) =>
            {
                //這就是客戶端的Socket例項,我們後續可以將其儲存起來
                var client = socket.EndAccept(ar);

                //給客戶端傳送一個歡迎訊息
                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));
            }), null);


            Console.WriteLine("Server is ready!");
            Console.Read();
        }
    }
}

wow,看起來不錯對吧,我們趕緊做一個客戶端來測試一下吧

第四步:建立客戶端

我們還是使用一個Console Application

image

新增如下的程式碼,並且建立客戶端連線

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//匯入的名稱空間
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個Socket
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //連線到指定伺服器的指定埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
            socket.Connect("localhost", 4530);


            Console.WriteLine("connect to the server");
            Console.Read();

        }
    }
}

依次選擇SocketServer和SocketClient這兩個專案,分別將其啟動為除錯狀態(右鍵選單,Debug=>Start new instance)

image

我們看到兩個程式都工作正常。

但是,在客戶端怎麼沒有收到伺服器發過來的訊息呢?那是因為,我們沒有在客戶端提供這方面的功能。

第五步:在客戶端中實現接受訊息的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//匯入的名稱空間
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個Socket
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //連線到指定伺服器的指定埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
            socket.Connect("localhost", 4530);

            //實現接受訊息的方法

            var buffer = new byte[1024];//設定一個緩衝區,用來儲存資料
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) =>
            {
                //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                var length = socket.EndReceive(ar);
                //讀取出來訊息內容
                var message = Encoding.Unicode.GetString(buffer, 0, length);
                //顯示訊息
                Console.WriteLine(message);

            }), null);

            Console.WriteLine("connect to the server");
            Console.Read();

        }
    }
}

請注意以上紅色的部分,我們用了BeginReceive方法進行非同步的訊息偵聽,如果收到了,我們就打印出來

image

看起來已經實現了我們需求了:伺服器給客戶端發了一個訊息,而客戶端也已經收到了。

但是,這遠遠不夠,因為它們之間的通訊不僅僅是一次性的,那麼如果伺服器要不斷地給客戶端發訊息,例如每隔兩秒鐘就傳送一個訊息,如何實現呢?

第六步:實現伺服器定期向客戶端發訊息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;

namespace SocketServer
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //將該socket繫結到主機上面的某個埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

            //啟動監聽,並且設定一個最大的佇列長度
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
            socket.Listen(4);

            //開始接受客戶端連線請求
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
            socket.BeginAccept(new AsyncCallback((ar) =>
            {
                //這就是客戶端的Socket例項,我們後續可以將其儲存起來
                var client = socket.EndAccept(ar);

                //給客戶端傳送一個歡迎訊息
                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));


                //實現每隔兩秒鐘給伺服器發一個訊息
                //這裡我們使用了一個定時器
                var timer = new System.Timers.Timer();
                timer.Interval = 2000D;
                timer.Enabled = true;
                timer.Elapsed += (o, a) =>
                {
                    client.Send(Encoding.Unicode.GetBytes("Message from server at " +DateTime.Now.ToString()));
                };
                timer.Start();

            }), null);


            Console.WriteLine("Server is ready!");
            Console.Read();
        }
    }
}

我們還要實現在客戶端一直監聽訊息的機制,而不是一次性接收.請注意下面紅色的部分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//匯入的名稱空間
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個Socket
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //連線到指定伺服器的指定埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
            socket.Connect("localhost", 4530);
            Console.WriteLine("connect to the server");

            //實現接受訊息的方法

            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage),socket);

            Console.Read();

        }


        static byte[] buffer = new byte[1024];

        public static void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                var socket = ar.AsyncState as Socket;

                //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                var length = socket.EndReceive(ar);
                //讀取出來訊息內容
                var message = Encoding.Unicode.GetString(buffer, 0, length);
                //顯示訊息
                Console.WriteLine(message);

                //接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch(Exception ex){
                Console.WriteLine(ex.Message);
            }
        }
    }
}

重新除錯起來,看起來的效果如下圖所示

image

我們繼續做下面的實驗,一步一步地研究Socket通訊中可能遇到的一些問題

請先關閉掉客戶端這個程式,而不要關閉服務端程式,這時會發現一個錯誤

image

這個錯誤很容易理解,因為客戶端已經關閉,也就是客戶端那個Socket已經不存在了,伺服器還繼續向它傳送訊息當然會出錯。所以,從可靠性方面的考慮,我們必須在傳送訊息之前檢測Socket的活動狀態

第七步:檢測客戶端的活動狀態

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;

namespace SocketServer
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //將該socket繫結到主機上面的某個埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

            //啟動監聽,並且設定一個最大的佇列長度
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
            socket.Listen(4);

            //開始接受客戶端連線請求
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
            socket.BeginAccept(new AsyncCallback((ar) =>
            {
                //這就是客戶端的Socket例項,我們後續可以將其儲存起來
                var client = socket.EndAccept(ar);

                //給客戶端傳送一個歡迎訊息
                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));


                //實現每隔兩秒鐘給伺服器發一個訊息
                //這裡我們使用了一個定時器
                var timer = new System.Timers.Timer();
                timer.Interval = 2000D;
                timer.Enabled = true;
                timer.Elapsed += (o, a) =>
                {
                    //檢測客戶端Socket的狀態
                    if(client.Connected)
                    {
                        try
                        {
                            client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
                        }
                        catch(SocketException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                    else
                    {
                        timer.Stop();
                        timer.Enabled = false;
                        Console.WriteLine("Client is disconnected, the timer is stop.");
                    }
                };
                timer.Start();

            }), null);


            Console.WriteLine("Server is ready!");
            Console.Read();
        }
    }
}

上面程式碼的邏輯很清楚,但有時候還是會觸發那個SocketException。為什麼呢?這是因為我們的Timer是每隔兩秒鐘檢查一次,那麼就很可能有一種情況,我們檢查的時候,它還是連線狀態,訊息發出去之後,它斷開了。這種情況肯定是存在的。所以要用Try..catch的結構

目前我們實現的場景很簡單,伺服器只管發訊息,客戶端只管收訊息。但實際工作中,可能希望伺服器和客戶端都能收發訊息。請看下一節

第八步:實現雙向收發訊息

先看服務端的修改

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;

namespace SocketServer
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //將該socket繫結到主機上面的某個埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

            //啟動監聽,並且設定一個最大的佇列長度
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
            socket.Listen(4);

            //開始接受客戶端連線請求
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
            socket.BeginAccept(new AsyncCallback((ar) =>
            {
                //這就是客戶端的Socket例項,我們後續可以將其儲存起來
                var client = socket.EndAccept(ar);

                //給客戶端傳送一個歡迎訊息
                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));


                //實現每隔兩秒鐘給伺服器發一個訊息
                //這裡我們使用了一個定時器
                var timer = new System.Timers.Timer();
                timer.Interval = 2000D;
                timer.Enabled = true;
                timer.Elapsed += (o, a) =>
                {
                    //檢測客戶端Socket的狀態
                    if(client.Connected)
                    {
                        try
                        {
                            client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
                        }
                        catch(SocketException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                    else
                    {
                        timer.Stop();
                        timer.Enabled = false;
                        Console.WriteLine("Client is disconnected, the timer is stop.");
                    }
                };
                timer.Start();


                //接收客戶端的訊息(這個和在客戶端實現的方式是一樣的)
                client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);

            }), null);


            Console.WriteLine("Server is ready!");
            Console.Read();
        }

        static byte[] buffer = new byte[1024];

        public static void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                var socket = ar.AsyncState as Socket;

                //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                var length = socket.EndReceive(ar);
                //讀取出來訊息內容
                var message = Encoding.Unicode.GetString(buffer, 0, length);
                //顯示訊息
                Console.WriteLine(message);

                //接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch(Exception ex){
                Console.WriteLine(ex.Message);
            }
        }
    }
}

可以看出來,為了讓伺服器可以接受訊息,其實並不需要什麼特別的設計,與客戶端接受訊息其實可以是一樣的

再來看看客戶端的修改

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//匯入的名稱空間
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個Socket
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //連線到指定伺服器的指定埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
            socket.Connect("localhost", 4530);
            Console.WriteLine("connect to the server");

            //實現接受訊息的方法

            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

            //接受使用者輸入,將訊息傳送給伺服器端
            while(true)
            {
                var message = "Message from client : " + Console.ReadLine();
                var outputBuffer = Encoding.Unicode.GetBytes(message);
                socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
            }

        }


        static byte[] buffer = new byte[1024];

        public static void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                var socket = ar.AsyncState as Socket;

                //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                var length = socket.EndReceive(ar);
                //讀取出來訊息內容
                var message = Encoding.Unicode.GetString(buffer, 0, length);
                //顯示訊息
                Console.WriteLine(message);

                //接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

我在這裡做了一個死迴圈,使用者可以不斷地輸入,這些訊息會被髮送給伺服器。如下圖所示

image

【備註】因為伺服器每隔兩秒鐘會發送新訊息過來,所以在輸入的時候,動作要稍快一點啦

本文最後探討一個問題,就是如何讓我們的伺服器可以支援多個客戶端

第九步:支援多個客戶端

這個步驟只需要修改服務端程式即可

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;

namespace SocketServer
{
    class Program
    {
        /// <summary>
        /// Socket Server 演示
        /// 作者:陳希章
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //將該socket繫結到主機上面的某個埠
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

            //啟動監聽,並且設定一個最大的佇列長度
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
            socket.Listen(4);

            //開始接受客戶端連線請求
            //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);


            Console.WriteLine("Server is ready!");
            Console.Read();
        }


        public static void ClientAccepted(IAsyncResult ar)
        {

            var socket = ar.AsyncState as Socket;

            //這就是客戶端的Socket例項,我們後續可以將其儲存起來
            var client = socket.EndAccept(ar);

            //給客戶端傳送一個歡迎訊息
            client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));


            //實現每隔兩秒鐘給伺服器發一個訊息
            //這裡我們使用了一個定時器
            var timer = new System.Timers.Timer();
            timer.Interval = 2000D;
            timer.Enabled = true;
            timer.Elapsed += (o, a) =>
            {
                //檢測客戶端Socket的狀態
                if(client.Connected)
                {
                    try
                    {
                        client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
                    }
                    catch(SocketException ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                else
                {
                    timer.Stop();
                    timer.Enabled = false;
                    Console.WriteLine("Client is disconnected, the timer is stop.");
                }
            };
            timer.Start();


            //接收客戶端的訊息(這個和在客戶端實現的方式是一樣的)
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);

            //準備接受下一個客戶端請求
            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
        }

        static byte[] buffer = new byte[1024];

        public static void ReceiveMessage(IAsyncResult ar)
        {

            try
            {
                var socket = ar.AsyncState as Socket;

                //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                var length = socket.EndReceive(ar);
                //讀取出來訊息內容
                var message = Encoding.Unicode.GetString(buffer, 0, length);
                //顯示訊息
                Console.WriteLine(message);

                //接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch(Exception ex){
                Console.WriteLine(ex.Message);
            }
        }
    }
}

最後除錯起來看到的效果如下圖

image

相關推薦

C# socket連線斷開問題

這一篇文章,我將圖文並茂地介紹Socket程式設計的基礎知識,我相信,如果你按照步驟做完實驗,一定可以對Socket程式設計有更好地理解。 第一步:建立解決方案 第二步:建立服務端程式 這裡可以選擇“Console Application”這個型別,比較方便除錯 然後編寫如下程式碼,實現伺服器的基本

C# Socket連線請求超時機制

轉自:http://www.cnblogs.com/weidagang2046/archive/2009/02/07/1385977.html 作者:RazanPaul 譯者:Todd Wei 原文:http://www.codeproject.com/KB/IP/Time

安卓 java有效判斷Socket連線斷開和安卓TCP測試APP(客戶+服務端一體)

1. 利用socket提供的isConnected()與isClosed()方法來判斷。但這種方式只是本地判斷,只是本地操作connect()或close()方法後儲存的一個狀態,對於遠端伺服器主動斷開

C 中設定Socket連線請求的超時

                C#中, 對於Socket的請求,無論是同步還是非同步,都沒有提供超時機制,SendTimeout,ReceiveTimeout均無用..對於需要測試網路是否正常連線的情況下,,超時控制很是有用,  如果伺服器不存在,或是客戶機網路異常,, 在沒有設定超時的情況下,,Socke

c#關於socket連線超時控制的方案

之前有一個專案用到Remoting技術,當遠端的地址無效或伺服器沒執行時,訪問遠端物件方法,會經過幾十秒的時間才丟擲異常。因為我用的是tcp模式,所以想到可以用socket來測試連線,就可以在呼叫遠端物件方法之前知道遠端服務有沒有執行。程式碼如下: public clas

關於C#Socket斷開重連問題

      TCP客戶端可以向TcpServer傳送資料包時,若網路斷開,原來的連線就會失效,出現以下錯誤提示: 斷開套接字連線後,只能通過非同步方式再次重新連線,而且只能連線到不同的 EndPoint。在操作完成前,在將不會退出的執行緒上必須呼叫 BeginConnect

網頁websocket正常和C#websocket-csharp 斷開連線問題

最近在做一個pc端的 websocket客戶端。從網上找了 websocket-csharp 這個包。 一切正常。。。 可是後來發現websocket 在沒有資料推送的情況下過一段時間,會沒有資料推送。 但我的websocket 有重連機制。就是在OnClose 事件裡重新

如何判斷一個SOCKET連線是否已經斷開

1. 根據ERRNO和recv結果進行判斷 在UNIX/Linux下,非阻塞模式SOCKET可以採用recv+MSG_PEEK的方式進行判斷,其中MSG_PEEK保證了僅僅進行狀態判斷,而不影響資料接收 對於主動關閉的SOCKET, recv返回-1,而且errno被置為9(#define EBADF 

C#中設定Socket連線請求的超時

C#中, 對於Socket的請求,無論是同步還是非同步,都沒有提供超時機制,SendTimeout,ReceiveTimeout均無用.. 對於需要測試網路是否正常連線的情況下,,超時控制很是有用,  如果伺服器不存在,或是客戶機網路異常,, 在沒有設定超時的情況下,,So

C# Socket.Connect連線請求超時機制

作者:RazanPaul 譯者:Todd Wei 原文:http://www.codeproject.com/KB/IP/TimeOutSocket.aspx 轉自:http://hi.baidu.com/wf_studio/blog/item/d0a339f4c70c9a

問題:解決Android中socket自動斷開連線

在strain sensor APP開發過程當中,需要客戶端不斷地讀取從藍芽模組傳送過來的資料。 遇到的問題: 連線上藍芽模組後,能夠正常讀數,藍芽資料傳送速率為0.03s每個。大概在傳送了342個數據之後,突然接收不到資料了。 後來查找了資料,顯示原來A

C++ Socket C/S ,實現客戶端,伺服器端斷開重連

// WindowsSocketServer.cpp : 定義控制檯應用程式的入口點。 #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> #include <

Socket 程式設計經驗談---如何處理socket連線後伺服器端或客戶端的斷開

現象:伺服器端等待客戶斷連線,當socket連線建立後,如果客戶端異常斷開,伺服器會丟擲異常,從而導致程式執行中斷 目標:希望伺服器一直等待連線,客戶端中斷後程式不退出,而客戶端重新恢復後可以繼續保持連線 程式碼: public class Receive { publi

C++socket客戶端select非同步連線傳送接收資料

這段時間公司專案一直用網口同底層裝置互動,顧記錄下,具體見程式碼: int RFID_STANDARDPROTOCOL_API __stdcall Socket_SendAndRecv(SOCKET Socket, unsigned char * SendBuf

客戶端怎麼判斷Socket連線已與伺服器斷開

First of all , Server's socekt is not close. if u had closed client's socekt , u should creat it again when u want to connect server's. socket即使close了,也還

c++ socket 編程步驟

socket 編程 客戶機 connect 服務器 nbsp listen 步驟 ket sock 服務器 socket() bind() listen()                   客戶機 accept()

C# Socket網絡編程精華篇

類型 重復 呼叫 物理 http協議 nts byte .so binding 幾個和Socket編程緊密相關的概念: TCP/IP層次模型 當然這裏我們只討論重要的四層 01,應用層(Application):應用層是個很廣泛的概念,有一些基本相

使用C#+socket實現用移動設備控制的虛擬手柄

sock endpoint network 回車 byte arraylist program 行處理 favor 最近在和同學玩死神vs火影。以懷念小時候,突然認為用鍵盤玩的不夠暢快,因此萌生了寫一個虛擬手柄的念頭。 我的思路是在移動設備(iOS、Android)上實

C#socket通訊服務器(連接狀態監控)

del endpoint etc acc ipa ack ipaddress ava listening class SocketServerManager { public delegate void ConnectStateEventHandler

C# socket 無法再次接收到廣播包的回復

soc 端口 share 對象 進行 使用 釋放 回復 har 問題描述   當進行了一次成功的廣播後(發出並收到回復),再進行一次廣播後,無法接到手回復信息,但通過Wiresharek能看到,接收方已經成功返回回復信息。 原因   設置了socket可重復綁定相同端