问题描述
我正在寻找的只是 Windows Form VB.Net 上的一个简单的 TCPClient/Listner 示例.我是新手,Microsoft TCPClient/Listner 类示例不是我要找的.我所寻找的只是让 TCPClient 发送消息,让 TCPListener 获取消息并返回一条消息我收到了你的消息"?
有一点帮助会很棒.我有一些代码,但只是将消息发送到服务器而不是从服务器返回到客户端..任何帮助将不胜感激..
TCP 通信是基于流的,这意味着它不处理任何数据包.因此,您收到的消息可能是部分或混在一起的.
例如,您可以发送:
你好!
你好吗?
但您可能会收到:
你好!你好吗?
或:
Hello!How ar
你是?
(或类似的东西)
要解决此问题,您必须应用一种称为长度前缀" 的方法.长度前缀(或长度前缀)意味着在您发送消息之前,您将其长度(字符/字节的数量)放在它的开头.通过这样做,端点将确切地知道每条消息要读取多少字节.这样就不会出现消息部分或混在一起的问题.
作为初学者,这不是最简单的事情,因为要使其在双方正常工作,您必须正确构建代码.所以我创建了两个类来为你处理这个问题.请参阅以下示例,了解如何将它们用于简单的基于文本消息的通信.
源链接:
All I'm looking for is a simple TCPClient/Listner example on Windows Form VB.Net. I'm a newbie and Microsoft TCPClient/Listner class examples are not what I am looking for. All I am looking is for the TCPClient to send a message and for a TCPListener to get the message and to send a message back "I got your message" ?
A little help would be great. I have some codes, but is only to send message to server and not back from server to client..Any help will be very appreciated..
TCP communication is stream-based, which means it doesn't handle any packets. Due to this, messages that you receive might be either partial or lumped together.
You could for example send:
Hello!
How are you?
But you might receive:
Hello!How are you?
or:
Hello!How ar
e you?
(or something similar)
To fix this you must apply something called "length-prefixing". Length-prefixing (or length prefixing) means that before you send a message, you put its length (amount of characters/bytes) in the beginning of it. By doing so, the endpoint will know exactly how many bytes to read for each message. Thus there will be no problems with messages being partial or lumped together.
This is not the most straightforward thing to do as a beginner, as to get it to work properly on both sides you have to structure your code just right. So I've created two classes that will take care of this for you. See the examples below on how to use them for simple text message-based communication.
Link to source: http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient.zip
Link to C# source : http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient%20CSharp.zip
Example usage
Note that in those examples Client
does not refer to the client side, but to the TcpClient.
Server side
First declare a new variable for
ExtendedTcpClient
, and be sure toincludeWithEvents
in the declaration.Dim WithEvents Client As ExtendedTcpClient
Then you will need a
TcpListener
and aTimer
to check for incoming connections.Dim Listener As New TcpListener("0.0.0.0", 5555) 'Listen for any connection on port 5555. Dim WithEvents Tmr As New System.Windows.Forms.Timer
Then you need to subscribe to the timer's
Tick
event.Private Sub Tmr_Tick(sender As System.Object, e As System.EventArgs) Handles Tmr.Tick End Sub
In there you check for incoming connections via the
Listener.Pending()
method. When you are to accept a connection you first declare a newinstance of theExtendedTcpClient
. The class requires to have aform as its owner, in this applicationMe
is the current form.
Then you use theExtendedTcpClient.SetNewClient()
method withListener.AcceptTcpClient()
as its argument to apply theTcpClient
from the listener. Put this code in theTmr_Tick
sub:If Listener.Pending() = True Then Client = New ExtendedTcpClient(Me) Client.SetNewClient(Listener.AcceptTcpClient()) End If
Now the client and server are connected to each other.
Now you need to subscribe to the
PacketReceived
event of theclient. Create a sub like so:Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived End Sub
All received data are presented in an array of bytes.In the
PacketReceived
sub you can output the received packet as text into aTextBox
. Just check if the packet header isPlainText
and thenyou can convert the received packets contents (which is an array ofbytes, accessed viae.Packet.Contents
) to a string and put it intheTextBox
.If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then TextBox1.AppendText("Message recieved: " & System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) End If
System.Text.Encoding.Default.GetString()
will convert a byte array to normal text.In the
PacketReceived
sub you can also make it send "Message received" to the client.Dim ResponsePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes("Message received."), TcpMessagePacket.PacketHeader.PlainText) ResponsePacket.Send(Client.Client) 'Get the ExtendedTcpClient's underlying TcpClient.
Lastly, when closing the form you just need to disconnect the client.
Private Sub ServerWindow_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If Client IsNot Nothing Then Client.Disconnect() End Sub
And that's it for the server side.
Client side
For the client side you will do pretty much the same as the server side, though you won't be needing a
TcpListener
nor aTimer
.Dim WithEvents Client As New ExtendedTcpClient(Me) 'The current form as its owner.
Connect to the server via the IP and port you've given the listener.
Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555.
Now if you want to send text to the server you'd do something like this (in for example a button):
Dim MessagePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes(TextBox2.Text), TcpMessagePacket.PacketHeader.PlainText) MessagePacket.Send(Client.Client)
TextBox2
includes the text you want to send.Lastly, you will need to subscribe to the
PacketReceived
event here too to check for responses from the server. In there you receive text just like the server does.Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then TextBox1.AppendText(System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) 'Prints for example "Message received." from the server. End If End Sub
And now everything should be working!
Link to a complete example project (only client-to-server): http://www.mydoomsite.com/sourcecodes/TCP%20Messaging%20System.zip
Link to C# example: http://www.mydoomsite.com/sourcecodes/CSharp%20TCP%20Messaging%20System.zip
If you want to add more headers to the class (the headers indicate to you what kind of data each packet contains), open TcpMessagePacket.vb
and add more values in the PacketHeader
enum (located in the region called Constants
).
Hope this helps!
Screenshot from the example project
(Click the image for larger resolution)
这篇关于TCP 客户端到服务器通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!