【问题标题】:TCP read write issue .netTCP读写问题.net
【发布时间】:2012-07-31 22:41:03
【问题描述】:

我正在使用以下代码从特定服务器发送消息

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

我在这里做错了什么?

【问题讨论】:

  • 如果你写行,你应该读行。您的发送者和接收者的逻辑不匹配。
  • 另外,您一直在循​​环,直到设置了 DataAvailable 标志,但您的代码中没有设置该标志。例如,您不拨打Poll。仅当您执行某些更改其状态的操作时,连接对象才会更改状态。 (如读、写、连接、关闭、轮询等。)
  • @DavidSchwartz.. 我只是将 Read 方法更改为 'Dim tcpClient As New TcpClient() Try tcpClient.Connect("10.230.10.33", 7000) TextBox1.Text = TextBox1.Text + "Conneecte " Catch ee As Exception Console.WriteLine(ee) End Try If tcpClient.Connected Then Dim networkStream As NetworkStream = tcpClient.GetStream() Dim reader As New IO.StreamReader(networkStream) Dim str As String = reader.ReadLine() reader。 Close() tcpClient.Close() End If' 读取失败

标签: .net tcpclient tcplistener


【解决方案1】:

根据以下代码,您的代码逻辑似乎有缺陷。

' 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 Property

【讨论】:

  • 是的。 can read 属性为 true,但系统在 .Read 方法处挂起,发送的消息为“Test message”
【解决方案2】:

问题是没有已知的方法可以立即读取所有字节,而不会阻塞 read()。 要以 inputstream.ReadLine() 的方式读取一行,最好逐个字符地读取,直到读取到行尾字符:

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() 为您阻塞,直到有字符可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多