2013-06-01 105 views
1

我目前在vb.net 2010中創建了多客戶端服務器應用程序。我使用套接字和網絡流來讀取數據。vb.net 2010套接字突然停止?

很難解釋發生了什麼,並且發佈代碼可能對我的項目規模沒有太大的好處。然而,我只是想知道我在做什麼,然後發生了什麼,希望有人能幫助我,或者給我一些關於可能發生的事情的想法:)。

我啓動了服務器和客戶端,他們都連接和異步偵聽。在我的客戶端,我輸入登錄信息並使用網絡流將其發送到服務器。服務器讀取一切正常,再次開始監聽,處理數據,向客戶端發送帳戶信息,表示客戶端已連接,然後在完成處理數據並退出該功能後隨機關閉。發生這種情況時,客戶端正在接收數據,再次開始監聽,處理數據,說套接字已連接,然後一旦完成,在功能完成後隨機關閉。

現在我已經確定其他代碼沒有影響套接字,並且評論了所有不需要的東西,並且允許每個服務器和客戶端保持循環。 (創建一個遊戲,所以有一個serverloop和gameloop)它只是看起來像所有的工作,然後退出閱讀子,並停止聽更多的閱讀。

如果有人有任何想法,將不勝感激。提前致謝!

的代碼,每邊是相同的:

接收數據:

Private Sub ReceiveOneByte(ByVal ar As IAsyncResult) 
    Dim netStream As NetworkStream 
    Dim InData() As Byte 
    Dim DataLen(3) As Byte 
    Dim inLength As Integer 
    Dim Buffer As New clsBuffer 
    Dim MsgType As Integer 
    Dim NewData() As Byte 
    Dim Empty() As Byte 

    SyncLock Client_TCP.Client 
     Try 
      netStream = New NetworkStream(Client_TCP.Client) 
     Catch ex As Exception 
     End Try 
     ' gets length of data comming in 
     Try 
      netStream.Read(DataLen, 0, 4) 
     Catch ex As Exception 
     End Try 
     inLength = BitConverter.ToInt32(DataLen, 0) 

     ' gets data comming in 
     ReDim InData(inLength) 
     netStream.Read(InData, 0, inLength) 
     netStream.Flush() 
    End SyncLock 

    Buffer.WriteBytes(InData) 
    MsgType = Buffer.ReadLong 

    If InData.Length > (InData.Length - 4) Then 
     ReDim NewData(InData.Length - 5) 
     Array.ConstrainedCopy(InData, 4, NewData, 0, NewData.Length - 1) 
     HandleDataSub(MsgType)(0, NewData) 
    Else 
     HandleDataSub(MsgType)(0, Empty) 
    End If 

    Client_TCP.GetStream.BeginRead(Readbyte, 0, 1, New AsyncCallback(AddressOf ReceiveOneByte), Nothing) 

End Sub 

發送數據:

Public Sub Send(ByVal Data() As Byte) 
    Dim netStream As NetworkStream 
    Dim len As Integer = Data.Length 
    Dim DataLen() As Byte = BitConverter.GetBytes(len) 
    Dim bit(0) As Byte 
    bit(0) = 1 
    SyncLock Client_TCP.Client 
     netStream = New NetworkStream(Client_TCP.Client) 
     netStream.Write(bit, 0, 1) 
     netStream.Write(DataLen, 0, 4) 
     netStream.Write(Data, 0, Data.Length) 
     'netStream.Flush() 
    End SyncLock 
End Sub 
+0

您可以發佈任何你的套接字處理代碼?特別是,我們可以看到出口?你使用哪種異步API? (有幾個異步套接字API)您是否檢查套接字錯誤?你如何捆綁電線上的單獨消息等?如果您使用的是較新的異步API,您是否正在檢查ReceiveAsync方法中的返回值? (這是非常重要的) –

+0

希望這會有所幫助。 –

回答

0

當您使用IAsyncResult Begin*(...)模式,它是需要您可以撥打End*(...)方法。這是它會告訴你任何問題的地方。它可能試圖真的很難告訴你什麼是問題,但你沒有檢查。順便說一下,在這種特殊情況下,您也可以檢查返回的字節數 - 如果流意外終止,則可能爲0。所以,在你的方法頂部添加的第一件事是(僞...好,我是誰在開玩笑... C#):

try { 
    int bytesRead = Client_TCP.GetStream.EndRead(ar); 
    if(bytesRead < 1) { 
     // EOF; do something 
    } else if(bytesRead == 1) { 
     // this is your expected scenario: your code here 
    } else { 
     // well that's just crazy talk! 
    } 
} catch (Exception ex) { 
    // log this exception; shouldn't throw, because you are on a worker 
    // thread here; you *might* want to clean up, though 
} 

這可能會幫助您開始診斷問題。還應該注意的是,這是而不是使用套接字的最有效方式 - 但它應該工作,並且我不想通過開始討論替代異步API等來混淆事情。

+0

好吧,我用你給我的東西,幫助了更多。現在我遇到的問題是,當它通過所有工作代碼運行時,它有時會無緣無故地斷開連接。 –

+0

@TravisHintz定義「斷開連接」。一個EOF?一個例外?要麼...?但是:有趣的事實 - 套接字確實偶爾會中斷。 –

+0

很難解釋,但貫穿所有的閱讀就好,它會處理數據就好像它應該。只是,當它正在運行並且服務器和客戶端正在相互交談時,套接字就會斷開連接而沒有錯誤。它可以播放數據並將其放置到一個新的數組中,並且套接字將發出。 –