2019独角兽企业重金招聘Python工程师标准>>>

发送与接收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.DecodeException;
import javax.websocket.EndpointConfig;import com.alibaba.fastjson.JSON;public class UserDecoder implements javax.websocket.Decoder.Text<User> {@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void init(EndpointConfig arg0) {// TODO Auto-generated method stub}@Overridepublic User decode(String user) throws DecodeException {return JSON.parseObject(user, User.class);}@Overridepublic 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> {@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void init(EndpointConfig arg0) {// TODO Auto-generated method stub}@Overridepublic 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;@OnOpenpublic void onOpen(Session ws_session) {// 设置session,并记录建立连接时间this.ws_session = ws_session;// 通知客户端连接成功this.sendMessage("success:opened.");}@OnMessagepublic User onMessage(User user) {// 做点处理返回给客户端user.setName("yes, jack");return user;}@OnErrorpublic void onError(Throwable t) {// 发生异常时,如果连接还是打开状态,则通知客户端错误信息if (ws_session.isOpen()) {this.sendMessage("warning:Error:" + t.getMessage());}}@OnClosepublic 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"><spanclass="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>

转载于:https://my.oschina.net/u/2981366/blog/778273

3.WebSocket编程—发送与接收JAVA对象相关推荐

  1. 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)

    概述 本文为 WebSocket 协议的第六章,本文翻译的主要内容为 WebSocket 消息发送与接收相关内容. 发送与接收消息(协议正文) 6.1 发送数据 为了通过 WebSocket 连接发送 ...

  2. java mina 大文件传输_mina 传输java对象

    mina client和server端传输和接收java对象,是java序列化和反序列化的过程. mina-core包中有对这一块encoder-decoder的编解码类. ObjectSeriali ...

  3. java 网络传输中发送byte[]和接收到的不一致_为什么JAVA对象需要实现序列化?

    序列化是一种用来处理对象流的机制.所谓对象流:就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题.序列化的 ...

  4. python socket清空接收缓冲区_Python网络编程——修改套接字发送和接收的缓冲区大小...

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  5. 25. Python语言 Web 开发 之 Socket 编程 · 第一章 UDP发送与接收数据

    UDP发送与接收数据 本章主题 关键词 前导: 计算机网络的发展及基础网络概念 两台电脑的通信 IP地址介绍及分类 IP地址与IP协议 Windows 和 Linux 查看网卡信息 IP地址分类 以太 ...

  6. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  7. 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...

    简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...

  8. 【趣话编程】一个Java对象的回忆录:垃圾回收

    简介:趣话编程第三期,今天让我们一起去看看一个Java对象的回忆录:垃圾回收. 原文链接 对象的诞生 "你醒啦!",迷迷糊糊中听到一个声音,我睁开了眼睛,发现一个小伙伴正看着我. ...

  9. JAVA ActiveMQ消息发送和接收

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

最新文章

  1. python 隐马尔科夫_隐马尔可夫模型原理和python实现
  2. python面向对象重新梳理
  3. ITK:图像阈值演示可用的阈值算法
  4. 对谈|人工智能来了,翻译们会失业吗?
  5. Python3下载图像小工具
  6. vue中怎么点击修改文字_怎么拍照识别文字?什么软件可以识别照片中文字?
  7. oracle ebs工单入库,ORACLE-EBS_库存功能点操作模块.doc
  8. Steam上传游戏包体的三种方法
  9. 第八章 DirectX 3D模型加载和骨骼动画(上)
  10. 转盘抽奖脚本html,转盘抽奖脚本自己撸
  11. 华中电网项目日志:Rational version 7.0 技术会议纪要
  12. 合肥工业大学 OnlineJudge——1003 B-黑石部落
  13. 做uni-app时,遇到后台返回base64码,将base64码转为图片,但是图片没有显示出来的解决方法
  14. 小型固定翼无人机集群仿真演示平台
  15. 4、Javaweb_JavaScript DOM BOM 事件
  16. nuScenes自动驾驶数据集:格式转换,模型的数据加载(二)
  17. 东方通中间件 - TongWeb 初级
  18. 24号香格里拉--英特尔迅驰二代风尚盛典记录
  19. 棋盘放麦子(c++版本)
  20. 有钱人不需要保险,只需要更好的医疗服务?

热门文章

  1. Pointnet语义分割任务S3DIS数据集上的注意点
  2. 苹果icloud文件服务器,你真的会用苹果iCloud吗?这7个隐藏功能,你未必全知道...
  3. 怎么把字母缩小当符号_iPhone自带输入法怎么用 iPhone自带输入法小技巧【详解】...
  4. windows10录屏快捷键是什么
  5. linux裸设备文件系统,关于裸设备,文件系统,CIO/DIO
  6. 打开计算机页面只有上面一半,我电脑打开网页总是打开一半,不知道是为什么,请高手指教,谢谢!...
  7. 如何用数学课件制作工具画函数切线
  8. 面试题目:2个鸡蛋100层楼问题
  9. Go的Negroni库
  10. c 语言从指针得到对象,c – 获取指向由智能指针指向的对象的指针 – Ivalue错误...