Проблема связи с клиентом .Net TCP - PullRequest
1 голос
/ 31 мая 2011

Я новичок в сетевом программировании и пытался установить связь между тестовым сервером ICE API и моим приложением. Приведенный ниже код работает только один раз, когда я пытаюсь войти на сервер. Другими словами, когда я отправляю сообщение о входе в систему, сервер отвечает мне успешным входом. Получив это, я отправляю следующее сообщение на сервер, но в ответ я получаю 0, что означает, что сервер уже разорвал соединение. Может кто-нибудь взглянуть на мою клиентскую логику и указать мне правильное направление, почему вышеописанная ситуация происходит. Пожалуйста, помогите мне решить проблему, так как я уже несколько дней безуспешно. Спасибо.

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

1 Ответ

0 голосов
/ 31 мая 2011

@ lberezka, я вижу странную вещь в коде.Хотели бы вы просмотреть следующую строку кода внутри метода DoRead ().

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

В идеале при любом асинхронном вызове (вид Begin) дескриптор обратного вызова должен получить ответ и попытаться завершить вызовиспользуя метод End.В вашем случае Stream.EndRead.

В вашем коде я вижу, что вы рекурсивно вызываете метод begin снова и снова, и я нигде не вижу EndRead.

Дает ли онВы что-нибудь понимаете?

...