WebSocket - 服务端工作

  • 简述

    WebSocket 服务器是一个简单的程序,它具有处理 WebSocket 事件和动作的能力。它通常向 WebSocket 客户端 API 公开类似的方法,并且大多数编程语言都提供了实现。下图说明了 WebSocket 服务器和 WebSocket 客户端之间的通信过程,强调了触发的事件和动作。
    下图显示了 WebSocket 服务器和客户端事件触发 -
    服务器客户端
  • 连接到 Web 服务器

    WebSocket 服务器的工作方式与 WebSocket 客户端类似。它响应事件并在必要时执行操作。无论使用哪种编程语言,每个 WebSocket 服务器都会执行一些特定的操作。
    它被初始化为一个 WebSocket 地址。它处理OnOpen、OnCloseOnMessage事件,也向客户端发送消息。
  • 创建 WebSocket 服务器实例

    每个 WebSocket 服务器都需要一个有效的主机和端口。在服务器中创建 WebSocket 实例的示例如下 -
    
    var server = new WebSocketServer("ws://localhost:8181");
    
    任何有效的 URL 都可以与端口的规范一起使用,这在以前没有使用过。记录连接的客户端非常有用,因为它提供了不同数据的详细信息或向每个客户端发送不同的消息。
    Fleck 表示带有IwebSocketConnection接口的传入连接(客户端) 。每当有人连接或断开我们的服务时,都可以创建或更新空列表。
    
    var clients = new List<IWebSocketConnection>();
    
    之后,我们可以调用Start方法并等待客户端连接。启动后,服务器能够接受传入的连接。在 Fleck 中,Start 方法需要一个参数,该参数指示引发事件的套接字 -
    
    server.Start(socket) =>
    {
    });
    
  • OnOpen 事件

    OnOpen事件确定新客户端已请求访问并执行初始握手。客户端应该被添加到列表中,并且可能应该存储与其相关的信息,例如 IP 地址。Fleck 向我们提供此类信息以及连接的唯一标识符。
    
    server.Start(socket) ⇒ {
       socket.OnOpen = () ⇒ {
          // Add the incoming connection to our list.
          clients.Add(socket);
       }
         
       // Handle the other events here...
    });
    
  • OnClose 事件

    每当客户端断开连接时都会引发OnClose事件。客户端从列表中删除,并通知其余客户端断开连接。
    
    socket.OnClose = () ⇒ {
       // Remove the disconnected client from the list.
       clients.Remove(socket);
    };
    
  • OnMessage 事件

    当客户端向服务器发送数据时会引发OnMessage事件。在这个事件处理程序中,传入的消息可以传输给客户端,或者可能只选择其中的一些。
    过程很简单。请注意,此处理程序将名为message的字符串作为参数 -
    
    socket.OnMessage = () ⇒ {
       // Display the message on the console.
       Console.WriteLine(message);
    };
    
  • Send() 方法

    Send()方法只是将所需的消息传输到指定的客户端。使用 Send(),可以跨客户端存储文本或二进制数据。
    OnMessage事件的工作原理如下 -
    
    socket.OnMessage = () ⇒ {
       foreach (var client in clients) {
          // Send the message to everyone!
          // Also, send the client connection's unique identifier in order
          // to recognize who is who.
          client.Send(client.ConnectionInfo.Id + " says: " + message);
       }
    };