Java WebSocket编程——一个简单的例子(编程式)
2016-01-18 16:48
761 查看
第一步:创建WebSocket端点(服务器端)
①编写Java类继承Endpoint类
/** * */ package com.webSocket.demo; import java.io.IOException; import javax.websocket.Endpoint; import javax.websocket.EndpointConfig; import javax.websocket.MessageHandler; import javax.websocket.Session; public class ProgrammaticServer extends Endpoint { /* (non-Javadoc) * @see javax.websocket.Endpoint#onOpen(javax.websocket.Session, javax.websocket.EndpointConfig) */ @Override public void onOpen(Session session, EndpointConfig endpointConfig) { final Session mySession = session; mySession.addMessageHandler(new MessageHandler.Whole<String>() { @Override public void onMessage(String message) { try { /*getBasicRemote()获得对RemoteEndpoint的一个引用。通过使用它可以马上返回一个消息给客户端 * 存在两种类型的RemoteEndpoint: RemoteEndpoint.Basic和RemoteEndpoint.Async * RemoteEndpoint.Basic接口提供了一系列方法用于同步发送消息给客户端 * RemoteEndpoint.Async接口提供了一系列方法用于异步发送消息给客户端 */ mySession.getBasicRemote().sendText( "The server has received message:" + message); } catch (IOException ioe) { ioe.printStackTrace(); } } }); } }
②创建Java类实现ServerApplicationConfig接口
/** * */ package com.webSocket.demo; import java.util.HashSet; import java.util.Set; import javax.websocket.Endpoint; import javax.websocket.server.ServerApplicationConfig; import javax.websocket.server.ServerEndpointConfig; /** * @author Memphy * 2016年1月18日 下午4:15:02 */ public class ProgrammaticServerConfig implements ServerApplicationConfig { /* (non-Javadoc) * @see javax.websocket.server.ServerApplicationConfig#getAnnotatedEndpointClasses(java.util.Set) */ /** * 此方法在部署应用时被WebSocket实现调用。其传入的参数scanned是一个集合,它包含了所有通过@ServerEndpoint注解的Java类 */ @Override public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) { return scanned; } /* (non-Javadoc) * @see javax.websocket.server.ServerApplicationConfig#getEndpointConfigs(java.util.Set) */ /** * 此方法在部署应用时被WebSocket实现调用。其传入的参数endpointClasses是一个集合,它包含了所有继承了Endpoint类的Java类 */ @Override public Set<ServerEndpointConfig> getEndpointConfigs( Set<Class<? extends Endpoint>> endpointClasses) { Set<ServerEndpointConfig> configs = new HashSet<ServerEndpointConfig>(); ServerEndpointConfig sec = ServerEndpointConfig.Builder .create(ProgrammaticServer.class, "/programmaticServer").build(); configs.add(sec); return configs; } }
第二步:创建WebSocket端点(客户端)
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Java WebSocket Demo</title> <script type="text/javascript" language="javascript"> var webSocket; var uri = "ws://localhost:8080/WebSocketDemo/programmaticServer" function webSocketDemo() { openWebSocket(uri); initEventHandler(); } function openWebSocket(uri) { webSocket = new WebSocket(uri); } //绑定事件 function initEventHandler() { webSocket.onopen = function (event) { alert("connected!"); var message = document.getElementById("in_message").value; sendMessage(message); } webSocket.onmessage = function (event) { alert("received message : \n" + event.data); closeWebSocket(); } webSocket.onerror = function (event) { alsert("error : " + evnet.data); closeWebSocket(); } } //发送消息到另一个websocket端 function sendMessage(message) { webSocket.send(message); } //关闭webSocket function closeWebSocket() { webSocket.close(); } </script> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>Java WebSocket Demo</h1> <form action=""> <input type="button" onclick="webSocketDemo()" value="press to send message"> <input id="in_message" value="Hello word!"> </form> </body> </html>
分析:
方法onOpen()的实现创建了MessageHandler的实现,然后添加MessageHandler的实例到表示客户端连接的会话上。下次当文本消息从客户端连接到来时,它将被WebSocket实现路由到此MessageHandler的onMessage()方法中。在注解式端点实例中,客户端到服务器端的路径是注解@ServerEndpoint的一个属性。而在编程式端点中,我们需要提供ServerApplicationConfig接口的实现来告诉WebSocket如何部署到此端点。
参考书籍:
《Java WebSocket编程 开发、部署和保护动态Web应用》/(美)科沃德(Coward, D.) 著;刘建、夏先波 译. ——北京:清华大学出版社,2015
相关文章推荐
- eclipse下导入jdk源码
- 解决Eclipse建立Maven项目后无src/main/java资源文件夹的办法
- Java项目中读取properties文件,以及六种获取路径的方法
- 深入理解 Java final 变量的内存模型
- Java异常的理解
- Java中static与final的思考
- java模拟UAS发包
- java-jdk环境变量设置
- Spring 各版本下载地址
- Java经典编程实例源码及视频专题汇总
- Javaweb学习总结(四):JavaBean组件技术
- 解决eclipse中egit中的cannot open git-upload-pack问题
- activemq 发布者/订阅 springmvc maven 例子[代码参考]
- JAVA_字符串(String)
- Java WebSocket——一个简单的例子(注解式)
- Java 中 extends 使用时的小漏洞
- Java XML解析工具 dom4j介绍及使用实例
- Java XML解析工具 JDOM
- hadoop eclipse 开发环境搭建
- ML的DOM解析 Java实现 使用递归解析一个XML文档