WebSocket百度经验

2024-11-10 23:19:24

1、jquery首先了解一下Websocket的jqueryAPI/*申请一个WebSocket对象,参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。*/varws=newWebSocket(“ws://echo.websocket.org”); //如果链接成功则触发ws.onopen事件ws.onopen=function(){ws.send(“Test!”);}; //如果服务器发来消息则触发ws.onopen事件ws.onmessage=function(evt){alert(evt.data)};//关闭事件ws.onclose=function(evt){console.log(“WebSocketClosed!”);};//错误事件ws.onerror=function(evt){console.log(“WebSocketError!”);};

2、//javapackage com.byteslounge.websockets;import java.io.IOException;import javax.websocket.OnClose;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;//下面的注解意思url的地址//比如:http://127.0.0.1/websocket 就直接可以访问啦@ServerEndpoint("/websocket")public class WebSocketTest {//@OnMessagepublic void onMessage(String message, Session session)throws IOException, InterruptedException {//session会话,这个会话与httpSession不是一个会话 session.getBasicRemote().sendText(message+",本信息有服务器进行过转发");} //当用户进入则触发本事件@OnOpenpublic void onOpen() {System.out.println("Client connected");}//就不解释了@OnClosepublic void onClose() {System.out.println("Connection closed");}}

3、WebSocket和Socket 是可以连接的但需要进行验证下面就是进行验证的方法(握手阶段,以下内容来自h-t-t-p://jinnianshilongnian.iteye.com/blog/1896756)打开阶段握手目的是兼容基于HTTP的服务器软件和中间件,以便单个端口可以用于与服务器交流的HTTP客户端和与服务器交流的WebSocket客户端。最后,WebSocket客户端的握手是一个HTTP Upgrade请求: GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13依照[RFC2616],握手中的头字段可能由客户端按照任意顺序发送,因此在接收的不同头字段中的顺序是不重要的。“Request-URI”的GET方法[RFC2616]用于识别WebSocket连接的端点,即允许从一个IP地址服务的多个域名,也允许由单台服务器服务的多个WebSocket端点。 客户端按照[RFC2616]在它的握手的|Host|头字段中包含主机名,以便客户端和服务器都都能验证他们同意哪一个正在使用的主机。在WebSocket协议中另外的头字段可以用于选择选项。典型的选项在这个版本中可用的是子协议选择器(|Sec-WebSocket-Protocol|)、客户端支持的扩展列表(|Sec-WebSocket-Extensions|)、|Origin|头字段等。|Sec-WebSocket-Protocol|请求头字段可以用来表示客户端接受的子协议(WebSocket协议上的应用级协议层)。服务器选择一个可接受的协议或不,并在它的握手中回应该值表示它已经选择了那个协议。 Sec-WebSocket-Protocol: chat|Origin|头字段[RFC6454]是用于保护防止未授权的被浏览器中的使用WebSocket API的脚本跨域使用WebSocket服务器。服务器收到WebSocket连接请求生成的脚本来源。如果服务器不想接受来自此来源的连接,它可以选择通过发送一个适当的HTTP错误码拒绝该连接。这个头字段由浏览器客户端发送,对于非浏览器客户端,如果它在这些客户端上下文中有意义,这个头字段可以被发送。最后,服务器要证明收到客户端WebSocket握手的客户端,以便服务器不接受不是WebSocket连接的连接。这可以防止一个通过使用XMLHttpRequest [XMLHttpRequest]或一个表单提交发送它精心制作的包欺骗WebSocket服务器的攻击者。为了证明收到的握手,服务器必须携带两条信息并组合他们形成一个响应。第一条信息源自客户端握手中的| Sec-WebSocket-Key |头信息: Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==对于这个头字段,服务器必须携带其值(出现在头字段上,如,减去开头和结尾空格的base64-编码[RFC4648]的版本)并将这个与字符串形式的全局唯一标识符(GUID,[RFC4122])“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”连接起来,其不太可能被不理解WebSocket协议的网络端点使用。SHA-1散列(160位)[FIPS.180-3]、base-64编码(参见[RFC4648]第4章)、用于这个的一系列相关事物接着在服务器握手过程中返回。具体而言,如果在上面例子中,|Sec-WebSocket-Key|头字段的值为“dGhlIHNhbXBsZSBub25jZQ==”,服务器将连接字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”形成字符串“dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11”。服务器接着使用SHA-1散列这个,并产生值0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea。这个值接着使用base64编码(参见[RFC4648]第4章),产生值“s3pPLMBiTxaQ9kYGzzhZRbK+xOo=”。这个值将接着在|Sec-WebSocket-Accept|头字段中回应。来自服务器的握手比客户端握手更简单。首行是一个HTTP Status-Line,具有状态码101: HTTP/1.1 101 Switching Protocols101以外的任何状态码表示WebSocket握手没有完成且HTTP语义仍适用。头信息遵照该状态码。|Connection|和|Upgrade|头字段完成HTTP升级。|Sec-WebSocket-Accept|头字段表示服务器是否将接受该连接。如果存在,这个头字段必须包括客户端在|Sec-WebSocket-Key|中现时发送的与预定义的GUID的散列。任何其他值不能被解释为一个服务器可接受的连接。 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=这些字段由WebSocket客户端为脚本页面做检查。如果|Sec-WebSocket-Accept|不能匹配盼望的值、如果头字段缺失、或HTTP状态码不是101,则连接将不能建立,且WebSocket帧将不发生。可选的字段也可以被包含在内。在这合格版本的协议中,主要可选字段是|Sec-WebSocket-Protocol|,其表示服务器选择的子协议。WebSocket客户端验证服务器包含的在WebSocket客户端握手中指定的一个值。声明多个子协议的服务器必须确保它选择一个,基于客户端握手并指定它在其握手中。 Sec-WebSocket-Protocol: chat服务器也可以设置cookie相关的可选字段为_set_cookies,描述在[RFC6265]。

猜你喜欢