热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTML5+websocket实现举例

在本教程中,我们将实现一个HTML5websocket诉诸于JavaEEwebsocket实现(ServerEndpoint)。介绍HTML5规范了web浏览器的能力建立全双工TC
在本教程中,我们将实现一个HTML5 websocket诉诸于Java EE websocket实现(ServerEndpoint)。

介绍

HTML5规范了web浏览器的能力建立全双工TCP连接与websocket服务器兼容。

换句话说,浏览器现在可以与服务器建立连接,通过相同的发送或接收数据建立通信通道,无需由HTTP协议本身引入的开销。

在本教程中,我们将实现一个简单的Java EE环境中websocket服务器端点以及相应的客户端发送和接收数据的基础设施。

本教程将下列环境:

 

  1. Ubuntu 12.04
  2. JDK 1.7.0.21
  3. Glassfish 4.0
请注意 :介绍了WebSockets支持Java EE 7

WebSocket服务器端点

让我们定义一个Java EE websocket服务器端点:

WebSocketTest.java


package 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; &#64;ServerEndpoint("/websocket") public class WebSocketTest { &#64;OnMessage public void onMessage(String message, Session session) throws IOException, InterruptedException { // Print the client message for testing purposes System.out.println("Received: " &#43; message); // Send the first message to the client session.getBasicRemote().sendText("This is the first server message"); // Send 3 messages to the client every 5 seconds int sentMessages &#61; 0; while(sentMessages < 3){ Thread.sleep(5000); session.getBasicRemote(). sendText("This is an intermediate server message. Count: " &#43; sentMessages); sentMessages&#43;&#43;; } // Send a final message to the client session.getBasicRemote().sendText("This is the last server message"); } &#64;OnOpen public void onOpen() { System.out.println("Client connected"); } &#64;OnClose public void onClose() { System.out.println("Connection closed"); } }

正如你可能已经注意到我们进口的几类 javax.websocket 包中。

&#64;ServerEndpoint 注释用于类型水平和当前类定义为一个websocket服务器端点。 这个注释中使用的值代表端点的URL将监听客户端连接。

onOpen onClose 方法注释与 &#64;OnOpen &#64;OnClose 分别。 这些注释几乎是不言而喻的:他们定义哪些方法将呼吁一个新的客户端连接和断开。

方法 onMessage 有注释的 &#64;OnMessage 。 这个注释定义的方法将调用当收到新消息从客户端。 注意,这个方法可以定义一个可选参数的类型 javax.websocket.Session (在我们的例子中 会话 参数)。 如果这个参数是定义了容器将注入会话相关联与当前客户端发送的消息被处理。

在我们的例子中我们只是客户端消息内容写入到标准输出。 然后我们继续发送消息到客户端之后,用5秒间隔3测试消息。 最后我们最后一个消息发送到客户端。

客户端

现在我们需要写我们websocket测试应用程序的客户端:

page.html




type&#61;"submit" value&#61;"Start" onclick&#61;"start()" />
id&#61;"messages">

这是一个简单的测试页面,其中包含的Javascript创建一个websocket连接了websocket服务器端点。

onOpen 方法将调用当我们与服务器建立连接端点。

onError 方法被调用时,当一个错误发生在客户端和服务器之间的通信。

onMessage 方法将调用从服务器收到消息时。 在我们的例子中我们只是附加DOM的从服务器接收到的消息。

我们连接到websocket服务器端点通过构造 新的WebSocket() 并通过端点URL:

ws:/ / localhost:8080 / byteslounge / websocket

测试

我们现在可以测试我们的应用程序通过访问测试页面:

http://localhost:8080 / byteslounge / page.html

我们将会看到的 连接建立 消息如预期:

http://localhost:8080 / byteslounge / page.html
Websocket - Connection established

现在当我们按下这个按钮将通过websocket服务器发送初始消息和接收后续测试由服务器发送的消息:

由服务器发送的消息和接收的客户端
Websocket - Messages exchanged

websocket握手

客户机和服务器之间的TCP连接建立后的发生在HTTP协议握手。 很容易观察握手通过HTTP流量调试器。 一旦我们创建的 WebSocket 实例在客户端请求和各自的服务器响应会发生如下:

请注意 :我们将只包括相关的HTTP头websockets握手

要求:

获得/ byteslounge / websocket HTTP / 1.1
连接:升级
升级:websocket
Sec-WebSocket-Key:wVlUJ / tu9g6EBZEh51iDvQ &#61; &#61;

回应:

HTTP / 1.1 101 Web Socket协议握手
升级:websocket
Sec-WebSocket-Accept:2 tnh &#43; 0 h5gtx019lci6mnvs66psy &#61;

请注意,客户端请求协议升级到WebSocket协议通过使用 连接:升级 升级:websocket HTTP头信息。 服务器响应,客户端请求被接受,它将改变协议WebSocket(使用HTTP状态代码101):

HTTP / 1.1 101 Web Socket协议握手

下载样例

示例源代码可供下载的这个页面。 测试在Glassfish 4被处决(你需要一个Java EE 7兼容的应用程序服务器)。

从本文下载源代码

下载链接: java-ee-html5-websocket-example.zip

 

转:https://www.cnblogs.com/lyl693/p/6656716.html



推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
author-avatar
庄乐星
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有