2011-05-31 67 views
1

我是網絡編程的新手,並試圖在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 
+0

我刪除了所有評論,我希望現在它更有意義我在那裏做什麼。你能否詳細解釋一下這個問題你的意思是什麼?「你想考慮將BeginRead()放在doRead()中的條件嗎?」。謝謝。 – lberezka 2011-05-31 19:49:42

+0

好的。當doRead獲得控制權時。 1.執行的第一條語句是Steam.EndRead()。 2.下一條語句是否nTotalRead有任何數字在控制檯上顯示收到的字符串。 3.下一條語句是Stream.BeginRead()。這意味着執行必須永遠持續下去。它永遠不會停止。 – SaravananArumugam 2011-05-31 19:58:28

+0

我想這不會是你需要的。通過說'您是否想考慮將BeginRead()放在doRead()中的條件?'中,我的意思是您可以通過在Stream.BeginRead()周圍放置一個條件來避免這種無限循環。條件必須是你需要定義的東西。可能是一些有限的數據,數據的可用性等可能是條件。即IF nTotalBytesRecieved <2048然後objClient.GetStream.BeginRead(...種的 – SaravananArumugam 2011-05-31 19:58:35

回答

0

@lberezka,我在代碼中看到一個奇怪的東西。您想在DoRead()方法內查看以下代碼行嗎?

objClient.GetStream.BeginRead(byReadBuffer, 0, BYTES_TO_READ, New AsyncCallback(AddressOf doRead), Nothing) 'Begin the reading again. 

理想的情況下以任何異步調用(一種開始),呼叫後把手應該得到的答案並嘗試使用End方法來結束通話。在你的情況Stream.EndRead。

我在代碼中看到的是,您一次又一次地遞歸地調用begin方法,並且在任何地方都看不到EndRead。

它給你提供任何線索嗎?

+0

感謝您的評論,並對可憐的格式感到抱歉。我的doRead函數如下所示: – lberezka 2011-05-31 19:37:43

+0

哦。現在我看到EndRead()。Great但是在執行EndRead之後,BeginRead會無條件地繼續執行,這是你的目的是什麼?你想考慮將BeginRead()放在doRead()中的條件嗎? – SaravananArumugam 2011-05-31 19:45:30