web在线聊天室该怎么做呢?

2013-07-22 10:19:44 +08:00
 2656618087
本程序员想做个在线聊天室。能放在公网上的。现在不知道用什么实现方式。项目是javaee的 JSP项目。请有相关经验的前辈指点一二!
现在小程序员有看过DWR,servlet3.0配合前台ajax,发现都能实现,更倾向与servlet3.0的异步服务器推,但是看到有个网站用的这种方式实现,结果聊天室经常出问题。请前辈们帮忙分析分析,该用什么实现呢!最好是支持人数多、性能好的! 小弟先谢过了!
13078 次点击
所在节点    程序员
51 条回复
wudikua
2013-07-22 18:49:16 +08:00
redis pub/sub 都写好了现成的推送,自己写个长连接服务器,配合前端long polling接受数据,ajax get发送数据就行了。
fansgentle
2013-07-22 19:07:26 +08:00
@thursday +1 我的快要上线了,占位~~
wity_lv
2013-07-23 07:42:38 +08:00
@verfino
@hoorace
@paloalto
试试我这个:
https://github.com/lvjian700/node-pusher
基于socket.io,项目很简单,仅用来做数据推送:
web, java, ios 客户端都有。

Web端:
$(function() {
var url = 'http://localhost:3000/';
var room = '/column';

var pusher = new Pusher(url);

pusher.sub(room, function(data) {
console.log('subscribe /column room success.');
console.log(data);
});

pusher.on('news', function(data) {
console.log('receive data from xx room.');
console.log(data);
});

$('#btnSent').click(function() {
var text = $('#message').val();
pusher.pub(room, 'news', {sender: 'lvjian', msg: text});

$('#message').val('');
});
});

Java端:
public class Sample {

static String to = "/column";
static String event = "news";

public static void main(String[] args) throws MalformedURLException, JSONException {

Pusher pusher = new Pusher("http://127.0.0.1:3000/");

// This line is cached until the connection is establisched.
for(int i = 0; i < 10; i++) {
JSONObject json = new JSONObject();
json.put("msg", "haha");

pusher.pub(to, event, json.toString());

try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}

}

System.exit(0);
}

}

iOS(尚未整理,直接用的Socket.IO for Cocoas)
_socketIO = [[SocketIO alloc] initWithDelegate:self];
NSString *host = [RKObjectManager sharedManager].baseURL.host;
[_socketIO connectToHost:host onPort:3000];
[_socketIO sendEvent:@"sub" withData:@{@"topic" : @"/changji"}];
//...
- (void) socketIO:(SocketIO *)socket didReceiveEvent:(SocketIOPacket *)packet {
//这里接收事件
}



@nybux 求测试方案,我想对node-pusher服务做个性能测试。
nybux
2013-07-23 07:50:14 +08:00
我的测试程序是用nodejs写的,不过感觉性能不是很好

#!/usr/bin/node
var net = require('net');
var count = 0;
var maxUser = 5000;

function sendRequest(client, i) {
client.write('GET /poll?uid=-' + i.toString() + ' HTTP/1.1\r\nCookie: ASP.NET_SessionId=' + i.toString() + '\r\n\r\n')
}

function poll(uid) {
var client = new net.Socket();
client.connect(8080, '127.0.0.1', function() {
setTimeout(function(){
sendRequest(client, uid);
}, Math.random() * 3000);
});
client.on('data', function(data) {
count++;
msg = data.toString().split('\r\n\r\n')[1];
if (msg != "") {
//console.log('recv,' + uid + ':{' + msg + '}');
}
setTimeout(function(){
sendRequest(client, uid);
}, Math.random() * 3000);
});
client.on('close', function() {
console.log(uid.toString() + ':close!!!!');
client = new net.Socket();
poll(uid);
})
}

setInterval(function() {
console.log('msg count:' + count);
}, 5000);

for (i = 1000; i < 1000 + maxUser; ++i) {
poll(i)
}
2656618087
2013-07-23 08:44:09 +08:00
@fansgentle 你是怎么做的呢
andyhu
2013-07-23 09:14:14 +08:00
@hoorace 修改的都是哪里?建议创建个pull request贡献回去吧
fansgentle
2013-07-23 09:25:22 +08:00
@2656618087 NodeJS、Socket.io、ExpressJS、Bootstrap、NoSQL ...
yushuiyouyue
2013-07-24 10:07:33 +08:00
我做了一个是用java+redis来完成的。
redis里面来存放user和用户的消息。客户端使用ajax向服务器发送消息和获取消息
timepast
2013-07-24 10:51:56 +08:00
PushLets
rainchen
2013-07-24 17:12:46 +08:00
5分钟在线开发一个聊天室
https://www.firebase.com/tutorial/
wity_lv
2013-07-24 17:32:49 +08:00
@timepast pushlet 还是别推荐了, 上手难度不小。
2656618087
2013-07-25 16:17:01 +08:00
@yushuiyouyue 前台ajax到时好写 ,后台 不怎么会写,求点学习代码。可否发到2656618087@qq.com邮箱,十分感谢
2656618087
2013-07-25 16:17:30 +08:00
@rainchen 这是什么情况?
2656618087
2013-07-25 16:18:27 +08:00
@yushuiyouyue 给点代码!后台的,十分感谢 我后台也是java的
2656618087
2013-07-25 16:19:29 +08:00
@yushuiyouyue 给点代码!后台的,十分感谢 我后台也是java的。谢谢了!
az402
2013-07-25 16:21:41 +08:00
CometD
erylee
2013-07-25 19:18:58 +08:00
直接用哥的:

webim20.cn

前台代码:

github.com/webim
2656618087
2013-07-29 09:38:04 +08:00
这几天看了看,还是决定用servlet3.0的异步。计划是这样,每个人进入聊天室房间,调用一个servlet,都把这个异步对象AsyncContext存入一个map里,key为房间id,value为存放AsyncContext的list,发送消息调用messageServlet 将收到的消息存入一个list内,message model有房间ID用于区别该消息是那个房间那个人发的。后台再写个timer定时器,每1秒检查message list里是否有新消息,如果有就调用该房间的所有异步AsyncContext对象 散播消息。我理解这个就是一次轮询完成。客户端收到消息,然后再重复上面的过程建立一次新的轮询。不知道这样做的话可行吗?timer 一秒检查一次 会对服务器 有压力吗?求指导
@erylee @az402 @yushuiyouyue @rainchen @timepast @yushuiyouyue @nybux @wity_lv @paloalto @thursday @xdeng @lidashuang @lch21
thursday
2013-07-29 09:54:55 +08:00
socket.io 天生就好像是为了 聊天室而生。。 楼主 为何不试试看
davepkxxx
2013-07-29 10:10:03 +08:00
dwr是通 过长连接+定时断开重连 来实现的,如果你不想手动做这个事情,那么用dwr是最好的选择了,或者你也可以选择flash(不少移动浏览器不支持)、html5(ie6~8不支持)、awt(需要客户安装jar)来实现。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/76549

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX