2011-05-31 68 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