Реализовать программы клиента и сервера, работающие по протоколу UDP.
Клиент каждые 10 секунд отправляет на сервер пакет данных.
Структура пакета:
номер_пакета -- uint32 (32 бита, беззнаковое целое)
дата_время_отправки -- timestamp (32 бита, целое со знаком)
длина_текста -- uint8 (8 бит, беззнаковое целое)
текст -- произвольное текстовое сообщение длинной до 256 байт
Сервер принимает сообщение и выводит его в консоль в удобном для прочтения человеком виде.
Вот сделал клиент с сервером но выводятся ошибки У сервера (System.Net.Sockets.SocketException: "Удаленный хост принудительно разорвал существующее подключение") а у клиента (System.ObjectDisposedException: "Доступ к ликвидированному объекту невозможен.)
client
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace client
{
class Program
{
static void Main(string[] args)
{
const string ip = "127.0.0.1";
const int port = 8082;
var udpEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSocket.Bind(udpEndPoint);
UInt32 i = 0;
DateTime dateTime = DateTime.Now;
while (true)
{
if (DateTime.Now.Subtract(dateTime).TotalSeconds >= 10)
{
var serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081);
string message = "Какой то текст";
Package package = new Package( message);
udpSocket.SendTo(BitConverter.GetBytes(i), serverEndPoint);
udpSocket.SendTo(BitConverter.GetBytes(package.Timestamp), serverEndPoint);
udpSocket.SendTo(BitConverter.GetBytes(package.Length), serverEndPoint);
udpSocket.SendTo(Encoding.Default.GetBytes(package.Text), serverEndPoint);
i++;
udpSocket.Close();
dateTime = DateTime.Now;
}
}
}
class Package
{
public int Timestamp { get; private set; }
public sbyte Length { get; private set; }
public string Text { get; private set; }
public Package( string text)
{
DateTime dt = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now);
DateTime dt1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
TimeSpan tsInterval = dt.Subtract(dt1970);
Timestamp = Convert.ToInt32(tsInterval.TotalSeconds); ;
Text = text ?? throw new ArgumentNullException(nameof(text));
if (text.Length > 255) throw new ArgumentOutOfRangeException(nameof(Length));
Length = (sbyte)text.Length;
}
}
}
}
server
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace server
{
class Program
{
static void Main(string[] args)
{
const string ip = "127.0.0.1";
const int port = 8081;
var udpEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSocket.Bind(udpEndPoint);
while (true)
{
var bufer = new byte[256];
UInt32 num ;
UInt32 time;
int num2;
string text;
EndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0);
udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
num = BitConverter.ToUInt32(bufer, 0);
Console.WriteLine(num);
udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
time = BitConverter.ToUInt32(bufer, 0);
Console.WriteLine(time);
udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
num2 = BitConverter.ToUInt16(bufer, 0);
Console.WriteLine(num2);
udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
text = Encoding.Default.GetString(bufer);
Console.WriteLine(text);
udpSocket.SendTo(Encoding.UTF8.GetBytes("good"), senderEndPoint);
}
}
}
}
Предположим, у нас есть строка преобразования SVG:
При создании экземпляра Date (new Date()), судя по документации, возвращается текущее локальное время, но мне возвращается время со сдвигом на -2 часа