Вы можете использовать перегрузки Send
и Receive
при Socket
.Также существует асинхронная версия с помощью методов BeginSomething
& EndSomething
.
Вы отправляете необработанные байты, поэтому вам нужно будет выбрать протокол, каким бы простым он ни был.Чтобы отправить текст, выберите кодировку (я бы использовал UTF-8) и получите необработанные байты с Encoding.GetBytes
.
Пример:
Byte[] bytes = Encoding.UTF8.GetBytes("Royale With Cheese");
UTF8это статическое свойство класса Encoding
, оно для вашего удобства.
Затем вы можете отправить данные на сервер / клиент с помощью:
int sent = connection.Send(bytes);
Receive:
Byte[] bytes = new Bytes[100];
int received = connection.Receive(bytes);
Это выглядит легко, но есть предостережения.Соединение может быть разорвано в любое время, поэтому вы должны быть готовы к исключениям, особенно SocketException
.Также, если вы посмотрите на примеры, вы увидите, что у меня есть две переменные sent
и received
.Они содержат сколько байтов Send
и Receive
фактически отправлено.Вы не можете полагаться на то, что сокет отправляет или получает все данные (особенно не при получении, что, если другая сторона отправила меньше, чем вы ожидали?)
Один из способов сделать это - зациклить и отправить, пока все данные не будут отправлены.отображается как отправленный:
var bytes = Encoding.UTF8.GetBytes("Royale With Cheese");
int count = 0;
while (count < bytes.Length) // if you are brave you can do it all in the condition.
{
count += connection.Send(
bytes,
count,
bytes.Length - count, // This can be anything as long as it doesn't overflow the buffer, bytes.
SocketFlags.None)
}
Send
и Receive
синхронны, они блокируются, пока не отправят что-либо.Вам, вероятно, следует установить какое-либо значение времени ожидания для сокета ( Socket.SendTimeout & Socket.ReceiveTimeout .) По умолчанию 0, что означает, что они могут блокироваться навсегда.
Теперь как насчет получения?Попробуем сделать аналогичный цикл.
int count = 0;
var bytes = new Byte[100];
do
{
count += connection.Receive(
bytes,
count,
bytes.Length - count,
SocketFlags.None);
} while (count < bytes.Length);
Хмм.Ну ... что будет, если клиент отправит меньше 100?Мы блокируем, пока не истечет время ожидания, если оно есть, или если клиент отправит достаточно данных.Что произойдет, если клиент отправит более 100?Вы получите только 100 первых байтов.
В вашем случае мы можем попробовать прочитать очень маленькие суммы и распечатать.Чтение, печать, зацикливание:
var sunIsBurning = true;
while (sunIsBurning) {
var bytes = new Byte[16];
int received = socket.Receive(bytes);
if (received > 0)
Console.Out.WriteLine("Got {0} bytes. START:{1}END;", received, Encoding.UTF8.GetString(bytes));
}
Здесь мы говорим: «получать данные в 16-байтовых блоках, пока sunIsBurning, декодировать как UTF-8».Это означает, что данные, отправленные другой стороной, должны быть в формате UTF-8, иначе вы получите исключение (вероятно, оно должно быть перехвачено вами). Это также означает, что сервер прекратит прием только при сбое соединения.
Если вы получили 15 байтов, и клиент разорвал соединение, эти 15 байтов никогда не будут напечатаны.Для этого вам потребуется лучшая обработка ошибок:)
В большинстве случаев неперехваченное исключение убьет ваше приложение;нежелательно для сервера.
«сбой соединения» может означать много вещей , возможно, соединение было сброшено узлом или ваша сетевая карта загорелась.