socket.io服务端是java_基于netty-socketio的web推送服务

本文介绍了在Web消息推送技术中,选择长轮询作为相对平衡的方案,并详细展示了如何基于Java的Netty-socketio库搭建一个聊天系统的推送服务,包括消息实体、事件监听和推送服务的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现。传统的web服务都是客户端发出请求,服务端给出响应。但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端。

有哪些可以实现web消息推送的技术:

不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比关系。间隔太短,连续不断的请求会冲垮服务器,间隔太长,务器上的新数据就需要越多的时间才能到达客户机。

优点:服务端逻辑简单;

缺点:其中大多数请求可能是无效请求,在大量用户轮询很频繁的情况下对服务器的压力很大;

应用:并发用户量少,而且要求消息的实时性不高,一般很少采用;

长轮询技术(long-polling):客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息或超时(设置)才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点:实时性高,无消息的情况下不会进行频繁的请求;

缺点:服务器维持着连接期间会消耗资源;

基于Iframe及htmlfile的流(streaming)方式:iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

优点:消息能够实时到达;

缺点:服务器维持着长连接期会消耗资源;

插件提供socket方式:比如利用Flash XMLSocket,Java Applet套接口,Activex包装的socket。

优点:原生socket的支持,和PC端和移动端的实现方式相似;

缺点:浏览器端需要装相应的插件;

WebSocket:是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。

优点:更好的节省服务器资源和带宽并达到实时通讯;

缺点:目前还未普及,浏览器支持不好;

综上,考虑到浏览器兼容性和性能问题,采用长轮询(long-polling)是一种比较好的方式。

netty-socketio是一个开源的Socket.io服务器端的一个java的实现, 它基于Netty框架。 项目地址为: https://github.com/mrniko/netty-socketio

以下是一个来自netty-socketio的推送示例,web聊天系统。

服务器端push server:

消息实体:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.nettysocketio.test;public classChatObject {privateString userName;privateString message;publicChatObject() {

}publicChatObject(String userName, String message) {super();this.userName =userName;this.message =message;

}publicString getUserName() {returnuserName;

}public voidsetUserName(String userName) {this.userName =userName;

}publicString getMessage() {returnmessage;

}public voidsetMessage(String message) {this.message =message;

}

}

View Code

监听事件:

packagecom.nettysocketio.test;importcom.corundumstudio.socketio.AckRequest;importcom.corundumstudio.socketio.SocketIOClient;importcom.corundumstudio.socketio.SocketIOServer;importcom.corundumstudio.socketio.listener.DataListener;public class CharteventListener implements DataListener{

SocketIOServer server;public voidsetServer(SocketIOServer server) {this.server =server;

}public voidonData(SocketIOClient client, ChatObject data,

AckRequest ackSender)throwsException {//chatevent为 事件的名称, data为发送的内容

this.server.getBroadcastOperations().sendEvent("chatevent", data);

}

}

推送服务:

packagecom.nettysocketio.test;importcom.corundumstudio.socketio.Configuration;importcom.corundumstudio.socketio.SocketIOServer;public classApp {public static void main(String[] args) throwsInterruptedException

{

Configuration config= newConfiguration();

config.setHostname("localhost");

config.setPort(9092);

SocketIOServer server= newSocketIOServer(config);

CharteventListener listner= newCharteventListener();

listner. setServer(server);//chatevent为事件名称

server.addEventListener("chatevent", ChatObject.class, listner);//启动服务

server.start();

Thread.sleep(Integer.MAX_VALUE) ;

server.stop();

}

}

浏览器端Client:

客户端聊天代码:

Socketio chat

}#console{height:400px;overflow:auto;

}.username-msg{color:orange;

}.connect-msg{color:green;

}.disconnect-msg{color:red;

}.send-msg{color:#888}

Netty-socketio chat demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值