WebSocket - 服务器工作原理



WebSocket 服务器是一个简单的程序,能够处理 WebSocket 事件和操作。它通常提供与 WebSocket 客户端 API 相似的使用方法,大多数编程语言都提供了实现。下图说明了 WebSocket 服务器和 WebSocket 客户端之间的通信过程,重点突出了触发的事件和操作。

下图显示了 WebSocket 服务器和客户端事件触发:

Server Client

连接到 Web 服务器

WebSocket 服务器的工作方式与 WebSocket 客户端类似。它响应事件并在必要时执行操作。无论使用哪种编程语言,每个 WebSocket 服务器都会执行一些特定操作。

它被初始化到一个 WebSocket 地址。它处理 **OnOpen、OnClose** 和 **OnMessage** 事件,并向客户端发送消息。

创建 WebSocket 服务器实例

每个 WebSocket 服务器都需要一个有效的主机和端口。以下是一个在服务器中创建 WebSocket 实例的示例:

var server = new WebSocketServer("ws://localhost:8181");

可以使用任何有效的 URL 并指定以前未使用的端口。记录已连接的客户端非常有用,因为它提供了包含不同数据或向每个客户端发送不同消息的详细信息。

Fleck 使用 **IwebSocketConnection** 接口表示传入的连接(客户端)。每当有人连接或断开与我们服务的连接时,都可以创建或更新空列表。

var clients = new List<IWebSocketConnection>();

之后,我们可以调用 **Start** 方法并等待客户端连接。启动后,服务器能够接受传入的连接。在 Fleck 中,Start 方法需要一个参数,该参数指示引发事件的套接字:

server.Start(socket) =>
{
});

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

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);
   }
};
广告