【问题标题】:Server did not receiving messages服务器没有收到消息
【发布时间】:2014-10-30 14:39:35
【问题描述】:

我正在编写一个 websockets 客户端。我有两个问题:

  1. 当我关闭应用程序的窗口时,服务器出现故障

  2. 服务器没有收到消息,但客户端总是收到来自服务器的问候消息。

System.Exception : 你必须在 websocket 之后通过 websocket 发送数据 打开

C# 客户端(Websocket4Net 库)

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();    
                }    
            }

它会永久显示“正在连接”。

【问题讨论】:

  • 请上主题:(
  • 错误提示时间问题,您确定在发送数据之前套接字已连接吗?不好的做法是假设连接已连接,在发送数据之前检查状态。
  • @Wranorn,查看更新的代码。客户端套接字在“正在连接”状态下冻结。
  • 你可以从客户端连接任何东西到服务器(即telnet是否连接到服务器?)
  • @Wranorn,Telnet 连接到服务器但不发送消息。我在 js 上有一个小客户端,效果很好。

标签: c# php websocket client-server websocket4net


【解决方案1】:

我怀疑这可能与握手错误有关 - 在查看代码时,我看到如果没有进行握手,则会引发此错误

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

            return true;
        }

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 2016-04-26
    • 2012-03-10
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多