Java实现websocket
最近一直在思考一个问题:服务器如何主动发消息给浏览器?传统的Web都是浏览器主动向服务器发送请求,服务器收到请求之后返回数据给浏览器。如果要实现服务器主动向浏览器发送消息,即实现Web版的即时通信应该怎么做?貌似没有答案。之前有考虑用轮询的方式实现伪即时通信,client1要发送消息给client2,只能先把消息发送给服务器,服务器等到client2来查询有没有新消息的时候才把client1发来的消息转发给client2.这样就必须在client页面定时向服务器发送查询请求,比如5秒一次或10秒一次,实现伪即时通信。
端午节放假逛51cto发现一种比较好的解决方案:Websocket,下面记录几个Java写的Websocket的栗子,真正的即时通信。
栗子1
前端如下
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">var wsuri = "ws://localhost:8080/Websocket/Websocket?name=shang&password=123456";var ws = null;function startWebSocket() {if ('WebSocket' in window)ws = new WebSocket(wsuri);else if ('MozWebSocket' in window)ws = new MozWebSocket(wsuri);elsealert("not support");ws.onmessage = function(evt) {alert(evt.data);};ws.onclose = function(evt) {alert("close");};ws.onopen = function(evt) {alert("open");};}function sendMsg() {ws.send(document.getElementById('writeMsg').value);}
</script>
</head>
<body οnlοad="startWebSocket();"><input type="text" id="writeMsg" /><input type="button" value="send" οnclick="sendMsg()" />
</body>
</html>
后端如下
package com.websocket;import java.io.IOException;import javax.websocket.CloseReason;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;@ServerEndpoint(value = "/Websocket")
public class Websocket extends Endpoint {private Session session;@Overridepublic void onOpen(Session session, EndpointConfig config) {RemoteEndpoint.Basic remote = session.getBasicRemote();System.out.println("pathParams:" + session.getPathParameters());System.out.println("requestParams" + session.getRequestParameterMap());session.addMessageHandler(new MyMessageHandle(remote));}@Overridepublic void onClose(Session session, CloseReason closeReason) {System.out.println("onClose");}@Overridepublic void onError(Session session, java.lang.Throwable throwable) {System.out.println("onError");}private class MyMessageHandle implements MessageHandler.Whole<String> {RemoteEndpoint.Basic remote = null;public MyMessageHandle(RemoteEndpoint.Basic remote) {this.remote = remote;}@Overridepublic void onMessage(String s) {System.out.println(s);try {remote.sendText("success");} catch (IOException e) {e.printStackTrace();}}}}
运测试运行在Tomcat7上正常
栗子2
前端如下
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">var wsuri = "ws://localhost:8080/Websocket/Websocket1?name=shang&password=123456";var ws = null;function startWebSocket() {if ('WebSocket' in window) {ws = new WebSocket(wsuri);} else if ('MozWebSocket' in window) {ws = new MozWebSocket(wsuri);} else {alert("not support");}ws.onmessage = function(evt) {alert(evt.data);};ws.onclose = function(evt) {alert("close");};ws.onopen = function(evt) {alert("open");};}function sendMsg() {ws.send(document.getElementById('writeMsg').value);}
</script>
</head>
<body οnlοad="startWebSocket();"><input type="text" id="writeMsg" /><input type="button" value="send" οnclick="sendMsg()" />
</body>
</html>
后端如下
package com.websocket;import java.io.IOException;import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;@ServerEndpoint(value = "/Websocket1")
public class Websocket1 {private Session session;@OnOpenpublic void open(Session session, EndpointConfig config) {this.session = session;System.out.println("*** WebSocket opened from sessionId "+ session.getId());// sysLogger.info("*** WebSocket opened from sessionId " +// session.getId());}@OnMessagepublic void inMessage(Session session, String message) {// sysLogger.info("*** WebSocket Received from sessionId " +// this.session.getId() + ": " + message);System.out.println("WebSocket Received from sessionId:"+ session.getId() + "-->" + message);try {session.getBasicRemote().sendText("Server收到消息:" + message);} catch (IOException e) {e.printStackTrace();}}@OnClosepublic void end(Session session) {// sysLogger.info("*** WebSocket closed from sessionId " +// this.session.getId());System.out.println("*** WebSocket closed from sessionId "+ this.session.getId());}
}
测试Tomcat7
栗子3
前端如下
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script language="JavaScript">var wsuri = "ws://localhost:8080/Websocket/Websocket2";var ws = null;function connectEndpoint() {ws = new WebSocket(wsuri);ws.onmessage = function(evt) {//alert(evt.data);document.getElementById("echo").value = evt.data;};ws.onclose = function(evt) {//alert("close");document.getElementById("echo").value = "end";};ws.onopen = function(evt) {//alert("open");document.getElementById("echo").value = "open";};}function sendmsg() {ws.send(document.getElementById("send").value);}
</script>
</head>
<body οnlοad="connectEndpoint()"><input type="text" size="20" value="5" id="send"><input type="button" value="send" οnclick="sendmsg()"><br><input type="text" id="echo">
</body>
</html>
后端如下
package com.websocket;import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;@ServerEndpoint(value="/Websocket2")
public class Websocket2 {@OnOpen public void start(Session session){ System.out.println("session "+session.getId()+" open."); } @OnMessage public void process(Session session, String message){ System.out.println("rece:" + message); RemoteEndpoint.Basic remote = session.getBasicRemote(); int c = Integer.valueOf(message); for (int i=1; i<=c; i++){ try { remote.sendText("response "+i); Thread.sleep(50); } catch (Exception e) { e.printStackTrace(); } } } @OnClose public void end(Session session){ System.out.println("session "+session.getId()+" close."); } @OnError public void error(Session session, java.lang.Throwable throwable){ System.err.println("session "+session.getId()+" error:"+throwable); }
}
Layer有一款颜值很高的web聊天界面http://sentsin.com/layui/layim/
如果要实现网页在线聊天可以考虑结合layer的前端和websocket来实现...
2015年6月30日22:15:36 By:umgsai 湖北宜昌
转载于:https://blog.51cto.com/shamrock/1669554
Java实现websocket相关推荐
- Java后端WebSocket的Tomcat实现
转自: http://blog.chenzuhuang.com/archive/28.html http://www.cnblogs.com/xdp-gacl/p/5193279.html 一.Web ...
- 基于Tomcat7、Java、WebSocket的服务器推送聊天室
2019独角兽企业重金招聘Python工程师标准>>> 基于Tomcat7.Java.WebSocket的服务器推送聊天室 转载于:https://my.oschina.net/u/ ...
- java getbasicremote_Vue+Java 通过websocket实现服务器与客户端双向通信操作
1. vue代码 methods: { //在方法里调用 this.websocketsend()发送数据给服务器 onConfirm () { //需要传输的数据 let data = { code ...
- Java后端WebSocket的Tomcat实现(转载)
一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通 ...
- java开发websocket聊天室_java实现基于websocket的聊天室
[实例简介] java实现基于websocket的聊天室 [实例截图] [核心代码] chatMavenWebapp └── chat Maven Webapp ├── pom.xml ├── src ...
- java 网页通讯_Vue+Java 通过websocket实现服务器与客户端双向通信操作
1. vue代码 methods: { //在方法里调用 this.websocketsend()发送数据给服务器 onConfirm () { //需要传输的数据 let data = { code ...
- 手把手教你用JAVA调用Websocket实现“声音转换”功能(变声)标贝科技
手把手教你用JAVA调用Websocket实现"声音转换"功能(变声)标贝科技 前言 什么是声音转换? 基于深度学习和迁移学习技术,精准将原说话人的声音转换为目标说话人,同时保留原 ...
- 视频教程-基于Java的WebSocket的聊天室-Java
基于Java的WebSocket的聊天室 多年 Java 企业级应用开发工作经验,曾参与中国人寿.华夏人寿.泰康人寿.信达财险等保险行业内部业务管理系统以及线上在线产品的开发:参与中国人民银行.清华大 ...
- Java版WebSocket消息推送系统搭建
Java版WebSocket消息推送系统搭建 最近在做消息推送,网上查了一些资料,开始想的是用MQ来做,后面发现用WebSocket来做的话感觉应该要简单点,话不多说,准备撸代码. 后端核心代码 /* ...
- java ws协议_基于java实现websocket协议过程详解
最近了解了下websocket和socket这个东西,说不得不来说下为何要使用 WebSocket ,和为何不用http. 为何需要WebSocket ? HTTP 协议是一种无状态的.无连接的.单向 ...
最新文章
- JavaScript的语言标准
- BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
- PMCAFF | 刷微信朋友圈行为分析:刷朋友圈是一种感觉?有一种批皇帝批奏章的感觉...
- 最舒适的路线 第六届
- CodeForce 463C Gargari and Bishops(贪心+暴力)
- pyspark union代码示例
- LeetCode 4 寻找两个正序数组的中位数
- 每日一题:leetcode959.由斜杠划分区域
- cdh官方文档看后小结(含优化项)001
- 拓端tecdat|R语言如何找到患者数据中具有差异的指标?(PLS—DA分析)
- Java游戏项目之推箱子
- 网络抖动多少ms算正常_网络延迟多少ms算正常 - 卡饭网
- 英文垃圾邮件分类机器学习篇——带你一次看个爽
- latex加下划线_给latex文字加下划线和高亮显示
- 什么是台式机主板的“双通道”认知误区?
- 【代码审计-JAVA】javaweb代码审计思路
- 方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
- JQuery实现音乐导航栏的简单实现
- Soul API 网关源码学习《二》
- 谷歌地图营销.Google竞价排名
热门文章
- mysql utf8mb4 php_MySQL设置utf8mb4编码_MySQL
- 计算机无法启动显示空格闪烁,我的电脑打不开怎么把硬盘格式化
- mysql 命令行如何输入参数_MySQL命令行参数完整版
- python随机图片api_抓取随机图片
- SpringBoot 工程目录 整合mybatis-mysql(xml类型)
- Node.js webpack babel
- Web_audio_spatialization_basics
- opencv-api getStructuringElement
- Linux静态库与动态库
- 用python海龟制图画花瓣_Python竟能画这么漂亮的花,帅呆了(代码分享)