为什么服务端推送不如 websocket主动推送 出名

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
同一个用户A,分别在浏览器两个窗口分别打开,想B,C两个用户发送消息,现在B和C都能购接受消息,但是B向A发送消息A不能接受到,但是C向A发送消息就可以接受到!A有先后顺序,首先给B发送,然后在给C发送消息!
采用的技术是node.js + websocket
这是B和C发送消息代码:
sendMessage:function(){
if(this.socket.connected){
if($("#sendID").val()){
if(content != ''){
var obj = {
username:this.username,
userType:this.userType,
userID:$("#userID").val(),
sendID: $("#sendID").val(),
content: content
var sendMessage = this.
type: "GET",
async: false,
url: ipStr + '/saveMessage',
data: obj,
dataType: "jsonp",
jsonp: "callback",
success: function(data, stats){
sendMessage.emit('message', obj);
alert("请输入文本的聊天内容!");
alert("当前没有任何聊天对象!");
alert("您已经断开连接,请重新打开本窗口!");
有谁知道任何有关这个问题的思路或者想法可以讲一下么,谢谢了
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
A打开两个窗口,这时并没有建立连接A分别给B、C发送消息,这时建立连接,不知道你的服务端有没有考虑room的问题,应该是分配两个不同的房间这样,两个聊天互不影响,也不会断开
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
两个窗口相当于两个客户端
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App查看: 1507|回复: 5
如何实时监控服务器推送的数据?是使用websocket建立的长..
签到天数: 1 天连续签到: 1 天[LV.1]初来乍到主题帖子e币
websocket长连接已经建立了,也可以在onMessage方法中接收到服务器实时推送的String字符串,求问如何实时监控这个数据只要一传过来我就马上发送到前台去显示呢?感觉最近脑袋要爆炸~
该用户从未签到主题帖子e币
mConnection.connect(wsuri, new WebSocketHandler() {& && && && && && && & @Override& && && && && && && & public void onOpen() {& && && && && && && && & Log.i(TAG, &WebSocket open&);& && && && && && && && && && && && && && && &&&}& && && && && && && && & @Override& && && && && && && & public void onTextMessage(String text) {& && && && && && && && &&&Log.i(TAG, &onTextMessage&);& && && && && && && && &&&showNotification(text);& && && && && && && &&&}& && && && && && && && & @Override& && && && && && && & public void onClose(int code, String reason) {& && && && && && && && &&&Log.i(TAG, &Connection lost.&);/*alert(&Connection lost.&);*/& && && && && && && && && && && && && && && &&&}& && && && && && & });
该用户从未签到主题帖子e币
public void onTextMessage(String text) {}这个text不就是你想要的吗
签到天数: 99 天连续签到: 1 天[LV.6]常住居民II主题帖子e币
签到天数: 232 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
EventBus,otto,广播都可以解决你说的问题
签到天数: 14 天连续签到: 1 天[LV.3]偶尔看看II主题帖子e币
楼主是如何与服务器进行websocket链接的? 小白刚接触这个 求教
QQ已认证,此人靠谱
社区认证会员
社区认证会员
推荐阅读热门话题
61887420384328283281261252226218208204201192715
12&秒前2&分钟前半小时前昨天&23:52昨天&15:29昨天&15:17昨天&15:15昨天&14:11昨天&13:59昨天&13:53昨天&13:50昨天&13:45昨天&13:44昨天&11:09昨天&10:57昨天&10:52
Powered byWEB开发服务器推送技术-tomcat7之websocket - 猫头哥(朴海林)_QQ: - ITeye博客
博客分类:
从tomcat7.0.26之后开始支持websocket,建议大家使用tomcat7.0.30,期间版本的接口有一些改动。chrome默认支持websocket。其他浏览器可能由于安全原因,默认是关闭的。
package com.panguso.phl.
import java.io.IOE
import java.nio.ByteB
import java.nio.CharB
import java.util.logging.L
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpServletR
import org.apache.catalina.websocket.MessageI
import org.apache.catalina.websocket.StreamI
import org.apache.catalina.websocket.WebSocketS
import org.apache.catalina.websocket.WsO
* @author piaohailin
@WebServlet(urlPatterns = "/echo.ws")
// 处理WebSocket的Servlet需要继承自WebSocketServlet,这一点和7.0.27仍然一样
public class EchoServlet extends WebSocketServlet {
private Logger logger = Logger.getLogger(EchoServlet.class.getName());
// 与7.0.27不同的,Tomcat改变了createWebSocketInbound方法的定义,增加了一个HttpServletRequest参数
// 这样我们也可以从request参数中获取更多请求方的信息
protected StreamInbound createWebSocketInbound(String subProtocol,
HttpServletRequest request) {
logger.setLevel(java.util.logging.Level.ALL);
("request ws servlet");
// 方法仍然是返回一个StreamInbound实例,这里采用实现他的子类MessageInbound
// 只用实现下面四个事件处理函数(其实onClose和onOpen有缺省实现)
return new MessageInbound() {
// WebSocket关闭事件,参数status应该来自org.apache.catalina.websocket.Constants中定义的几个常量,可以参考文档或者核对一下Tomcat的源码
protected void onClose(int status) {
("Web Socket Closed: " + status);
// WebSocket握手完成,创建完毕,WsOutbound用于向客户端发送数据
protected void onOpen(WsOutbound outbound) {
("Web Socket Open!");
// 有二进制消息数据到达,暂时没研究出这个函数什么情况下触发,js的WebSocket按理说应该只能send文本信息才对
protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
("Binary Message Receive: " + buffer.remaining());
// Nothing
// 有文本消息数据到达
protected void onTextMessage(CharBuffer buffer) throws IOException {
("Text Message Receive: " + buffer.remaining());
// getWsOutbound可以返回当前的WsOutbound,通过他向客户端回传数据,这里采用的是nio的CharBuffer
getWsOutbound().writeTextMessage(buffer);
//模拟服务器通知浏览器,从浏览器就会看,每3秒收到1条服务器消息
for (int i = 0; i & 3; i++) {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
getWsOutbound().writeTextMessage(CharBuffer.wrap(String.valueOf(i).subSequence(0, 1)));
&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&Insert title here&/title&
&script type="text/javascript"&
function startServer() {
// 设定WebSocket,注意协议是ws,请求是指向对应的WebSocketServlet的
var url = "ws://127.0.0.1:8080/echo.ws";
// 创建WebSocket实例,下面那个MozWebSocket是Firefox的实现
if ('WebSocket' in window) {
ws = new WebSocket(url);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(url);
alert('Unsupported.');
// WebSocket握手完成,连接成功的回调
// 有个疑问,按理说new WebSocket的时候就会开始连接了,如果在设置onopen以前连接成功,是否还会触发这个回调
ws.onopen = function() {
alert('Opened!');
// 收到服务器发送的文本消息, event.data表示文本内容
ws.onmessage = function(event) {
alert('Receive message: ' + event.data);
// 关闭WebSocket的回调
ws.onclose = function() {
alert('Closed!');
function sendMyMessage() {
var textMessage = document.getElementById('textMessage').
if (ws != null && textMessage != '') {
// 通过WebSocket想向服务器发送一个文本信息
ws.send(textMessage);
&body onload="startServer()"&
&input type="text" id="textMessage" size="20" /&
&input type="button" onclick="sendMyMessage()" value="Send"&
浏览 10458
我在本机能够访问,但是从别的机器上访问总提示“closed",不知道是什么原因?有没有连到你的服务器
请问,这个技术在应用方面可以做哪些功能即时通信,聊天室,信息通知,等等例如:可以实现XAMPP做即时通信,直接操作POP,SMTP实现web收发邮件。无需服务端程序介入
请问,这个技术在应用方面可以做哪些功能WEB开发中,服务器端推送消息
浏览: 1106809 次
来自: 北京
你好,能说一下server.xml增加的配置是怎么影响性能的吗 ...
beyondfengyu 写道如果每个客户进程的时间不同步,时 ...
如果每个客户进程的时间不同步,时间超前的进程是不是更容易得到锁 ...
[i][b][flash=200,200][url][img] ...Posts - 41,
Articles - 0,
Comments - 5
心有明镜,能辨是非,纵有明末遗恨,也不过沧海一声笑。
16:21 by !锄作田, ... 阅读,
WebSocket的主动推送
关于消息推送,现在的解决方案如轮询、长连接或者短连接,当然还有其他的一些技术框架,有的是客户端直接去服务端拿数据。
其实推送推送主要讲的是一个推的概念,WebSocket是一种主动推送消息的技术。
基于Java的WebSocket
这里主要是结合网上的例子实现下。
简单的客户端JavaScript
&!DOCTYPE html&
&title&Testing websockets&/title&
&input type=&submit& value=&Start& onclick=&start()& /&
&div id=&messages&&&/div&
&script type=&text/javascript&&
var webSocket =
new WebSocket('ws://localhost:8080/wesocket/websocketTest');
webSocket.onerror = function(event) {
onError(event)
webSocket.onopen = function(event) {
onOpen(event)
webSocket.onmessage = function(event) {
onMessage(event)
function onMessage(event) {
document.getElementById('messages').innerHTML
+= '&br /&' + event.data;
function onOpen(event) {
document.getElementById('messages').innerHTML
= 'Connection established';
function onError(event) {
alert(event.data);
function start() {
webSocket.send('hello');
return false;
package com.tony.
import javax.websocket.OnC
import javax.websocket.OnM
import javax.websocket.OnO
import javax.websocket.S
import javax.websocket.server.ServerE
import java.io.IOE
@ServerEndpoint(&/websocketTest&)
public class WebSocketTest {
@OnMessage
public void onMessage(String message, Session session) throws IOException, InterruptedException {
// Print the client message for testing purposes
System.out.println(&Received: & + message);
// Send the first message to the client
session.getBasicRemote().sendText(&This is the first server message&);
// Send 3 messages to the client every 5 seconds
int sentMessages = 0;
while (sentMessages & 3) {
Thread.sleep(5000);
session.getBasicRemote().sendText(&This is an intermediate server message. Count: & + sentMessages);
sentMessages++;
// Send a final message to the client
session.getBasicRemote().sendText(&This is the last server message&);
public void onOpen() {
System.out.println(&Client connected&);
public void onClose() {
System.out.println(&Connection closed&);
pom.xml 文件
&project xmlns=&http://maven.apache.org/POM/4.0.0& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.tony&/groupId&
&artifactId&wesocket&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&dependencies&
&dependency&
&groupId&javax.websocket&/groupId&
&artifactId&javax.websocket-api&/artifactId&
&version&1.0-rc5&/version&
&scope&provided&/scope&
&/dependency&
&/dependencies&
&/project&
我这里用的是JDK是 jdk1.8.0_60 ,Tomcat用的是 apache-tomcat-7.0.64 。
1、建立连接
2、发送消息
3、服务端推送消息拓胜浸入式IT培训,让天下没有难学的课程!
您现在正在浏览:
& 服务端推送websocket和sse场景及应用的方法
发布时间:
14:27:58 & 作者:拓胜科技 & 来源:拓胜科技 & 浏览次数: 次 &
摘要:websocket开发首选netty,因为netty对协议的封装已经做到了完全的支持。通过 HttpServerCodec作为握手协议,WebSocketServerProtocolHandler作为协议处理,然后再加一个自己的handler……
  在目前最常见的系统中,所涉及的长连接进行通信的应用也越来越多,常规的http也不能满足于强大的场景应用,服务端推送websocket和sse场景及应用的方法,希望可以加深大家对于服务端方面的认识。
  经过几天简单地了解,就当前使用java进行后端推送类的服务进行了一些了解,就应用场景,开发方式以及一些特定的实现进行了简单的demo处理。
  板块一、应用场景
  1、都可以进行服务端推送,并且都是使用长连接来进行。但两者的实现又有一点不同,sse仍使用http协议,并且使用相同的链接发送正常的http协议报文。而websocket是使用http协议进行握手,然后再使用同一个链接进行websocket协议的通信。
  2、websocket可以进行双向的通信,即服务端可以往客户端发信息,客户端也可以向服务端发信息。而sse是单向的,只能由服务端往客户端发。
  3、websocket自带连接的保持,即通过ping/pong协议保证连接可以始终维持,sse没有这个保证,不过可以参考ping/pong协议,自己周期性地发送信息来同样地进行处理。比如,5秒往客户端发一个特别的信息(通过type/name进行区分)。其次,因为是基于浏览器的使用,sse有一个特性,就是浏览器发现一个连接断掉了,就会自动地进行重联,即重新发送请求。这样,服务端也不用担心连接被断开,不过需要处理新的请求必须和上一次请求的内容相连续,以及新的推送注册。
  4、因为都是使用http协议进行起始处理,因此在签权上都可以使用到http协议本身的一些东西,比如header/cookie签权。在相应的握手阶段,通过读取cookie(session)来保证相应的请求必须是经过授权的,也可以用于定位使用人。甚至可以通过这些信息保证单个用户只能有一个请求,避免重复请求
  5、由于都是基于浏览器使用,因此建议的数据传输都是文本型。虽然websocket支持二进制frame传输,不过一些都不建议使用sse只能传输文本。
  6、不管是websocket还是sse,在用于通信时,都建议只用于进行数据的推送,而不是进行完整的应用处理。这里可以理解为,常规的业务处理仍然交给后端的服务来处理。这样,即可以使用之前的业务开发的优势,又可以使用推送的优势。而不是走向另一个级端,即所有的信息都想通过推送来传递。
  板块二、开发方式
  1、websocket开发首选netty,因为netty对协议的封装已经做到了完全的支持。通过
HttpServerCodec作为握手协议,WebSocketServerProtocolHandler作为协议处理,然后再加一个自己的handler,就完成了相应的业务处理。同时在性能上,netty在一个ws的请求建立起来之后,会自动地去除httpServerCodec相关的handler,这样保证后续的处理都是按照ws的协议来进行。
  2、sse开发首选jersey,jersey-media-sse提供了相应的sse支持,并且通过与rest相集成,开发一个sse就跟普通的业务开发相同。
  3、ws和sse在文本支持上都只支持utf-8编码,因此在处理上需要注册编码方式。同时在使用sse时,如果后端第一次进行响应时,相应的编码不对。chrome会直接报错,包括utf8都会报错(这是之前后端开发的一个问题),可以修正或者增加相应的拦截器,保证后端content-type响应中的charset=UTF-8。
  4、ws和sse都可以通过nginx进行代理转发。ws的处理只需要设置http版本,以及重新转发前端的Upgrade和Connection头即可。而sse,也可以通过禁用buffer来处理。
  板块三、特定实现
  1、为保证在开发时推送类的和业务类的系统不会耦合在一起,或者同一个应用内有两种处理模式的功能存在。建议直接在系统层就开发2个不同的系统,一个专门用于推送,另一个用于相应的业务处理。然后业务处理后的数据,需要再交由推送处理,则可以在后端进行通过消息系统进行中转,如kafka(持久保证)或redis(内存订阅)等
  2、因为二者在ie上的支持都很有限,因此不建议在ie上进行尝试
  3、使用sse还是websocket,取决于是否需要前台交互,还取决于对后端的支持技术的了解程序。比如,了解jersey多一点,还是netty多一点。由于最近netty进行微服务化底层通信支持越来越流行,个人更倾向于使用websocket。但如果仅仅是一个简单的推送功能,又不希望修改代码,那也可以使用jersey(毕竟之前的系统就是在上面进行开发的)
  4、需要后端有的时候需要进行定向发送或者是群发,这种需求ws和sse的实现中都有相应的处理。如ChannelGroup和SseBroadcaster,这样在后端获取到一个消息,需要进行路由时就可以从这里面拿相应的channel信息。不过,前提是对各个channel上进行了特定的消息绑定,这样就好区分具体的路由信息。具体路由策略可以在建立时绑定session,后续通过session来路由。
  文章来源于网络,服务端推送websocket和sse场景及应用的方法就叙述到这里了,更多有关服务端方面的知识,请继续关注拓胜科技java技术培训,java培训方面的疑惑请咨询拓胜网络客服。
本文出自广州拓胜科技,转载请务必保留此出处,谢谢合作!
&拓胜愿景:自信成就好生活
&拓胜校训:勤奋、实践、自信、责任心
拓胜科技,是中国浸入式软件培训开山之祖,是中国"软件工厂"培训模式首创者。拓胜科技师资全部来自国际国内顶级软件设计专家,10年以上软件研发及管理经验。经过将近10年的发展,拓胜科技已经成为全国大学生高质素就业最可靠的导师和引路人。我们自2005年开始,为全国大学生提供最专业的java培训、android培训、ios培训、Uid培训、轻混合应用培训、软件测试培训及企业定制化培训。
下一篇:没有了
it培训专题
it培训课程
it培训师资
it培训开班
it培训课件
it培训技术
it培训就业

我要回帖

更多关于 web socket服务端推送 的文章

 

随机推荐