最近一直在思考一个问题:服务器如何主动发消息给浏览器?传统的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相关推荐

  1. Java后端WebSocket的Tomcat实现

    转自: http://blog.chenzuhuang.com/archive/28.html http://www.cnblogs.com/xdp-gacl/p/5193279.html 一.Web ...

  2. 基于Tomcat7、Java、WebSocket的服务器推送聊天室

    2019独角兽企业重金招聘Python工程师标准>>> 基于Tomcat7.Java.WebSocket的服务器推送聊天室 转载于:https://my.oschina.net/u/ ...

  3. java getbasicremote_Vue+Java 通过websocket实现服务器与客户端双向通信操作

    1. vue代码 methods: { //在方法里调用 this.websocketsend()发送数据给服务器 onConfirm () { //需要传输的数据 let data = { code ...

  4. Java后端WebSocket的Tomcat实现(转载)

    一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通 ...

  5. java开发websocket聊天室_java实现基于websocket的聊天室

    [实例简介] java实现基于websocket的聊天室 [实例截图] [核心代码] chatMavenWebapp └── chat Maven Webapp ├── pom.xml ├── src ...

  6. java 网页通讯_Vue+Java 通过websocket实现服务器与客户端双向通信操作

    1. vue代码 methods: { //在方法里调用 this.websocketsend()发送数据给服务器 onConfirm () { //需要传输的数据 let data = { code ...

  7. 手把手教你用JAVA调用Websocket实现“声音转换”功能(变声)标贝科技

    手把手教你用JAVA调用Websocket实现"声音转换"功能(变声)标贝科技 前言 什么是声音转换? 基于深度学习和迁移学习技术,精准将原说话人的声音转换为目标说话人,同时保留原 ...

  8. 视频教程-基于Java的WebSocket的聊天室-Java

    基于Java的WebSocket的聊天室 多年 Java 企业级应用开发工作经验,曾参与中国人寿.华夏人寿.泰康人寿.信达财险等保险行业内部业务管理系统以及线上在线产品的开发:参与中国人民银行.清华大 ...

  9. Java版WebSocket消息推送系统搭建

    Java版WebSocket消息推送系统搭建 最近在做消息推送,网上查了一些资料,开始想的是用MQ来做,后面发现用WebSocket来做的话感觉应该要简单点,话不多说,准备撸代码. 后端核心代码 /* ...

  10. java ws协议_基于java实现websocket协议过程详解

    最近了解了下websocket和socket这个东西,说不得不来说下为何要使用 WebSocket ,和为何不用http. 为何需要WebSocket ? HTTP 协议是一种无状态的.无连接的.单向 ...

最新文章

  1. JavaScript的语言标准
  2. BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
  3. PMCAFF | 刷微信朋友圈行为分析:刷朋友圈是一种感觉?有一种批皇帝批奏章的感觉...
  4. 最舒适的路线 第六届
  5. CodeForce 463C Gargari and Bishops(贪心+暴力)
  6. pyspark union代码示例
  7. LeetCode 4 寻找两个正序数组的中位数
  8. 每日一题:leetcode959.由斜杠划分区域
  9. cdh官方文档看后小结(含优化项)001
  10. 拓端tecdat|R语言如何找到患者数据中具有差异的指标?(PLS—DA分析)
  11. Java游戏项目之推箱子
  12. 网络抖动多少ms算正常_网络延迟多少ms算正常 - 卡饭网
  13. 英文垃圾邮件分类机器学习篇——带你一次看个爽
  14. latex加下划线_给latex文字加下划线和高亮显示
  15. 什么是台式机主板的“双通道”认知误区?
  16. 【代码审计-JAVA】javaweb代码审计思路
  17. 方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
  18. JQuery实现音乐导航栏的简单实现
  19. Soul API 网关源码学习《二》
  20. 谷歌地图营销.Google竞价排名

热门文章

  1. mysql utf8mb4 php_MySQL设置utf8mb4编码_MySQL
  2. 计算机无法启动显示空格闪烁,我的电脑打不开怎么把硬盘格式化
  3. mysql 命令行如何输入参数_MySQL命令行参数完整版
  4. python随机图片api_抓取随机图片
  5. SpringBoot 工程目录 整合mybatis-mysql(xml类型)
  6. Node.js webpack babel
  7. Web_audio_spatialization_basics
  8. opencv-api getStructuringElement
  9. Linux静态库与动态库
  10. 用python海龟制图画花瓣_Python竟能画这么漂亮的花,帅呆了(代码分享)