webSocket的实现

长孙星汉
2023-12-01

WebSocket包括客户端和服务端,
实现的语言大体可以分为四类:
java,

C/C++,

object-C,

javascript
 

一、Java实现WebSocket


伴随着HTML5技术的新起,WebSocket 作为一种浏览器与服务器的核心通信技术,

被嵌入到了浏览器的内核中。
WebSocket 的出现使得浏览器提供对 Socket 的支持成为可能,
从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道。

所有新的技术都会第一时间在Java社区,出现对应的开源项目!
WebSocket也被实现在多种Java的开源库中。WebSocket实现列表:
  。

今天就让我们用Java来解密一下WebSocket的服务器端和客户端 实现,它包括:
 . 服务器端实现(Tomcat)
 . 客户端实现(Java-WebSocket)
 . 客户端实现(Javascript原生API)

1. 服务器端实现(Tomcat)
用Java实现的websocket,在Server端是通过Tomcat内嵌支持的,
我们需要开发一个继承WebSocketServlet 的servlet就可以了,
与普通的HttpServlet没有太大区别。

2. 客户端实现(Java-WebSocket)
通过Java实现websocket的客户端,这里将介绍的是”Java-WebSocket”。
另外,我发现Java7已经原生支持了websocket, “JSR 365, Java API for WebSocket” 
(看来要开始学学java7和java8了,我在java6的时代停滞3-4年了。)

3.客户端实现(Javascript原生API)
编写一个纯HTML的网页,通过浏览器原生的websocketAPI实现对websocket的服务的调用。 

关于这部分的具体内容,可以参考文档:
http://blog.fens.me/java-websocket-intro/


二、C/C+实现WebSocket


1. easywsclient
Easywsclient is an easy and powerful WebSocket client to get your C++ code connected to a web stack right away. 
It depends only on the standard libraries. It is compatible with modern C++11 std::function and lambda, 
if they're available (it's not required though). RFC 6455 Version 13 WebSocket is supported. 
Version 13 is compatible with all major, modern WebSocket implementations, including Node.js, 
and has been a standard since December 2011.

Rationale: This library is intended to help a C++ project start using WebSocket rapidly. 
This small library can easily be thrown into an existing project. 
For complicated builds that you can't figure out right away, 
you can even cheat by piggy-backing the .cpp file into one of the project's existing files. 
Yes, WebSocket is that awesome enough to warrant getting it integrated into your project! 
This project imposes no special interface requirements, 
and can work happily with new C++11 features or with older C++ projects.

As an additional benefit, easywsclient is very simple, with just a single implementation file. 
It can serve as a cruft-free concise reference. 
You are most welcome to use this code as a reference for creating alternative implementations 
that may better suit your needs.

它在github上的链接:


它很轻便,可以方便地和kurento等服务端做通信;

2. QWebSockets
QWebSockets 是一个纯 Qt 实现的 WebSockets 通讯库,包括客户端和服务器端。
QWebSockets 是作为 Qt 源码模块 (.pri 文件) 提供的,可轻松嵌入到已有的 Qt 项目,无需依赖其他第三方库。
可实现文本和二进制的套接字、基于帧和消息的信号机制,支持代理和严格的 Unicode 检查。

它的官方链接:



3. WebSocket 的开源实现 noPoll
noPoll 是一个 WebSocket 的开源实现,使用 ANSI C 编写,
可用于构建纯 WebSocket 解决方案和为已有的面向 TCP 的应用程序提供 WebSocket 支持。

它的官方链接:


4. WebSocket 的 C++ 开发包 websocket++
WebSocket++ 是一个只包含 C++ 头文件的 WebSocket 的 C++ 开发包,实现了 RFC 6455 也就是 WebSocket 协议。
可以在 C++ 应用中实现 WebSocket 客户端和服务器端功能。
使用可交换的网络传输模块,包括 C++ iostreams 和 Boost Asio。

主要特性:
 . Full support for RFC6455
 . Partial support for Hixie 76 / Hybi 00, 07-17 draft specs (server only)
 . Message/event based interface
 . Supports secure WebSockets (TLS), IPv6, and explicit proxies.
 . Flexible dependency management (C++11 Standard Library or Boost)
 . Interchangeable network transport modules (iostream and Boost Asio)
 . Portable/cross platform (Posix/Windows, 32/64bit, Intel/ARM/PPC)
 . Thread-safe

它的官方链接:


5. Wslay 是一个用 C 语言实现的 WebSocket 开发库。
实现了 RFC 6455 中描述的第 13 版本的协议。提供了基于事件的 API 和基于帧的底层 API。
特别适合非堵塞的 reactor 模式风格应用。可在不同的事件中设置回调。
Wslay 只支持 WebSocket 协议的数据传输部分,不执行 HTTP 的握手过程。

示例代码:
ssize_t send_callback(wslay_event_context_ptr ctx,
                      const uint8_t *data, size_t len, void *user_data)
{
  struct Session *session = (struct Session*)user_data;
  ssize_t r;
 
  int sflags = 0;
#ifdef MSG_MORE
  if(flags & WSLAY_MSG_MORE) {
    sflags |= MSG_MORE;
  }
#endif // MSG_MORE
  while((r = send(session->fd, data, len, sflags)) == -1 && errno == EINTR);
  if(r == -1) {
    if(errno == EAGAIN || errno == EWOULDBLOCK) {
      wslay_event_set_error(ctx, WSLAY_ERR_WOULDBLOCK);
    } else {
      wslay_event_set_error(ctx, WSLAY_ERR_CALLBACK_FAILURE);
    }
  }
  return r;
}

它的官方链接:


6. node-http-proxy 
是一个全功能的 Nginx 的 HTTP 代理扩展,支持 WebSocket 
 

三、Object-C实现websocket


SocketRocket是一个WebSocket客户端(WebSocket是适用于Web应用的下一代全双工通讯协议,
被成为“Web的TCP”,它实现了浏览器与服务器的双向通信),采用Object-C编写。
SocketRocket遵循最新的WebSocket规范RFC 6455。这里是开发者描述的其一些特性/设计: 

支持TLS (wss)。
使用NSStream/CFNetworking。
使用ARC。
采用并行架构。大部分的工作由后端的工作队列(worker queues)完成。
基于委托编程。
开发者表示,SocketRocket支持iOS 4.x系统(应该也可以运行于OS X),不需要任何UI包依赖。详细信息可以查看此文介绍。 

目前,SocketRocket代码已托管于GitHub()。 


四、Javascript实现websocket


Easy WebSocket
EasyWebSocket 是一个封装了 WebSocket API 的 JavaScript 库,大大简化了 WebSocket 应用的开发。 
目前,EasyWebsocket不仅存在兼容性问题,而且,还无法解决复杂系统的兼容性问题。
事实上, EasyWebsocket将WebSocket封装成了一个库, 如果浏览器支持WebSocket则直接使用HTML5 WebSocket,
如果不支持它会将你的Socket请求发送给它用node.js写的中转服务器上, 
然后再通过Ajax方法从它的Server返回到用户的浏览器上.

 类似资料: