【发布时间】:2014-06-11 03:03:11
【问题描述】:
我有一个使用 TCP 发送/接收消息的简单程序。出于某种原因,它可以很好地接收第一条消息,但除非我关闭并重新连接客户端,否则服务器不会收到来自该客户端的第一条消息之外的任何消息。我提供了下面代码的精简版本(所以请原谅缺乏异常处理)。
Private TCPWriter As TcpClient
Private TCPListener As TcpListener
Private Sub Send(sender As Object, e As RoutedEventArgs)
Connect()
WriteTextToServer(MessageBox.Text)
End Sub
Private Sub Connect()
If TCPWriter Is Nothing Then
TCPWriter = New TcpClient
End If
If Not TCPWriter.Connected Then
TCPWriter.Connect(System.Net.IPAddress.Parse(IPBox.Text), PortBox.Text)
TCPWriter.NoDelay = True
End If
End Sub
Private Sub WriteTextToServer(inMsg As String)
Dim data() As Byte = Encoding.ASCII.GetBytes(inMsg + vbCrLf)
Dim ns As NetworkStream = TCPWriter.GetStream()
If ns.CanWrite Then
ns.Write(inMsg, 0, inMsg.Length - 1)
End If
End Sub
Private Sub ReadNewDataFromClient(ByVal inStatus As IAsyncResult)
Dim clientSocket As TcpClient
Dim datalen As Integer
Dim buf() As Byte
Dim message As String
clientSocket = CType(inStatus.AsyncState, TcpListener).EndAcceptTcpClient(inStatus)
clientSocket.ReceiveTimeout = 5000
datalen = clientSocket.Available
If datalen > 0 Then
'get all data at once ...
buf = New Byte(datalen - 1) {}
clientSocket.GetStream().Read(buf, 0, buf.Length)
message = Encoding.ASCII.GetString(buf, 0, buf.Count - 2)
Me.Dispatcher.Invoke(Sub() ReadNewDataFromClients.Add(ReadNewDataFromClients.Count.ToString + ": " + message))
End If
TCPListener.BeginAcceptTcpClient(New AsyncCallback(AddressOf ReadNewDataFromClient), Nothing)
End Sub
如果我将 Connect() 方法更改为以下代码,它会起作用,但似乎不是正确的方法。
Private Sub Connect()
If TCPWriter IsNot Nothing Then
TCPWriter.close
TCPWriter = nothing
Threading.Thread.Sleep(1000)
End If
TCPWriter = New TcpClient
If Not TCPWriter.Connected Then
TCPWriter.Connect(System.Net.IPAddress.Parse(IPBox.Text), PortBox.Text)
TCPWriter.NoDelay = True
End If
End Sub
我做错了什么?
【问题讨论】:
标签: .net vb.net tcpclient tcplistener