websocket中发送数据后台在JETTY中如何接收

苏珊大妈 发布于 2011/09/11 01:12
阅读 5K+
收藏 3

socket = new WebSocket("ws://127.0.0.1:8080/websocket");
socket.send("test");

此时应该在jetty服务器中如何来接收值"test"呢。请熟悉jetty服务器websocket的朋友指点,谢谢。同时也请有兴趣玩HTML5的朋友留下QQ吧,我加你们,一起学HTML5。

加载中
0
浪客Dandy
浪客Dandy

WebSocket是在一种双向的网络长连接,它肯定比以前客户端轮寻或者服务器端逆向推送,有更高的网络传输效率。而且他在客户端,也就是浏览器端肯定占用资源更少更有效率。但是对于服务器端来说未必有更高的效率。比如你WebSocket经过多次封装后,保有无数个Channel的实例,未必会比逆向定时发送要更节省资源。

对于纯HTML+JS来说,各种AJAX技术也好,WebSocket也好,都过度依赖于HTTP,因此并不非常适合作为即时通讯平台。从技术上看各种Applet才能弥补,但是事实上Java Applet已死,Flash效率更低,SliverLight还勉强。

因此假如你有这中需求,WebSocket也许仍然是你最佳的选择。取决于你用户群规模的大小,你通讯方式的设计和你服务器端的实现,就非常重要。比如Web QQ就是一个反例,本身客户端效率极低,由于通讯设计的缺陷, Web QQ只能实现原本一部分功能。而成功的例子比如像Jabber XMPP,它本身设计时就考虑到了网络协议间的转换,因此通过XMPP Client<->WebSocket === WebSocket<->XMPP Server这种binding的转换,实现就很容易,效率也高。

最终取决于你的需求。当初有很多AJAX的Chat Server,我相信很快这些软件都会支持WebSocket,到时候你其实可以捡现成的。或者直接上XMPP也不错。

0
浪客Dandy
浪客Dandy

你这个问题问的不清楚,你指的是HTML5里的WebSocket吧

我之前用JWebSocket实现过,看了眼Jetty的文档,貌似也不难

大致就是继承WebSocketServlet和WebSocket,然后在类似OnMessage的方法里来通信

我建议你仔细去看看官方的文档,有问题去官方Mail List里去问

PS: 优秀的程序员是不会用QQ的

0
浪客Dandy
浪客Dandy

官方的一个小例子

http://wiki.eclipse.org/Jetty_WTP_Plugin/Jetty_WTP_Websocket_Wizard

0
苏珊大妈
苏珊大妈

引用来自“浪客Dandy”的答案

你这个问题问的不清楚,你指的是HTML5里的WebSocket吧

我之前用JWebSocket实现过,看了眼Jetty的文档,貌似也不难

大致就是继承WebSocketServlet和WebSocket,然后在类似OnMessage的方法里来通信

我建议你仔细去看看官方的文档,有问题去官方Mail List里去问

PS: 优秀的程序员是不会用QQ的

我知道这些,可能我没有表达清楚,我是指用:
onMessage得到客户端提交上来的数据

@Override
public void onMessage(String data) {
    System.out.println(data);
}

 

这个方法中的conn.sendMessage可以向客户端发送数据,但如何把这些数据发送到另一个客户端中去呢?[指定的某个客户端就像做到QQ聊天那样]

@Override
public void onOpen(final Connection conn) {
	new Thread() {
	@Override
	public void run() {
		try {
			conn.sendMessage("开始...");
			int i = 0;
			while (true) {
			sleep(10);
			conn.sendMessage("Count:" + (i++));
			}
		} catch (final Exception e) {
			System.err.println(e.getMessage());
			}
		}
	}.start();
}

0
浪客Dandy
浪客Dandy

Hi WebSocket只允许客户端连接服务器端,不允许两个客户端直连

比如你想做成QQ聊天那样,你的聊天数据必须通过服务器中转。

在JWebSocket里,有所谓的Channel的概念,类似于JMS,所有订阅相同Channel的客户端,都会接收到来自Server端发往此Channel的信息,这个应该不属于WebSocket规范的一部分,我不确定Jetty的实现里有没有。

http://jwebsocket.org/?gclid=CPPvueqImasCFc0F4godbWIChg

0
UlricQin
UlricQin
我做过类似的东西,给你提供一个思路,首先客户端连到服务端的时候应该带一个标识(代表当前客户端的唯一ID)过去,然后jetty这边把所有连接上来的客户端存到一个容器里,用Map<String,WebSocket>即可,这样,服务端想给谁发消息,去容器中根据ID查找对应的WebSocket,然后调用WebSocket暴露的发送消息的接口即可
0
苏珊大妈
苏珊大妈

to 浪客Dandy 、flame :

同时也谢谢louja提供的指点。 

我想做的就是类似于QQ点对点及QQ群这样的一个实例,现在不明白的就是如何把A用户发给B用户的内容通过jetty转中转。

flame 提的这个思路我有想到过,但一直没编码来实现,总感觉这样是否很麻烦呢,难道在server端JETTY没有作包装吗?

同时浪客提供的那个官方不例子 在JETTY8上不能用了,API变了

0
浪客Dandy
浪客Dandy

Jetty本身就是偏基础的实现,所以当初我选择了JWebSocket。

加入你自己去实现客户端连接的辨识,无疑很复杂,而且这部分功能像前面说的 JWebSocket里已经有了。另外JWebSocket也可以跑在Web/Servlet服务器里。

本质来说,HTML5的WebSocket不适合做IM的实现,顶多做个站内聊天室,而且随着客户端连接的增多,服务器会负载过重。

0
苏珊大妈
苏珊大妈

引用来自“浪客Dandy”的答案

Jetty本身就是偏基础的实现,所以当初我选择了JWebSocket。

加入你自己去实现客户端连接的辨识,无疑很复杂,而且这部分功能像前面说的 JWebSocket里已经有了。另外JWebSocket也可以跑在Web/Servlet服务器里。

本质来说,HTML5的WebSocket不适合做IM的实现,顶多做个站内聊天室,而且随着客户端连接的增多,服务器会负载过重。

对你最后一段话比较感兴趣,我以前一直是用AJAX DWR这类来取数据的,现在产品中想把IM收发数据部份换成HTML5来做,正在考虑到WebSocket的数据传递高效才选择的,听你这么一种,我就有疑问了?如果WebSocket不是最好的方案哪什么才是?客户端连接数增多服务器会负载过重,但这总比AJAX DWR要好吧?

愿听浪客Dandy的进一步分析。。。

返回顶部
顶部