Socket IO 实现 聊天室
没想到,自己写过的第一个聊天室,居然是用nodejs实现的【因为简单的啊】,使用起来很简单,要剖析里面的原理才是最重要的
先看代码:
html代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Socket.io</title> <link rel="stylesheet" type="text/css" href="css/main.css"/> <script src="//libs.useso.com/js/jquery/1.10.0/jquery.js"></script> <script src="/socket.io/socket.io.js"></script> <script src="js/chat.js"></script> </head> <body> <h1>Socket.io - Simple char Room</h1> <div> <span id="status">Connecting...</span> <input type="text" id="input" /> </div> <div id="content"></div> </body> </html>
js代码
/** * Created by davidzhang on 14-10-22. */ $(function(){ var content = $('#content'); var status = $('#status'); var input = $('#input'); var myName = false; //建立socket链接 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(); if(!msg) return false; socket.send(msg); $(this).val('');if(myName==false){myName=msg}}})});
css代码
* {padding:0px; margin:0px;} body{font-family:tahoma; font-size:12px;margin:10px;} p {line-height:18px;padding:2px;} div {width:500px;} #content { padding:5px; background:#ddd; border-radius:5px; border:1px solid #CCC; margin-top:10px; } #input { border-radius:2px; border:1px solid #ccc; margin-top:10px; padding:5px; width:380px; } #status { width:100px; display:block; float:left; margin-top:15px; }
服务器端的代码
var express = require('express'); var path = require("path"); var app = express(); var server = require("http").createServer(app); var io = require("socket.io").listen(server); //设置日志级别 io.set("log level", 1); io.on('connection',function(socket){ socket.emit("open"); //构造客户端对象 var client = { socket:socket, name:false, color:getColor() } socket.on('message',function(msg){ var obj = {time:getTime(),color:client.color}; if(!client.name){ client.name = msg; obj['text'] = client.name; obj['author'] = 'System'; obj['type'] = 'welcome'; console.log(client.name + 'login'); //返回欢迎语 socket.emit('system',obj); //广播新用户已登录 socket.broadcast.emit('system',obj); }else{ obj['text'] = msg; obj['author'] = client.name; 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()); }); //指定websocket的客户端的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)]; }
这里的服务器是使用nodejs的express,当然里面使用的是nodejs的socket.io这个库,使用起来是很酷的,大家可以操作一下。
如果想需要真个代码的话,可以去这里
https://github.com/zhangda89/Socket-chat-Room
版权声明
由 durban创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/608
版权声明
由 durban创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 Gowhich博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/608