Задать вопрос
@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 и обработать его
  • Вопрос задан
  • 173 просмотра
Подписаться 2 Простой Комментировать
Решение пользователя OwDafuq К ответам на вопрос (2)
@OwDafuq
1. Для передачи аудио лучше использовать UDP, а не TCP;
2. Разный размер данных - норма, пишите вначале количество передаваемых байт (jsonData например будет 1000 байт, вначале пишите еще 4 байта (int) размера (или 2, short) со значением 1000, чтобы сервер знал сколько байт ему нужно получить от клиента, т.е. итоговый размер будет 1004 или 1002 байта, но на сервере нужно будет прочитать первые 4/2 байта размера и понять сколько читать дальше, прочитали - дальше читайте 4/2 байта размера и т.д.;

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