0

List<Person> data客户端应用程序从a 创建 a ObservableCollection<Person>,然后将 a 转换data为 a并将 abyte[] array发送Lengtharray服务器,然后再发送实际数据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 个单词并将其粘贴为Name5 个Person和 10 个Age。所以客户端发送的长度是 341706 字节,服务器在单个调用中接收到所有这些,并将其转换为 json 字符串!无论 TCP 通信中的字节数如何,我总是会在一次调用中获得所有客户端发送的数据吗?

4

0 回答 0