Я понимаю, что этот пост старый, но я чувствую, что есть более простой способ выполнить эту задачу с TcpListener
/ TcpClient
Вы можете использовать BinaryFormatter для выполнения чтения и записи из NetworkStream
, где вы не знаете точную длину.
Использование
System.Runtime.Serialization.Formatters.Binary;
Клиентская сторона
string[] animals = { "Dog", "Cat", "Mouse" };
TcpClient c = new TcpClient();
c.Connect("YourServer", someport);
using (NetworkStream ns = c.GetStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ns, animals);
}
Сторона сервера
string[] animals;
TcpListener l = new TcpListener(IPAddress.Any, someport);
l.Start();
TcpClient c = l.AcceptTcpClient();
using (NetworkStream ns = c.GetStream())
{
BinaryFormatter bf = new BinaryFormatter();
animals = (string[])bs.Deserialize(ns);
}
Пока вы знаете тип, который вы отправляете и получаете, это способ отправки и получения данных через NetworkStreams без точного подсчета байтов.
Если вы просто отправляете простую строку через NetworkStream
, вы можете использовать простой метод StreamWriter
и Write(String)
для записи в поток, а также StreamReader
и метод ReadToEnd()
для извлечения ваша строка на другом конце.
Edit: я только думал об этом ответе на днях, и я понимаю, что здесь важно отметить, что для использования BinaryFormatter
объект должен быть в состоянии быть сериализованным, отмеченным SerializableAttribute , как в случае некоторых встроенных типов, делает это не вариант. Я прошу прощения за позднее редактирование, но я чувствовал, что это важно отметить.