服务端,接收数据,在每次接收到的数据末尾添上一个‘尾’字
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; namespace ListenerDemo { public partial class ListenerMain : Form { private TcpListener listener; private Thread thread; public ListenerMain() { InitializeComponent(); } private void Listen_Click(object sender, EventArgs e) { listener = new TcpListener(IPAddress.Any, int.Parse(Port.Text)); listener.Start(); thread = new Thread(new ThreadStart(Listen_Action)); thread.Start(); } private void Listen_Action() { while (true) { TcpClient client = listener.AcceptTcpClient(); client.NoDelay = false; client.ReceiveBufferSize = int.Parse(Buffer.Text); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[client.ReceiveBufferSize]; int i = 0; while ((i = stream.Read(buffer, 0, client.ReceiveBufferSize)) > 0) { DataShow.Invoke(new Action(() => { DataShow.AppendText(Encoding.Default.GetString(buffer, 0, i) + "尾" + System.Environment.NewLine); })); } } } private void Clear_Click(object sender, EventArgs e) { DataShow.Text = ""; } private void ListenerMain_FormClosing(object sender, FormClosingEventArgs e) { try { thread.Abort(); listener.Stop(); } catch { } } } }
客户端发送数据,将同样的数据连续发送若干次(不是将数据复制若干份一次发送)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; namespace ClientDemo { public partial class ClientMain : Form { public ClientMain() { InitializeComponent(); } private void Send_Click(object sender, EventArgs e) { TcpClient client = new TcpClient(); client.Connect(Dns.GetHostEntry(Dns.GetHostName()).AddressList[0], int.Parse(Port.Text)); NetworkStream stream = client.GetStream(); for (int i = 0; i < int.Parse(Repeat.Text); i++) { byte[] buffer = Encoding.Default.GetBytes(DataSend.Text); stream.Write(buffer, 0, buffer.Length); //System.Threading.Thread.Sleep(100); } stream.Close(); client.Close(); } private void Clear_Click(object sender, EventArgs e) { DataSend.Text = ""; } } }
连续10次发送测试
连续10次的时候,接收端第一次接收了发送端的第一次数据,后面一次就接收到了发送端的后9次数据,后9次数据粘在一起
如果发送加上100ms演示,结果则是如下
10次发送10次接收
将接收端缓冲区设置为10,发送段一次发送超过10字符时
30个A一次发送却分三次接收,发生了分包。