1

私はwebsockets-clientを書いています。私には2つの問題があります:

  1. アプリケーションのウィンドウを閉じると、サーバーがダウンします

  2. サーバーはメッセージを受信しませんでしたが、クライアントは常にサーバーからグリーティング メッセージを受信します。

System.Exception : websocket を開いた後、websocket でデータを送信する必要があります

C# 上のクライアント (Websocket4Net lib)

private static void _clientSocket_Closed(object sender, EventArgs e)
{
    if (_clientSocket.State == WebSocket4Net.WebSocketState.Open)
    {
        _clientSocket.Close("Closed by user");
    }
}

public static void WebRequest(string url, dutyObject objToSend)
{
    _clientSocket = new WebSocket(url);

    _clientSocket.MessageReceived += _clientSocket_MessageReceived;
    _clientSocket.DataReceived += _clientSocket_DataReceived;
    _clientSocket.Closed += _clientSocket_Closed;
    _clientSocket.Error += new EventHandler<SuperSocket.ClientEngine.ErrorEventArgs>(_clientSocket_Error);

    _clientSocket.Open();

    var jsonMessage = JsonSerializeHelper.Serialize(objToSend);
    _clientSocket.Send(jsonMessage);
}

PHP上のサーバー

class Server extends WebSocketServer
{
    protected function serverCreated()
    {
    }

    /**
     * This is run when server is receiving data. 
     */
    protected function process($connected_user, $message)
    {
        $this->send($connected_user,"[+]".$message); //just echo reply
    }

    /**
     * This is run when socket connection is established. Send a greeting message
     */
    protected function connected($connected_user)
    {
        $welcome_message = 'Welcome to Service. Service works with JSON. Be careful!';
        $this->send($connected_user, $welcome_message);
    }


    protected function closed($connected_user)
    {
        $this->stdout("User closed connection \n");
    }
}

クライアントで更新します。

while (_clientSocket.State != WebSocketState.Open)
            {
                if (_clientSocket.State == WebSocket4Net.WebSocketState.Open)
                {
                    Console.WriteLine(_clientSocket.State);
                    _clientSocket.Send(ecn.GetBytes(jsonMessage), 0, ecn.GetBytes(jsonMessage).Length);
                }
                else
                {
                    Console.WriteLine("E: " + _clientSocket.State);
                    //_clientSocket.Close();    
                }    
            }

そして、永続的に「接続中」と表示されます。

4

1 に答える 1

1

これはおそらくハンドシェイクのエラーであると思われます-コードを見ると、ハンドシェイクが行われなかった場合、このエラーがスローされることがわかりました

private bool EnsureWebSocketOpen()
        {
            if (!Handshaked)
            {
                OnError(new Exception(m_NotOpenSendingMessage));
                return false;
            }

            return true;
        }
于 2015-03-19T09:28:41.710 に答える