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

3.WebSocket编程—发送与接收JAVA对象

2017-01-19 16:00 357 查看
摘要: 主要介绍了用@OnMessage修饰的函数如何发送或接收Java对象

发送与接收JAVA对象

被@OnMessage修饰的函数是用来接收和返回客户端发送过来的消息的,接收的参数和返回值可以为Java对象。

要使@OnMessage修饰的函数可以处理Java对象,需要对端点类设置decoders和encoders,其中decoders类需要实现接口javax.websocket.Decoder.Text<User>,而encoders类需要实现接口javax.websocket.Encoder.Text<User>,下面是具体例子:



1.点击连接按钮与服务端连接;

2.点击发送按钮发送一个json对象到服务端;

3.服务端返回一个java对象的json字符串到客户端;

4.关闭与服务端的连接;

pom文件

<dependencies>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.20</version>
</dependency>

</dependencies>


实体类

实体类是一个POJO对象,叫User,具有两个属性Id和Name,下面是实体类的代码:

package cn.net.bysoft.websocketapp.lesson3;

public class User implements java.io.Serializable {

private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}


转换类

转换类有两个,分别是UserDecoder和UserEncoder。

注意:UserDecoder类中,有一个willDecode方法,该方法优先于decode被调用。这是为了使你有一个跳过解码消息的机会。

下面是具体代码:

package cn.net.bysoft.websocketapp.lesson3;

import javax.websocket.DecodeExceptio
7fe0
n;
import javax.websocket.EndpointConfig;

import com.alibaba.fastjson.JSON;

public class UserDecoder implements javax.websocket.Decoder.Text<User> {

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void init(EndpointConfig arg0) {
// TODO Auto-generated method stub

}

@Override
public User decode(String user) throws DecodeException {
return JSON.parseObject(user, User.class);
}

@Override
public boolean willDecode(String arg0) {
return true;
}

}

package cn.net.bysoft.websocketapp.lesson3;

import javax.websocket.EncodeException;
import javax.websocket.EndpointConfig;

import com.alibaba.fastjson.JSON;

public class UserEncoder implements javax.websocket.Encoder.Text<User> {

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void init(EndpointConfig arg0) {
// TODO Auto-generated method stub

}

@Override
public String encode(User user) throws EncodeException {
return JSON.toJSONString(user);
}

}


服务端端点代码

在@ServerEndpoint中指定了decoders和encoders,具体代码如下:

package cn.net.bysoft.websocketapp.lesson3;

import java.io.IOException;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/objecthandle", decoders = { UserDecoder.class }, encoders = { UserEncoder.class })
public class ObjectHandle {

private Session ws_session;

@OnOpen
public void onOpen(Session ws_session) {
// 设置session,并记录建立连接时间
this.ws_session = ws_session;
// 通知客户端连接成功
this.sendMessage("success:opened.");
}

@OnMessage
public User onMessage(User user) {
// 做点处理返回给客户端
user.setName("yes, jack");
return user;
}

@OnError
public void onError(Throwable t) {
// 发生异常时,如果连接还是打开状态,则通知客户端错误信息
if (ws_session.isOpen()) {
this.sendMessage("warning:Error:" + t.getMessage());
}
}

@OnClose
public void onClose() {
// 关闭连接时,需要做的事情在该函数内完成,例如关闭数据库连接等
}

private void sendMessage(String message) {
try {
// 以同步的方式向客户端发送消息
ws_session.getBasicRemote().sendText(message);
} catch (IOException e) {
System.out.println("Method: sendMessage, Error closeing session " + e.getMessage());
}
}
}


客户端代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet"
href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<!-- 可选的Bootstrap主题文件(一般不用引入) -->
<link rel="stylesheet"
href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap-theme.min.css">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>WebSocket发送JAVA对象</h1>
<div class="row">

<div class="col-md-12">
<p>
<button type="button" class="btn btn-primary"
onclick="open_connection()">打开连接</button>
<button type="button" class="btn btn-danger"
onclick="closeClient()">关闭连接</button>
</p>
</div>
</div>
<div class="row">
<form class="form-inline" role="form">
<div class="col-md-12">
<div class="form-group">
<div class="input-group">
<div class="input-group">
<span class="input-group-addon"><span
class="glyphicon glyphicon-send"></span></span>
<input id="txtMessage" value="{id:1, name: jack}" readonly="readonly"
type="text" class="form-control" placeholder="Send Message">
</div>
<button type="button" class="btn btn-info"
onclick="messageClick()">发送消息</button>
</div>
</div>
</div>
</form>
</div>
<div class="row">
<div class="col-md-12">
<p id="output">
<br>
</p>
</div>
</div>
</div>
</body>
<script>
var lifecycle_websocket = null;

function init() {
output = document.getElementById("output");
}

function dispose() {
lifecycle_websocket.close();
lifecycle_websocket = null;
}

function open_connection() {
if (lifecycle_websocket == null) {
lifecycle_websocket = new WebSocket(
"ws://localhost:8080/websocketapp/objecthandle");

lifecycle_websocket.onmessage = function(evt) {
displayMessage(evt.data);
}
lifecycle_websocket.onclose = function(evt) {
displayMessage(evt.data);
}
lifecycle_websocket.onerror = function(evt) {
displayMessage(evt.data);
}
}
}

function messageClick() {
var user = {
id: 1,
name: "jack"
}
send_message(JSON.stringify(user));
}

function closeClient() {
lifecycle_websocket.close();
displayMessage("danger:client closed.")
}

function send_message(message) {
lifecycle_websocket.send(message);
}

function displayMessage(message) {
var pre = document.createElement("p");
if(message.indexOf('{') == 0) {
// 调用bootstrap样式
pre.className = "text-info";
pre.innerHTML = message;
output.appendChild(pre);
}
else {
var flag = message.substring(0, message.indexOf(':'));
var data = message.substring(message.indexOf(':') + 1);

// 调用bootstrap样式
pre.className = "text-" + flag;
pre.innerHTML = data;
output.appendChild(pre);
}
}

window.addEventListener("load", init, false);
window.addEventListener("unload", dispose, false);
</script>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: