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