這是我的第一篇文章在這裏,所以請溫柔=)c#異步服務器/客戶端。插座(在客戶端)斷開「隨機」
我正在寫一個數據庫的管理我的辦公室的asynchronuos服務器/客戶端應用程序,我測試它在我的電腦本地,它工作正常。當我在另一臺機器上傳服務器工具時,我發現一些令我瘋狂的事情:服務器/客戶端只處理第一個查詢,當我發送另一個查詢時,服務器和客戶端崩潰。
經過調試模式下的線路後,我發現問題:在beginconnect()(在第二個查詢期間)之後套接字已連接,但是當調試器到達beginsend()行時,套接字斷開連接客戶端,服務器端的套接字似乎連接)。
我不知道它是如何發生的,每當我發送一個新的查詢時,套接字就會重新實例化,當然在查詢過程(發送/接收)完成後關閉並處理它。我的想法是,處理套接字不會立即發生,但過了一段時間(但爲什麼總是在新的beginconnect()和beginsend()之間?)。你有什麼線索嗎?或者我應該在精神病院預留一個房間?
*新的零件(編者)*
well..here了!這次客戶端的套接字對整個會話保持打開狀態(套接字關閉僅在客戶端工具關閉時發生),但我收到另一種錯誤:「System.Net.Sockets.SocketException(0x80004005):現有連接被強制關閉System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)「遠程主機」 經過一些谷歌搜索後,我發現這種錯誤通常是由連接另一端的服務器觸發的,所以我嘗試了「我的」服務器代碼行來確定此連接關閉命令的位置。我發現,該問題可能是在下面的代碼段:
private static void SendCallback(IAsyncResult ar)
{
Console.WriteLine("send callback");
try
{
// Retrieve the socket from the state object.
Socket handler = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("\nQuery answer sent to client");
handler.Shutdown(SocketShutdown.Both);
//handler.Disconnect(true);
//handler.Dispose();
state.content = new List<byte[]>();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Console.ReadKey();
}
}
刪除handler.shutdown線客戶端不再能夠檢測傳輸的結束(不是真正的問題,是的最後部分發送的數據包,因此可以將其用作觸發器......至少我認爲)。任何建議?我讀了關於Keepalive的一些信息,但我不明白如何設置它,以及在這種情況下是否真的有必要。感謝您的所有努力。
您是否考慮過使用networkcomms.net等網絡庫?這可能爲您節省網絡方面的相當一段時間。這裏有一個很好的例子:http://www.networkcomms.net/creating-a-wpf-chat-client-server-application/ – MarcF
感謝這個建議,但我已經寫了我的com協議的個人庫我希望能夠解決這個問題,並理解事情的工作方式。 – foxfox