您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: