Как разобраться в работе с сетью в c#?



@joyrax-dev

Собрался написать клиент-серверный софт на шарпе, но не могу никак понять как он работает.
Есть TcpClient(будет клиент) и TcpListener(будет сервер), и я застрал на получении данных

public class Operator {
    private ClientInfo _clientInfo;
    private IPEndPoint _peerEndPoint;
    private WaveInEvent _waveIn;
    TcpClient _tcpClient;
    NetworkStream _stream;

    public Operator(IPEndPoint end)
    {
        _clientInfo = new ClientInfo()
        {
            Type = ClientType.Operator,
            Location = "Reseption"
        };


        _peerEndPoint = end;
    }

    public void Start()
    {
        _waveIn = new WaveInEvent();
        _waveIn.DeviceNumber = 0;
        _waveIn.WaveFormat = new WaveFormat(44100, 2); // формат звука (частота дискретизации и количество каналов)

        _tcpClient = new TcpClient(_peerEndPoint);

        _stream = _tcpClient.GetStream();

        Authentication();

        Thread.Sleep(3000);

        _waveIn.DataAvailable += SendAudio;

        _waveIn.StartRecording();

        Console.WriteLine("Recording... Press Enter to stop");
        Console.ReadLine();

        _waveIn.StopRecording();
    }

    public void SendAudio(object sender, WaveInEventArgs e)
    {
        byte[] buffer = new byte[e.BytesRecorded];
        Array.Copy(e.Buffer, buffer, e.BytesRecorded);

        AudioData data = new AudioData()
        {
            Type = DataType.AudioData,
            Sender = _clientInfo,
            Audio = buffer,
            IsAll = true
        };

        string json = JsonConvert.SerializeObject(data);
        byte[] jsonData = Encoding.UTF8.GetBytes(json);

        _stream.Write(jsonData, 0, jsonData.Length);
    }

    private void Authentication()
    {
        ExcellentData data = new ExcellentData()
        {
            Type = DataType.AuthData,
            Sender = _clientInfo
        };

        string json = JsonConvert.SerializeObject(data);
        byte[] jsonData = Encoding.UTF8.GetBytes(json);

        _stream.Write(jsonData, 0, jsonData.Length);
    }
}

Этой мой клиент, вот он отправляет json данные на сервер, а сервер в свою очередь читает потом эти данные из стрима.
Так вот когда к серверу подключается клиент и на сервере получаем стрим

NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];

нужно указать размер буфера, но мои данные всегда будут разного размера, и я не могу понять как получая данные полностью прочитать весь json и обработать его


Решения вопроса 2



@vabka Куратор тега C#

1. Например ты можешь перекладывать данные из буфера куда-то ещё. В List<byte> например.
А лучше переработай свой протокол, чтобы в этом не было нужды (чтобы где-то в начале сообщения писалось, сколько места тебе нужно выделить)

2. Посмотри в сторону System.IO.Pipelines — там уже решены практически все проблемы, с которыми можно столкнуться.

3. Подумай над тем чтобы использовать уже готовый протокол типа того же http


Ответы на вопрос 0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *