@joyrax-dev

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

Собрался написать клиент-серверный софт на шарпе, но не могу никак понять как он работает.
Есть 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 и обработать его
  • Вопрос задан
  • 164 просмотра
Решения вопроса 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
1. Например ты можешь перекладывать данные из буфера куда-то ещё. В List<byte> например.
А лучше переработай свой протокол, чтобы в этом не было нужды (чтобы где-то в начале сообщения писалось, сколько места тебе нужно выделить)

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

3. Подумай над тем чтобы использовать уже готовый протокол типа того же http
Ответ написан
Комментировать
@OwDafuq
1. Для передачи аудио лучше использовать UDP, а не TCP;
2. Разный размер данных - норма, пишите вначале количество передаваемых байт (jsonData например будет 1000 байт, вначале пишите еще 4 байта (int) размера (или 2, short) со значением 1000, чтобы сервер знал сколько байт ему нужно получить от клиента, т.е. итоговый размер будет 1004 или 1002 байта, но на сервере нужно будет прочитать первые 4/2 байта размера и понять сколько читать дальше, прочитали - дальше читайте 4/2 байта размера и т.д.;

upd: может лучше BSON использовать для таких вещей?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы