一、WebSocket客户端

websocket允许通过JavaScript建立与远程服务器的连接,从而实现客户端与服务器间双向的通信。在websocket中有两个方法:  
    1、send() 向远程服务器发送数据
    2、close() 关闭该websocket链接
  websocket同时还定义了几个监听函数    
    1、onopen 当网络连接建立时触发该事件
    2、onerror 当网络发生错误时触发该事件
    3、onclose 当websocket被关闭时触发该事件
    4、onmessage 当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。msg.data
  websocket还定义了一个readyState属性,这个属性可以返回websocket所处的状态:
    1、CONNECTING(0) websocket正尝试与服务器建立连接
    2、OPEN(1) websocket与服务器已经建立连接
    3、CLOSING(2) websocket正在关闭与服务器的连接
    4、CLOSED(3) websocket已经关闭了与服务器的连接

  websocket的url开头是ws,如果需要ssl加密可以使用wss,当我们调用websocket的构造方法构建一个websocket对象(new WebSocket(url))的之后,就可以进行即时通信了。

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta name="viewport" content="width=device-width" />
  6. <title>WebSocket 客户端</title>
  7. </head>
  8.  
  9. <body>
  10. <div>
  11. <input type="button" id="btnConnection" value="连接" />
  12. <input type="button" id="btnClose" value="关闭" />
  13. <input type="button" id="btnSend" value="发送" />
  14. </div>
  15. <script src="js/jquery-1.11.1.min.js" type="text/javascript" charset="utf-8"></script>
  16. <script type="text/javascript">
  17. var socket;
  18. if(typeof(WebSocket) == "undefined") {
  19. alert("您的浏览器不支持WebSocket");
  20. //return;
  21. }
  22.  
  23. $("#btnConnection").click(function() {
  24. //实现化WebSocket对象,指定要连接的服务器地址与端口
  25. socket = new WebSocket("ws://127.0.0.1:8080/spring-websocket-test/demo2/duanxz");
  26. //打开事件
  27. socket.onopen = function() {
  28. alert("Socket 已打开");
  29. //socket.send("这是来自客户端的消息" + location.href + new Date());
  30. };
  31. //获得消息事件
  32. socket.onmessage = function(msg) {
  33. alert(msg.data);
  34. };
  35. //关闭事件
  36. socket.onclose = function() {
  37. alert("Socket已关闭");
  38. };
  39. //发生了错误事件
  40. socket.onerror = function() {
  41. alert("发生了错误");
  42. }
  43. });
  44.  
  45. //发送消息
  46. $("#btnSend").click(function() {
  47. socket.send("这是来自客户端的消息" + location.href + new Date());
  48. });
  49.  
  50. //关闭
  51. $("#btnClose").click(function() {
  52. socket.close();
  53. });
  54. </script>
  55. </body>
  56.  
  57. </html>

二、WebSocket服务器端

JSR356定义了WebSocket的规范,Tomcat7中实现了该标准。JSR356 的 WebSocket 规范使用 javax.websocket.*的 API,可以将一个普通 Java 对象(POJO)使用 @ServerEndpoint 注释作为 WebSocket 服务器的端点。

  1. package org.springframework.samples.websocket.echo2;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.websocket.CloseReason;
  6. import javax.websocket.OnClose;
  7. import javax.websocket.OnError;
  8. import javax.websocket.OnMessage;
  9. import javax.websocket.OnOpen;
  10. import javax.websocket.Session;
  11. import javax.websocket.server.ServerEndpoint;
  12.  
  13. @ServerEndpoint("/push")
  14. public class EchoEndpoint {
  15.  
  16. @OnOpen
  17. public void onOpen(Session session) throws IOException {
  18. // 以下代码省略...
  19. }
  20.  
  21. @OnMessage
  22. public String onMessage(String message) {
  23. // 以下代码省略...
  24. return null;
  25. }
  26.  
  27. @Message(maxMessageSize = 6)
  28. public void receiveMessage(String s) {
  29. // 以下代码省略...
  30. }
  31.  
  32. @OnError
  33. public void onError(Throwable t) {
  34. // 以下代码省略...
  35. }
  36.  
  37. @OnClose
  38. public void onClose(Session session, CloseReason reason) {
  39. // 以下代码省略...
  40. }
  41.  
  42. }

上面简洁代码即建立了一个WebSocket的服务端,@ServerEndpoint("/push")的annotation注释端点表示将WebSocket服务端运行在ws://[Server端IP或域名]:[Server端口]/项目/push的访问端点,客户端浏览器已经可以对WebSocket客户端API发起HTTP长连接了。
使用ServerEndpoint注释的类必须有一个公共的无参数构造函数,

@OnMessage注解的Java方法用于接收传入的WebSocket信息,这个信息可以是文本格式,也可以是二进制格式。
@OnOpen注解的java方法用于在这个端点一个新的连接建立时被调用。参数提供了连接的另一端的更多细节。Session表明两个WebSocket端点对话连接的另一端,可以理解为类似HTTPSession的概念。
@OnClose注解的java方法用于在连接被终止时调用。参数closeReason可封装更多细节,如为什么一个WebSocket连接关闭。
更高级的定制如@Message注释,MaxMessageSize属性可以被用来定义消息字节最大限制,在示例程序中,如果超过6个字节的信息被接收,就报告错误和连接关闭。

三、常见状态码

任何一端发送关闭帧给对方,即可关闭连接。关闭连接时通常都带有关闭连接的状态码(status code)。常见状态码的含义如下:

  • 1000 连接正常关闭
  • 1001 端点离线,例如服务器down,或者浏览器已经离开此页面
  • 1002 端点因为协议错误而中断连接
  • 1003 端点因为受到不能接受的数据类型而中断连接
  • 1004 保留
  • 1005 保留, 用于提示应用未收到连接关闭的状态码
  • 1006 端点异常关闭
  • 1007 端点收到的数据帧类型不一致而导致连接关闭
  • 1008 数据违例而关闭连接
  • 1009 收到的消息数据太大而关闭连接
  • 1010 客户端因为服务器未协商扩展而关闭
  • 1011 服务器因为遭遇异常而关闭连接
  • 1015 TLS握手失败关闭连接

四、部署

如果在与Web服务器集成的情况下使用使用WebSocket,通常需要Web服务器进行额外配置,具体可以参见各种Web服务器的配置方案,此处不再赘述:

Apache:http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html。 
Nginx:https://www.nginx.com/blog/websocket-nginx/

既然WebSocket是HTML5新增的特性,那么在使用时我们就要考虑浏览器旧版本兼容的问题,这也是Comet方案尽管存在各种问题,但仍旧被采用的原因。

五、示例

  1. package org.springframework.samples.websocket.echo2;
  2.  
  3. import javax.websocket.CloseReason;
  4. import javax.websocket.OnClose;
  5. import javax.websocket.OnError;
  6. import javax.websocket.OnMessage;
  7. import javax.websocket.OnOpen;
  8. import javax.websocket.Session;
  9. import javax.websocket.server.PathParam;
  10. import javax.websocket.server.ServerEndpoint;
  11.  
  12. import org.springframework.web.socket.server.standard.SpringConfigurator;
  13.  
  14. //ws://127.0.0.1:8080/project/ws/张三
  15. @ServerEndpoint(value = "/demo2/{user}", configurator = SpringConfigurator.class)
  16. public class WSServer {
  17. private String currentUser;
  18.  
  19. // 连接打开时执行
  20. @OnOpen
  21. public void onOpen(@PathParam("user") String user, Session session) {
  22. currentUser = user;
  23. System.out.println("Connected ... " + session.getId());
  24. }
  25.  
  26. // 收到消息时执行
  27. @OnMessage
  28. public String onMessage(String message, Session session) {
  29. System.out.println(currentUser + ":" + message);
  30. return currentUser + ":" + message;
  31. }
  32.  
  33. // 连接关闭时执行
  34. @OnClose
  35. public void onClose(Session session, CloseReason closeReason) {
  36. System.out.println(String.format("Session %s closed because of %s", session.getId(), closeReason));
  37. }
  38.  
  39. // 连接错误时执行
  40. @OnError
  41. public void onError(Throwable t) {
  42. t.printStackTrace();
  43. }
  44. }

