0

特定のサーバーからメッセージを送信する以下のコードを使用しています

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    send("Hello there")
    TextBox1.Text = TextBox1.Text + "Send Successful"
End Sub

Public Sub send(ByVal data As String)
    Dim tcpClient As New TcpClient()
    Try
        tcpClient.Connect("10.xxx.xx.xx", 7000)
        TextBox1.text = TextBox1.Text + "Conneecte"
    Catch e As Exception
        Console.WriteLine(e)
    End Try
    If tcpClient.Connected Then
        Dim networkStream As NetworkStream = tcpClient.GetStream()
        Dim streamWriter As New StreamWriter(networkStream)
        Console.WriteLine("Messege {0} to {1}", data, tcpClient.Client.RemoteEndPoint)
        streamWriter.WriteLine(data)
        streamWriter.Flush()
        tcpClient.Close()
    End If
End Sub

そして、送信は成功します。

そして、以下のコードは別のシステムから読み取っています。そして、コードはdo whileループでハングします

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    Dim tcpClient As New System.Net.Sockets.TcpClient()
    Try
        tcpClient.Connect("10.xxx.xx.xx", 7000)
        Dim networkStream As NetworkStream = tcpClient.GetStream()
        If networkStream.CanWrite And networkStream.CanRead Then
            'Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("$gimme")
            'networkStream.Write(sendBytes, 0, sendBytes.Length)
            ' 'Read the NetworkStream into a byte buffer.
            Do
            Loop Until networkStream.DataAvailable
            Dim bytes(tcpClient.ReceiveBufferSize) As Byte
            networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
            Dim returndata As String = Encoding.ASCII.GetString(bytes)
            ''Label1.Text = returndata
            tcpClient.Close()
        Else
            If Not networkStream.CanRead Then
                tcpClient.Close()
            Else
                If Not networkStream.CanWrite Then
                    tcpClient.Close()
                End If
            End If
        End If
    Catch ex As Exception
        'sLabel1.Text = "Exception Caught"
    End Try
End Sub

そして、コードはここの読み取り部分でハングします

networkStream.DataAvailable までループする

ここで何が間違っていますか?

4

2 に答える 2

0

次のコードに基づくと、コードロジックに欠陥があるようです。

' Examples for CanRead, Read, and DataAvailable.
' Check to see if this NetworkStream is readable.
If myNetworkStream.CanRead Then
   Dim myReadBuffer(1024) As Byte
       Dim myCompleteMessage As StringBuilder = New StringBuilder()
   Dim numberOfBytesRead As Integer = 0

   ' Incoming message may be larger than the buffer size.
   Do
      numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length)
           myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead))
   Loop While myNetworkStream.DataAvailable

   ' Print out the received message to the console.
       Console.WriteLine(("You received the following message : " + myCompleteMessage.ToString()))
Else
   Console.WriteLine("Sorry.  You cannot read from this NetworkStream.")
End If

これについてもう少し長いNetworkStream.DataAvailableプロパティ について考えることをお勧めします

于 2012-05-15T11:50:12.543 に答える
0

問題は、read() をブロックせずにすべてのバイトをすぐに読み取る既知の方法がないことです。inputstream.ReadLine()の方法で行を読み取るには、行末文字が読み取られるまで、1 文字ずつ読み取る方がよいでしょう。

Function readln(ByRef inputstream as Stream) as String
 Dim r as String = ""
 do
  Dim c as Char = Chr(inputstream.Read())
  If c = vbCr Then Exit loop    'vbCr or vbLf depending on application'
  r += c
 loop
 Return r
End Function

素敵ではありませんが機能的です。また、データの到着が遅い場合や遅い場合でも、CPU パフォーマンスを消費しません。inputstream.Read()は、文字が使用可能になるまでブロックします。

于 2012-07-31T14:41:03.187 に答える