Как избежать обрезки данных, передаваемых из интерфейса клиента на сервер через веб-сокет ?
Я хочу избежать обрезки данных, отправляемых из интерфейса клиента на сервер через веб-сокет. Я выполняю подключение и отправку сообщений с клиентским и серверным интерфейсом как отдельные проекты приложений 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();
}
}