基于:css
这几天在学习socket.io,因此就写一点本身的心得,分享一下。html
Q:socket.io能干什么?
A:socket.io能够保证客户端和服务器端间的实时通信。node
经过几个简单的步骤就能够建立简易的聊天室jquery
1.首先咱们要引入express,借用express来规划路由git
var express = require('express'); var app = express();
也能够简写:github
var app = require('express')();
而后配置路由express
app.get('/',function(req,res){ //code... res.send('welcome to chatroom'); });
2.引入http“骨架”,载入express实例浏览器
var server = require('http').createServer(app);
顺手把监听的端口给配了~服务器
server.listen(3000)
一般简单能够如上这么写,可是不是很好看,因此咱们还能够作一些配置:app
var port = process.env.PORT || 3000; server.listen(port,function(){ console.log('server port on %d',port); });
整理下:
var express = require('express'); var app = express(); var server = require('http').createServer(app); var port = process.env.PORT || 3000; app.get('/',function(req,res){ //code... res.send('welcome to chatroom'); }); server.listen(port,function(){ console.log('server port on %d',port); });
如今启动server
node index.js
打开你最爱的浏览器,输入
http://localhost:3000
一切顺利的话,能够看见
咱们继续如今,咱们引入socket.io,并传入http对象
var io = require('socket.io')(server);
(这里个人理解是socket.io依赖于http,因此须要将http传入socket.io)
如今咱们注册一个链接
io.on('connection',function(socket){ console.log('a user connected'); });
新建一个目录public
public里新建index.html,main.js,style.css文件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> </body> </html>
在</body>前,引入script
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> <script src="/socket.io/socket.io.js"></script>
如今咱们还须要引入main.js和style.css,这里有个小细节,咱们回到以前的index.js文件中,配置一个路径
app.use(express.static(__dirname + '/public'));
而且修改路由内容
app.get('/', function (req, res) { res.sendFile('index.html'); });
(因为咱们在express中配置了public目录的路径,因此在public中的文件,咱们能够直接用)
回到index.html中,继续~
如今咱们就能够愉快的引入style.css和main.js文件了
<link rel="stylesheet" href="style.css" type="text/css">
在此后引入
<script src="/socket.io/socket.io.js"></script> <script src="main.js"></script>
引入完毕,添加html中的基本dom元素
<ul id="message"></ul> <form action=""> <input type="text" id="input"><button type="submit">Send</button> </form>
* { margin: 0; padding: 0; box-sizing: border-box; } #message { padding: 20px; font: 20px Arial, Helvetica; width: 95%; list-style-type: none; margin: 10px auto; /*box-shadow: -3px 3px 5px #888;*/ box-shadow: 2px 0 3px #888, 0 2px 3px #888, 0 2px 3px #888, 2px 0 3px #888; min-height: 300px; border-radius: 5px; } #messages li { padding: 10px 10px; } #messages li:nth-child(odd) { background: #eee; } form { background: #000000; padding: 5px; position: fixed; bottom: 0; width: 100%; } #input { border: 0; padding: 5px 7px; width: 90%; } form button { width: 10%; background: rgb(130, 224, 255); border: none; padding: 5px; }
如今我们的chatroom应该是酱紫的
如今试着多开几个浏览器窗口,我们会发现控制台会打印多个
“a user connected”的字样
var socket = io(); $('button[type=submit]').click(function(){ socket.emit('chat message', $('#input').val()); $('#input').val(''); return false; }); socket.on('chat message', function (data) { $('#message').append($('<li>').text(data)); });
这个socket能够理解为客户端的通讯接口
var socket = io();
并对button添加了一个点击事件,点击后发射事件“chat message”,数据为input里的value,最后清空input。
$('button[type=submit]').click(function(){ socket.emit('chat message', $('#input').val()); $('#input').val(''); return false; });
这里(客户端)注册了“chat message”的事件,来将data显示在ul列表里。
socket.on('chat message', function (data) { $('#message').append($('<li>').text(data)); });
如今咱们再回到index.js中:
修改以下:
io.on('connection', function (socket) { console.log('a user connected'); socket.on('chat message', function (data) { io.emit('chat message',data); }); socket.on('disconnect', function () { console.log('a user left'); }); });
注意,咱们先注册了一个服务器端的chat message事件(为了接受客户端的data),而后发射了一个客户端的chat message事件(为了传值给客户端),这两个事件虽然名字相同,可是彻底是两回事!
socket.on('chat message', function (data) { io.emit('chat message',data); });
socket.io说白了就是在客户端与服务器端间来回通讯,整明白谁是谁就好理解了。
var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); var port = process.env.PORT || 3000; app.use(express.static(__dirname + '/public')); app.get('/', function (req, res) { res.sendFile('index.html'); }); io.on('connection', function (socket) { console.log('a user connected'); socket.on('chat message', function (data) { io.emit('chat message',data); }); socket.on('disconnect', function () { console.log('a user left'); }) }); server.listen(port, function () { console.log('server start on port : %d',port); });
var socket = io(); $('button[type=submit]').click(function(){ socket.emit('chat message', $('#input').val()); $('#input').val(''); return false; }); socket.on('chat message', function (data) { $('#message').append($('<li>').text(data)); });
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>socket.io chatroom</title> <link rel="stylesheet" href="style.css" type="text/css"> </head> <body> <ul id="message"></ul> <form action=""> <input type="text" id="input"><button type="submit">Send</button> </form> <script src="http://code.jquery.com/jquery-1.11.1.js"></script> <script src="/socket.io/socket.io.js"></script> <script src="main.js"></script> </body> </html>
* { margin: 0; padding: 0; box-sizing: border-box; } #message { padding: 20px; font: 20px Arial, Helvetica; width: 95%; list-style-type: none; margin: 10px auto; /*box-shadow: -3px 3px 5px #888;*/ box-shadow: 2px 0 3px #888, 0 2px 3px #888, 0 2px 3px #888, 2px 0 3px #888; min-height: 300px; border-radius: 5px; } #messages li { padding: 10px 10px; } #messages li:nth-child(odd) { background: #eee; } form { background: #000000; padding: 5px; position: fixed; bottom: 0; width: 100%; } #input { border: 0; padding: 5px 7px; width: 90%; } form button { width: 10%; background: rgb(130, 224, 255); border: none; padding: 5px; }
新人第一篇博客,若有不足多多包涵,理解有误之处望指正,谢谢。
github:qianjiahao
本文参考自socket.io