List<Person> data
客户端应用程序从a 创建 a ObservableCollection<Person>
,然后将 a 转换data
为 a并将 abyte[] array
发送Length
到array
服务器,然后再发送实际数据array
,如下所示:
void SendData(object o)
{
var data = new List<Person>(ListOfPerson);
var array = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
socket.Send(BitConverter.GetBytes(array.Length));
socket.Send(array);
ListOfPerson.Clear();
}
服务器首先读取e.Buffer
最初设置为 4 的长度,然后重置e.Buffer
并接收客户端在单个Receive
调用中发送的任何内容,如下所示:
void Receive(object sender, SocketAsyncEventArgs e)
{
int length = BitConverter.ToInt32(e.Buffer, 0);
SetBuffer(e, length);
int read = (sender as Socket).Receive(e.Buffer);
var json = Encoding.UTF8.GetString(e.Buffer);
SetBuffer(e, 4);
(sender as Socket).ReceiveAsync(e);
}
void SetBuffer(SocketAsyncEventArgs e, int length) => e.SetBuffer(new byte[length], 0, length);
客户端发送多少字节无关紧要,服务器总是在一次Receive
调用中接收全部内容并read
显示它已收到所有内容!在这种特殊情况下,我发送了一个包含 5Person
个名称和年龄的列表
public class Person
{
public string Name { get; set; }
public Nullable<int> Age { get; set; }
public Person(string name, Nullable<int> age)
{
Name = name;
Age = age;
}
public override string ToString() => Name + " " + Age;
}
我从 Lorem ipsum 生成器中复制了 9999 个单词并将其粘贴为Name
5 个Person
和 10 个Age
。所以客户端发送的长度是 341706 字节,服务器在单个调用中接收到所有这些,并将其转换为 json 字符串!无论 TCP 通信中的字节数如何,我总是会在一次调用中获得所有客户端发送的数据吗?