socket.io.js 教程发送多次怎么办

用java开发的socket.io,用户node.js作为服务器端,作用就是同步同步,比如开发网站的时候,当用户登录之后,可以实现当前浏览器多个窗口的页面都是登录后的效果。
首先需要安装socket.io,以及所需要的模块, 在项目里引用socket.io的js包, java代码构建socket.io的类,这个类主要参考/Gottox/socket.io-java-client。
还需要安装node.js, 在项目文件的位置新建socketserver.js 用node.js运行 &具体怎么实现 &需要去学习怎么安装以及运行node.js。
socketserver.js里的内容根据自己的业务需要而定,但需要指出的是每个页面的请求都是唯一的,即使是同一个key去记录socket,那么也需要一个数组去记录,否则只能处理一个页面的请求,
比如var users = {};//存放用户数组 登录之后的函数
socket.on('initUser', function(key){ var sockets = users[key]; if (sockets){ sockets.push(socket); }else{ sockets = [socket]; } users[key] =//多个页面记录同意用户的不同页面的client });
然后登录成功之后通知页面已经登录了
//当用户登录成功之后 推送给客户端提示登录成功 socket.on('do_login', function (jsonData) {//捕获客户端发送名为'do_login'的数据 如果业务需要 可以扩展一个callback的参数 var jsSockets = users[jsonData.userKey]; if (jsSockets){ console.log('jsSockets的个数:' + jsSockets.length); for(var i =0; i&jsSockets. i++){ jsSockets[i].emit('login_success', jsonData.loginResult);//告诉客户端连接本次请求登录信息成功 broadcast属性面向多个connection都可以的 } } });
ok,这样就实现了socket.io与node.js一起同步通知的功能
...) 评论(
尚缘 SWOOP 好文章,永远不应该消失
©2014node.js+socket.io出现重复执行方法 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
服务端代码
var fs=require(‘fs’);
var vm = require(‘vm’);
var journey = require(‘journey/journey’);
var http=require(‘http’);
var url = require(“url”);
var querystring = require(“querystring”);
var connect=require(“connect”);
var router = new(journey.Router);
router.map(function() {
this.post(/^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?/).bind(function(req, res, data) {
typeMethod(jsonData);
res.sendBody(&bbb&);
res.send(200);
= require(‘’);
express = require(‘express’);
module.export = express.createServer();
var app=module.export=http.createServer(function(request, response) {
var body = &&;
request.on('data', function(chunk) {
jsonData = querystring.parse(body);
request.on('end', function() {
router.handle(request, body, function(result) {
response.writeHead(result.status, result.headers);
response.end(result.body);
}).listen(6380);
\n```
var socketUser = {};
var queueUser={};
= sio.listen(app);
io.sockets.on('connection', function (socket){
//响应连接
io.sockets.emit('conn', { text: 'socketId:'+socket.id});
//公共称登陆方法
socket.on('queueLogin', function (data) {
console.log(&loginllllllll&);
if(!queueUser.hasOwnProperty(socket.id)) {
queueUser[socket.id] = {'c_id':data.c_id,'socket':socket};
//在线人数+1
//onlineCount++;
//监听断线
socket.on('disconnect', function(){
console.log('-链接断开['+socket.id+']-');
delete queueUser[socket.id];
//推送给一个在线的人
var pushOne = function(data){
console.log('-推送数据['+data+']-');
var ioData=
for(var values in queueUser){
if(queueUser[values].c_id==ioData.openId){
console.log('匹配人员'+ioData.openId);
queueUser[values].socket.emit('receiveWeight',{'data': ioData});
var typeMethod=function(data,req,res){
var param=eval(&(&+data.data+&)&);
var type=eval(&(&+data.type+&)&);
switch(type){
pushOne(param);
客户端代码
var socket=‘';
function connSocketIO(openId){
socket = io.connect(ip+&:6380&,
&reconnect&:false,
//&reconnect&:false,
&auto connect&:false,
//&reconnectionDelay&:100,
&connect timeout&:100
socket.on('conn', function (data) {
var postdata = {
'c_id'
//用户id
socket.emit('queueLogin', postdata);
//接收体重数据
socket.on('receiveWeight', function (data,fn) {
console.log(&1&);
socket.connect();
现在是遇到,我发一个post请求访问node.js,调用一次相应的方法,然后出现接收到多次消息的问题,例如:理想是页面接收一次’你好‘的消息,实际接收到多次’你好‘
现在是运用在手机web上的,然后是有一定几率会出现,重复执行多次也没有规律,多的有6-7次,所以重现起来都很难
代码都用md语法处理一下比较好,阅读起来比较难,现在
社区的编辑器是支持MD的,尽量还是不要用图片来显示代码,应为不同屏幕效果可能不一样,不少用户是用手机客户端,阅读难。
你没有提供你的控制台信息
你的问题应该通过添加一些console.log()追踪一下就可以解决
我是新手发帖,谢谢提醒,控制台追踪的时候只出现过,
var app=module.export=http.createServer(function(request, response) {
var body = “”;
request.on(‘data’, function(chunk) {
jsonData = querystring.parse(body);
request.on(‘end’, function() {
router.handle(request, body, function(result) {
response.writeHead(result.status, result.headers);
response.end(result.body);
}).listen(6380);
这里面的请求有过重复执行,不过还是没找到原因,问题还不知道怎么重现,不是每次都会出现的。控制台信息随后跟上。
你这样就已经缩小问题范围了,你的意思是http的request事件出发多次
事实上用浏览器访问http服务器是会有两次request的,有一次是请求favicon
var http = require('http');
var server = http.Server(function(req, res) {
console.log('request');
res.end('hello world');
server.listen(8080);
你用浏览器访问localhost:8080就能打印两次request
这个我排除了,我用在手机web上的,然后是有一定几率会出现,重复执行多次也没有规律,多的有6-7次,所以重现起来都很难
请问这个问题最终怎么解决,我也遇到这个问题,很是纠结,请各位大神指点指点。。谢谢
请问这个问题最终怎么解决,我也遇到这个问题,很是纠结,请各位大神指点指点。。谢谢
先保证进程只有一个,如果还会发生就不懂了,我这边也没有解决,不是每次都会出现,偶尔
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的node.js+socket.io私人聊天 - Javascript教程_JS教程_技术文章 - 红黑联盟
node.js+socket.io私人聊天
项目需要,所以学习使用node.js +socket.io实现私人聊天功能,忙活了大半天终于搞明白了,基本原理就是当server端接收到
socket连接请求的时候,就会每一个建立一个socket,而连接的socket由于没有表示,所以每一个socket只可以发送给自己信息,如果要
发送给其他的socket连接信息需要标识其他的socket连接。
废话不多说了,上代码。。
var io = require('socket.io').listen(8080);
io.set('log level', 1);
var users = {};
io.sockets.on('connection', function (socket) {
io.sockets.emit('connect',{hell:'boy'});
socket.on('private message', function (from,to,msg) {
console.log('I received a private message by ', from, ' say to ',to, msg);
if(to in users){
users[to].emit('to'+to,{mess:msg});
socket.on('new user',function(data){
if(data in users){
var nickname =
users[nickname]=
socket.on('disconnect', function () {
io.sockets.emit('user disconnected');
});测试页面index.
&script src="/ajax/libs/jquery/1.11.0/jquery.min.js"&&/script&
&script src="http://localhost:8080/socket.io/socket.io.js"&&/script&
$(function(){
var socket = io.connect('http://localhost:8080');
socket.on('connect', function (data) {
console.log(data);
$("#send").click(function(e){
var from = $('#user_name').val(),
= $('#message').val(),
= $('#to').val(),
$message_list = $('#message_list');
socket.emit('new user',from);
socket.emit('private message',from,to,msg);
socket.on('to'+from, function (data) {
$message_list.append(''+data.from+'说'+data.message+'');
消息内容:发送
项目运行效果:
OK,终于可以私聊了。。。& Socket.io在线聊天室
Socket.io在线聊天室
,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
转载请注明出处:
网络聊天室在web1.0的时代就出现了,但当时技术支持比较有限,大都是通过浏览器插件BHO,JavaApplet,Flash实现的。如今HTML5技术风起云涌,通过websocket实现的网络聊天室,被定义为websocket的第一个实验,就像Hello World一样的简单。
今天我也动手完成了这个实验,感觉真的很爽!
socket.io介绍
服务器端和客户端通信设计
服务器端实现
客户端实现
完整案例代码
1. socket.io介绍
socket.io一个是基于Nodejs架构体系的,支持websocket的协议用于时时通信的一个软件包。socket.io 给跨浏览器构建实时应用提供了完整的封装,socket.io完全由javascript实现。
基于Nodejs实现webscoket其他的框架,请参考文章:
2. 服务器端和客户端通信设计
上图中client1 和 server 描述通信过程,client2描述对其他的客户端,通过广播进行消息通信。
client1向server发起连接请求
server接受client的连接
client1输入登陆用户名
server返回欢迎语
server通过广播告诉其他在线的用户,client1已登陆
client1发送聊天信息
server返回聊天信息(可省略)
server通过广播告诉其他在线的用户,client1的聊天消息
client1关闭连接,退出登陆
server通过广播告诉其他在线的用户,client1已退出
我们看一下测试截图:
左边: aaa 登陆
右边: bbb 登陆
左边: aaa 收到 bbb登陆欢迎消息
aaa 和 bbb 实现对话
右边: bbb 刷新浏览自动退出
左边: aaa 收到 bbb的退出消息
右边: CCC 登陆
左边: aaa 收到 CCC 登陆欢迎消息
aaa 和 CCC 实现对话
3. 服务器端实现
我们这里使用socket.io和express3的混合模式,让HTTP请求和WebSocket请求都使用3000端口。
服务器端实现,只有一个核心文件app.js。
//引入程序包
var express = require('express')
, path = require('path')
, app = express()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server);
//设置日志级别
io.set('log level', 1);
//WebSocket连接监听
io.on('connection', function (socket) {
socket.emit('open');//通知客户端已连接
// 打印握手信息
// console.log(socket.handshake);
// 构造客户端对象
var client = {
socket:socket,
name:false,
color:getColor()
// 对message事件的监听
socket.on('message', function(msg){
var obj = {time:getTime(),color:client.color};
// 判断是不是第一次连接,以第一条消息作为用户名
if(!client.name){
client.name =
obj['text']=client.
obj['author']='System';
obj['type']='welcome';
console.log(client.name + ' login');
//返回欢迎语
socket.emit('system',obj);
//广播新用户已登陆
socket.broadcast.emit('system',obj);
//如果不是第一次的连接,正常的聊天消息
obj['text']=
obj['author']=client.
obj['type']='message';
console.log(client.name + ' say: ' + msg);
// 返回消息(可以省略)
socket.emit('message',obj);
// 广播向其他用户发消息
socket.broadcast.emit('message',obj);
//监听出退事件
socket.on('disconnect', function () {
var obj = {
time:getTime(),
color:client.color,
author:'System',
text:client.name,
type:'disconnect'
// 广播用户已退出
socket.broadcast.emit('system',obj);
console.log(client.name + 'Disconnect');
//express基本配置
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.configure('development', function(){
app.use(express.errorHandler());
// 指定webscoket的客户端的html文件
app.get('/', function(req, res){
res.sendfile('views/chat.html');
server.listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
var getTime=function(){
var date = new Date();
return date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
var getColor=function(){
var colors = ['aliceblue','antiquewhite','aqua','aquamarine','pink','red','green',
'orange','blue','blueviolet','brown','burlywood','cadetblue'];
return colors[Math.round(Math.random() * 10000 % colors.length)];
4. 客户端实现
这里我们需要定义几个文件:chat.html, chat.js, jquery.min.js, main.css
1). views/chat.html
&!DOCTYPE html&
&meta charset="utf-8"&
&title&Socket.io - Simple chat&/title&
&link rel="stylesheet" type="text/css" href="css/main.css"&
&script src="javascripts/jquery.min.js"&&/script&
&script src="/socket.io/socket.io.js"&&/script&
&script src="javascripts/chat.js"&&/script&
&h1&Socket.io - Simple chat room&/h1&
&span id="status"&Connecting...&/span&
&input type="text" id="input"/&
&div id="content"&&/div&
2). public/javascript/chat.js
$(function () {
var content = $('#content');
var status = $('#status');
var input = $('#input');
var myName =
//建立websocket连接
socket = io.connect('http://localhost:3000');
//收到server的连接确认
socket.on('open',function(){
status.text('Choose a name:');
//监听system事件,判断welcome或者disconnect,打印系统消息信息
socket.on('system',function(json){
var p = '';
if (json.type === 'welcome'){
if(myName==json.text) status.text(myName + ': ').css('color', json.color);
p = '&p style="background:'+json.color+'"&system @ '+ json.time+ ' : Welcome ' + json.text +'&/p&';
}else if(json.type == 'disconnect'){
p = '&p style="background:'+json.color+'"&system @ '+ json.time+ ' : Bye ' + json.text +'&/p&';
content.prepend(p);
//监听message事件,打印消息信息
socket.on('message',function(json){
var p = '&p&&span style="color:'+json.color+';"&' + json.author+'&/span& @ '+ json.time+ ' : '+json.text+'&/p&';
content.prepend(p);
//通过“回车”提交聊天信息
input.keydown(function(e) {
if (e.keyCode === 13) {
var msg = $(this).val();
socket.send(msg);
$(this).val('');
if (myName === false) {
3). public/javascript/jquery.min.js
从jquery官方下载: /
4). public/css/main.css
* {padding:0 margin:0}
body{font-family: font-size:12margin:10}
p {line-height:18padding:2}
div {width:500}
#content {
background:#
border-radius:5
border:1px solid #CCC;
margin-top:10
border-radius:2
border:1px solid #
margin-top:10
margin-top:15
5. 完整案例代码
项目已经上传到github: /bsspirit/chat-websocket
下载,安装,启动服务器
git clone /bsspirit/chat-websocket.git
npm install
node app.js
打开浏览器
可以多打开几个窗口,模拟不同用户有的对话。
http://localhost:3000
做完实验,感觉棒极了。技术创新的革命!!
转载请注明出处:
This entry was posted in
Pingback: ()
Pingback: ()
Designed by

我要回帖

更多关于 socket.io.js 教程 的文章

 

随机推荐