我是網絡編程的新手,並試圖在ICE API測試服務器和我的應用程序之間建立通信。下面的代碼只有一次,當我試圖登錄到服務器。換句話說,當我發送我的登錄消息服務器以成功登錄回覆我。一旦我得到這個,我發送下一條消息到服務器,但答覆我得到0,這意味着服務器已經斷開連接。有人可以看看我的客戶邏輯,並指出我爲什麼會出現上述情況的正確方向。請幫我解決這個問題,因爲我已經在沒有結果的情況下待了幾天。謝謝。.Net TCP客戶端通信問題
Public Function connect() As Boolean
bConnected = True
Dim port As Int32 = Convert.ToInt32("80")
Dim server As String = "63.247.113.201"
Try
objClient = New System.Net.Sockets.TcpClient(server, port)
objClient.NoDelay = False
objClient.Client.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, 1)
objClient.GetStream.BeginRead(byReadBuffer, 0, BYTES_TO_READ, New AsyncCallback(AddressOf doRead), Nothing)
Catch ex As Exception
RaiseEvent exErr(ex.ToString)
bConnected = False
End Try
Return bConnected
End Function
Public Function DoTCPRequest(ByVal data As String, ByVal resetSession As Boolean) As String
Dim objSw As IO.StreamWriter
Try
objSw = New IO.StreamWriter(objClient.GetStream)
objSw.Write(data & vbCrLf)
objSw.Flush()
Console.WriteLine("Sent:" + data)
Catch ex As Exception
RaiseEvent exErr(ex.ToString)
End Try
objClient.GetStream.BeginRead(byReadBuffer, 0, BYTES_TO_READ, AddressOf Me.doRead, Nothing)
Return System.Text.Encoding.UTF8.GetString(byReadBuffer, 0, BYTES_TO_READ)
End Function
Private Sub doRead(ByVal ar As System.IAsyncResult)
Dim nTotalRead As Integer
Try
Try
nTotalRead = objClient.GetStream.EndRead(ar) Catch ex As Exception
RaiseEvent exErr(ex.ToString)
End Try
If nTotalRead > 0 Then
Dim szReceivedString As String = System.Text.Encoding.UTF8.GetString(byReadBuffer, 0, nTotalRead)
RaiseEvent dataReceived(szReceivedString)
Console.WriteLine("Recv1:" + szReceivedString)
End If
objClient.GetStream.BeginRead(byReadBuffer, 0, BYTES_TO_READ, New AsyncCallback(AddressOf doRead), Nothing)
Catch ex As Exception
RaiseEvent exErr(ex.ToString)
End Try
End Sub
我刪除了所有評論,我希望現在它更有意義我在那裏做什麼。你能否詳細解釋一下這個問題你的意思是什麼?「你想考慮將BeginRead()放在doRead()中的條件嗎?」。謝謝。 – lberezka 2011-05-31 19:49:42
好的。當doRead獲得控制權時。 1.執行的第一條語句是Steam.EndRead()。 2.下一條語句是否nTotalRead有任何數字在控制檯上顯示收到的字符串。 3.下一條語句是Stream.BeginRead()。這意味着執行必須永遠持續下去。它永遠不會停止。 – SaravananArumugam 2011-05-31 19:58:28
我想這不會是你需要的。通過說'您是否想考慮將BeginRead()放在doRead()中的條件?'中,我的意思是您可以通過在Stream.BeginRead()周圍放置一個條件來避免這種無限循環。條件必須是你需要定義的東西。可能是一些有限的數據,數據的可用性等可能是條件。即IF nTotalBytesRecieved <2048然後objClient.GetStream.BeginRead(...種的 – SaravananArumugam 2011-05-31 19:58:35