url中的字符张三是的路径参数,响应请求的方法将自动映射。

六、测试运行

websocket之二:WebSocket编程入门的更多相关文章

  1. WebSocket 介绍(二)-WebSocket API

    这一章介绍如何用WebSocket API来控制协议和创建应用,运用http://websocket.org 提供的现有WebSocket服务器,我们可以收发消息.创建一些简单的WebSocket应用 ...

  2. 通讯编程入门--WEBSOCKET

    C#通讯编程入门--WEBSOCKET WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System ...

  3. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  4. Websocket和PHP Socket编程

    本来是搜一些html5 websocket资料看的,结果被引去看了php的socket编程.下面是一些简单的例子,在命令行运行php脚本就行 [命令行运行PHP]PHP中有一个php.exe文件,可以 ...

  5. 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...

  6. WebSocket原理与实践(二)---WebSocket协议

    WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...

  7. VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

    上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...

  8. [转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?     http://www.52im.net/thread-1732-1-1.html   1.引言 本文接上篇<脑残式网 ...

  9. WebSocket刨根问底(二)

    上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...

  10. WebSocket(二)-WebSocket、Socket、TCP、HTTP区别

    原文地址:Socket 与 WebSocket 1. 概述 WebSocket 是为了满足基于 Web 的日益增长的实时通信需求而产生的.在传统的 Web 中,要实现实时通信,通用的方式是采用 HTT ...

随机推荐

  1. JQuery的一些思想,自己的一些见解!!!!

    自己总结了一下JQuery底层的一些思想,纯属于个人见解.. 为了方便描述,现在客户假如给了我们一个需求: 页面上有两个按钮,一张图片,当我点击hidden按钮时隐藏图片,当我点击show按钮时显示图 ...

  2. API -- 图书

    豆瓣IAPI:https://developers.douban.com/wiki/?title=book_v2#get_isbn_book 其他:http://www.cnblogs.com/sop ...

  3. ios和mac开发 学习资料

    1.WWDC14 Session 409 学习笔记: http://url.cn/Ju2Yt5 2..WWDC14 Session 4092学习笔记: http://url.cn/Rx0mAN 3.i ...

  4. C#中的let字句应用示例

    一.应用场景 在查询表达式中,存储子表达式的结果有时很有用,这样可以在随后的子句中使用. 可以使用 let 关键字完成这一工作,该关键字可以创建一个新的范围变量,并且用您提供的表达式的结果初始化该变量 ...

  5. 五个知识体系之-SQL学习-第四天

    5. MySQL常用函数 5.1字符串函数 concat(s1,s2....,s3)合并字符串,如果参数有null,则返回null: CONCAT_WS(SEP,s1,s2…,sn) 合并字符串,并且 ...

  6. spring事务和mysql的隔离级别

    mysql事务.mysql隔离级别.mysql锁.mysql数据一致性.Spring事务.Spring事务传播性之间的关系 一直有些模糊,整理一下.   mysql事务: 在mysql中,只有使用了I ...

  7. 计算机网络 --万维网www

    万维网是一个分布式的超媒体系统,客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所需要的万维网文档.万维网必须解决的几个问题:1.怎样标志分布在整个因特网上的万维网文档?答:万维网使用统一的 ...

  8. A good example is a User-Agent switcher which changes User-Agent on every request:

    Configuration | Colly http://go-colly.org/docs/introduction/configuration/

  9. 【题解】UVA10140 [Prime Distance]

    [题解]UVA10140 Prime Distance 哈哈哈哈\(miller-rabbin\)水过去了哈哈哈 还能怎么办呢?\(miller-rabbin\)直接搞.枚举即可,还跑得飞快. 当然此 ...

  10. systemclock sleep 睡眠