我是网络编程的新手,并试图在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