ranio Ответов: 0

Как избежать обрезки данных, передаваемых из интерфейса клиента на сервер через веб-сокет ?


Я хочу избежать обрезки данных, отправляемых из интерфейса клиента на сервер через веб-сокет. Я выполняю подключение и отправку сообщений с клиентским и серверным интерфейсом как отдельные проекты приложений Windows. Я могу соединяться с сервером от клиента, отправляя меньшие данные. При отправке большего объема данных данные обрезаются.

Я увеличил размер буфера, но все равно данные обрезаются.

byte[] receiveBuffer = new byte[1024*4]


Что я уже пробовал:

Основной код, как показано ниже:
клиентский уровень:
#region Send
       private async Task Send(ClientWebSocket webSocket)
       {
           try
           {
               NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Client:Sending to Server Process Begins", true);
               // while (webSocket.State == WebSocketState.Open)

               if (webSocket.State == WebSocketState.Open)
                   {
                   //Console.WriteLine("Write some to send over to server..");
                   //string stringtoSend = Console.ReadLine();
                   string stringtoSend = txtOutgoing.Text;

                   byte[] buffer = encoding.GetBytes(stringtoSend);

                   await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);
                   // Console.WriteLine("Sent:     " + stringtoSend);


                   await Task.Delay(1000);
               }
           }
           catch (Exception ex)
           {
               NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Client:Sending to Server Process Failed: " + ex.Message.ToString() + "", true);
           }
           NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Client:Sending to Server Process Ends", true);
       }
       #endregion


серверный уровень:
обработка полученных данных от клиента осуществляется следующим образом:
Обработка запроса уровня клиента от сервера, как показано ниже;
byte[] receiveBuffer = new byte[1024 * 10];

               WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
                   var ServerstrReceived = System.Text.Encoding.Default.GetString(receiveBuffer);

                   txtIncoming.Text += Environment.NewLine + "Client:" + ServerstrReceived.ToString();

                   //Added to send to Client from Server

                   //string stringtoSend = txtOutgoing.Text;

                   //byte[] buffer = encoding.GetBytes(stringtoSend);

                   //await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);
                   //Added to send to Client

                   if (receiveResult.MessageType == WebSocketMessageType.Close)
                       await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);

Richard MacCutchan

Ваш клиент-получатель должен продолжать прием до тех пор, пока не получит сообщение от сервера о том, что данных больше нет. Скорее всего, вы получаете частичное сообщение, а затем игнорируете некоторые следующие данные. Но это всего лишь предположение, так как вы не показали свой клиентский код.

ranio

Пожалуйста, смотрите весь основной код для отправки и получения с помощью веб-сокета, как показано ниже: обновлено также в сообщении . В ожидании решения как можно скорее.

Основной код, как показано ниже:
клиентский уровень:

 #region Send        private async Task Send(ClientWebSocket webSocket)        {            try            {                NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Client:Sending to Server Process Begins", true);                // while (webSocket.State == WebSocketState.Open)                if (webSocket.State == WebSocketState.Open)                    {                    //Console.WriteLine("Write some to send over to server..");                    //string stringtoSend = Console.ReadLine();                    string stringtoSend = txtOutgoing.Text;                    byte[] buffer = encoding.GetBytes(stringtoSend);                    await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);                    // Console.WriteLine("Sent:     " + stringtoSend);                                      await Task.Delay(1000);                }            }            catch (Exception ex)            {                NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Client:Sending to Server Process Failed: " + ex.Message.ToString() + "", true);            }            NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Client:Sending to Server Process Ends", true);        }        #endregion


серверный уровень:
обработка полученных данных от клиента осуществляется следующим образом:
Обработка запроса уровня клиента от сервера, как показано ниже;
 byte[] receiveBuffer = new byte[1024 * 10];                WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);                    var ServerstrReceived = System.Text.Encoding.Default.GetString(receiveBuffer);                    txtIncoming.Text += Environment.NewLine + "Client:" + ServerstrReceived.ToString();                    //Added to send to Client from Server                    //string stringtoSend = txtOutgoing.Text;                    //byte[] buffer = encoding.GetBytes(stringtoSend);                    //await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);                    //Added to send to Client                    if (receiveResult.MessageType == WebSocketMessageType.Close)                        await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);                  

ranio

Другой вариант решения того же самого был сделан как показано ниже:
но websocketresult.EndofMessage() приходит как ложь. Я прошел простой строковый "тест" и, следовательно, неоднократно зацикливался на нем.
ArraySegment<byte> buffer = новый ArraySegment<byte>(Новый байт[8192]);

WebSocketReceiveResult result = null;

использование (var ms = new MemoryStream())
{
делать
{
результат = ожидание webSocket.ReceiveAsync(буфер, CancellationToken.Никто);



ms.Write(буфер.Массив, буфер.Смещение, результат.Рассчитывать);
}

в то время как (!результат.EndOfMessage) ;

ms.Seek(0, SeekOrigin.Begin);

если (результат.Класса Messagetype == WebSocketMessageType.Текст)
{
using (var reader = new StreamReader(ms, Encoding.Кодировке utf8))
{
// reader.ReadToEnd();
txtOutgoing.Текст = читатель.ReadToEnd();
}
}

0 Ответов