问题
Client app creates a List<Person> data
from an ObservableCollection<Person>
, then converts the data
into a byte[] array
and sends the Length
of the array
to the server before sending the actual array
like this:
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();
}
and server first reads the length from e.Buffer
which initially was set to 4, then resets e.Buffer
and receives whatever client sends in a single Receive
call like this:
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);
It doesn't matter how many bytes client sends, server always receives whole thing in one Receive
call and read
shows that it's received all that! In this particular case I've sent a list of 5 Person
that takes a Name and Age
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;
}
I've copied 9999 words from Lorem ipsum generator and pasted that as Name
of all 5 Person
and 10 as Age
. So the length client sent was 341706 bytes and server received all those in that single call and converted it to json string! Will I always get all data client sends in a single call regardless of the number of bytes in TCP communication?
来源:https://stackoverflow.com/questions/58588316/reading-byte-in-client-server-tcp-app-in-a-single-call