2012-05-15 46 views
0

我使用下面的代码从一个特定的服务器TCP读写问题.NET

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 

发送消息和发送成功。

而下面的代码是从另一个系统读取。和代码挂在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 

DO和代码挂在这里的读取部分

不要 循环,直到networkStream.DataAvailable

我在做什么错在这里?

+0

如果你正在写行,你应该读行。您的发件人和收件人的逻辑不匹配。 –

+0

此外,您正在循环,直到设置DataAvailable标志,但代码中没有设置该标志。例如,您不要调用“投票”。如果您执行一些更改其状态的操作,则连接对象只会更改状态。 (如读,写,连接,关闭,轮询等) –

+0

@DavidSchwartz ..我只是将读取方法改为'Dim tcpClient As New TcpClient() 尝试 tcpClient.Connect(“10.230.10.33”,7000 ) TextBox1.Text = TextBox1.Text + “Conneecte” 捕捉EE作为异常 Console.WriteLine(ee)的 结束Try 如果tcpClient.Connected然后 昏暗的NetworkStream作为的NetworkStream = tcpClient.GetStream() 昏暗读取器作为新的IO.StreamReader(networkStream) Dim str As String = reader.ReadLine() reader.Close() tcpClient.Close() End If'and it fail to r ead – Sujima

回答

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 Property

+0

是的。可读取属性为true,但系统挂起。读取方法和发送的消息是“测试消息” – Sujima

0

的问题是,有立即读取所有字节没有已知的方法,不阻塞的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()块为您,直到一个字符可用。