Как я могу решить проблему с websocket-sharp "Часть заголовка кадра не может быть прочитана"? - PullRequest
0 голосов
/ 26 марта 2019

У меня проблема с веб-сокетом из веб-библиотеки (https://github.com/sta/websocket-sharp).) У меня есть схема, в которой у меня есть клиент веб-сокета (MyClient) и веб-сервер (MyServer). MyClient подключается к внешнему серверу веб-сокета, получает сообщение время от времени от него и через MyServer транслируют это сообщение всем подключенным к MyServer клиентам (GuestClients). Довольно часто я получаю такую ​​форму исключения на стороне MyServer:

2019-03-26 06: 09: 47.4749 | ОШИБКА | BusinessLogic | Соединение было закрыто код: 1006 причина Причина Часть заголовка кадра не может быть прочитана из источника данных. 2019-03-26 06: 09: 47.4749 | ОШИБКА | BusinessLogic | Код 1006

Я пытался отключить проблемных клиентов, но через некоторое время (стабильная работа около 15 минут) вещание полностью прекращается. Общее количество подключенных GuestClients составляет менее 100. GuestClients - реализованы в виде веб-страниц с кодом JavaScript или скриптами Python сторонней программы.

// WebSocketServer
WebSocketServer BCServer;
BCServer = new WebSocketServer(PORT);
BCServer.AddWebSocketService<SiteName>("/SiteName", () => new SiteName()
{
        IgnoreExtensions = true
} );
BCServer.Start();

// WebSocket Client
WebSocket WSClient;
WSClient = new WebSocket(URI);
WSClient.OnMessage += (sender, e) =>
                    {
// process the data
sendDataBroadCast(jsonData);
};

WSClient.Connect();


public static void sendDataBroadCast(string jsonData)
        {
            try
            {
                lock (BCServer)
                {
                    if (BCServer.IsListening)
                    {
                        BCServer.WebSocketServices.BroadcastAsync(jsonData, OnFinish);
                    }
                }
            }
            catch(Exception ex)
            {

            }
        }


// and class SiteName

public class SiteName : WebSocketBehavior
  {

        protected override void OnOpen()
        {
            logger.Info("Total number of Session is " + Sessions.Count);
        }
        protected override void OnError(WebSocketSharp.ErrorEventArgs e)
        {
            Sessions.CloseSession(ID);
        }
        protected override void OnMessage(MessageEventArgs e)
        {
            try
            {
// just do some job
            }
            catch (Exception ex)
            {

            }
 }
...