[Node.js] Level 6. Socket.io
6.2 Setting Up socket.io Server-Side
So far we've created an Express server. Now we want to start building a real-time Q&A moderation service and we've decided to use socket.io.
Using the http module, create an new http server and pass the expressapp as the listener for that new server.
var express = require('express');
var app = express();
var server = require('http').createServer(app);
Using the socket.io module, listen for requests on the http server. Store the return object of this operation in a variable called io.
var io = require('socket.io')(server);
Use the object stored in io to listen for client 'connection' events. Remember, the callback function takes one argument, which is the client object that has connected.
When a new client connects, log a message using console.log().
io.on('connection', function(client){
console.log(client + "has connected.");
});
Finally, we want to tell our http server to listen to requests on port 8080.
server.listen(8080);
Code:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(client){
console.log(client + "has connected.");
});
server.listen(8080);
6.3 Client socket.io Setup
In our html file, load the socket.io.js script and connect to the socket.io server.
Load the socket.io.js script. The socket.io.js path you should use is'/socket.io/socket.io.js'. Express knows to serve the socket.io client js for this path.
Using the global io object that's now available for us, connect to the socket.io server at http://localhost:8080.
<script src="/socket.io/socket.io.js"></script> <script>
var server = io.connect('http://localhost:8080');
</script><script></script>
6.4 Listening For Questions
In our client below, listen for 'question' events from the server and call the insertQuestion function whenever the event fires.
First, listen for 'question' events from the server.
Now, have the event callback function call the insertQuestion function. TheinsertQuestion function is already created for you, and it's placed in its own file. It expects exactly one argument - the question.
server.on('question', function(data){
insertQuestion(data);
});
Code:
<script src="/socket.io/socket.io.js"></script>
<script src="/insertQuestion.js"></script> <script>
var server = io.connect('http://localhost:8080'); // Insert code here
server.on('question', function(data){
insertQuestion(data);
});
</script>
6.5 Broadcasting Questions
When a question is submitted to our server, we want to broadcast it out to all the connected clients so they can have a chance to answer it.
In the server, listen for 'question' events from clients.
client.on('question', function(question){
});
Now, emit the 'question' event on all the other clients connected, passing them the question data.
client.broadcast.emit('question', question);
Code:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(client) {
console.log("Client connected...");
client.on('question', function(question){
client.emit('question', question);
});
});
server.listen(8080);
6.6 Saving Client Data
In our real-time Q&A app, we want to allow each client only one question at a time, but how do we enforce this rule? We can use socket.io's ability to save data on the client, so whenever a question is asked, we first want to check the question_asked value on the client.
First, when a client emits a 'question' event, we want to set the value ofquestion_asked to true.
Second, when a client emits a 'question' event, we want to broadcast that question to the other clients.
client.question_asked = true;
client.broadcast.emit('question', question);
Finally, when a client emits a 'question' event, check to make surequestion_asked is not already set to true. We only want to allow one question per user, so make sure that we only set the value ofquestion_asked and broadcast the question to other clients when the value of question_asked is not already true.
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(client) {
console.log("Client connected...");
client.on('question', function(question) {
if(!client.question_asked){
client.question_asked = true;
client.broadcast.emit('question', question);
}
});
});
server.listen(8080);
6.7 Answering Questions
Clients can also answer each other's questions, so let's build that feature by first listening for the 'answer' event on the client, which will send us both the question and answer, which we want to broadcast out to the rest of the connected clients.
With the client, listen for the 'answer' event from clients.
client.on('answer', function(question, answer){
});
Now, emit the 'answer' event on all the other clients connected, passing them the question data.
// listen for answers here
client.on('answer', function(question, answer){
client.broadcast.emit('answer', question, answer);
});
6.8 Answering Question Client
Now on the client, listen for the 'answer' event and then broadcast both the question and the answer to the connected clients.
Listen for the 'answer' event off of the server.
Call the answerQuestion function, passing in both the question and theanswer that was broadcast from the server.
<script src="/socket.io/socket.io.js"></script> <script>
var server = io.connect('http://localhost:8080'); server.on('question', function(question) {
insertQuestion(question);
}); server.on('answer', function(question, answer){
answerQuestion(question, answer);
}); //Don't worry about these methods, just assume
//they insert the correct html into the DOM
// var insertQuestion = function(question) {
// } // var answerQuestion = function(question, answer) {
// }
</script>
[Node.js] Level 6. Socket.io的更多相关文章
- node.js中使用socket.io + express进行实时消息推送
socket.io是一个websocket库,包含客户端的js和服务端的node.js,可以在不同浏览器和移动设备上构建实时应用. 一.安装 socket.io npm install socket. ...
- node基于express的socket.io
前一段事件,我一个同学给他们公司用融云搭建了一套web及时通信系统,然后之前我的公司也用过环云来实现web及时通信,本人对web及时通信还是非常感兴趣的.私下读了融云和环信的开发文档,然后发现如果注册 ...
- [Node.js]29. Level 6: Socket.io: Setting up Socket.io server-side & Client socket.io setup
Below we've already created an express server, but we want to start building a real-time Q&A mod ...
- dotnet调用node.js写的socket服务(websocket/socket/socket.io)
https://github.com/jstott/socketio4net/tree/develop socket.io服务端node.js,.里面有js写的客户端:http://socket.io ...
- Node.js入门:异步IO
异步IO 在操作系统中,程序运行的空间分为内核空间和用户空间.我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务. 同步IO的并行模式 ...
- [Node.js] Level 7. Persisting Data
Simple Redis Commands Let's start practicing using the redis key-value store from our node applicati ...
- [Node.js] Level 3 new. Steam
File Read Stream Lets use the fs module to read a file and log its contents to the console. Use the ...
- [Node.js] Level 2 new. Event
Chat Emitter We're going to create a custom chat EventEmitter. Create a new EventEmitter object and ...
- [Node.js] Level 5. Express
Express Routes Let's create an express route that accepts GET requests on'/tweets' and responds by s ...
随机推荐
- Kuhn-Munkres算法
KM算法——二分图最大权匹配 我们前面学过了二分图匹配的匈牙利算法.但这种算法是针对没有权值的图来说的. 肯定有人想问,没有权值的用匈牙利算法,哪有权值的图要求最大权或最小权匹配呢?? 这里就引出了我 ...
- java面试题一
个人的一点参考总结,如有雷同,纯属巧合! 1.hashmap的实现原理以及hashtable的线程安全是怎么实现的?HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线 ...
- hdu 1114 dp动规 Piggy-Bank
Piggy-Bank Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- POJ1916 Period KMP
http://poj.org/problem?id=1961 判断某一字符串中 , 哪些前缀子串有周期 , 输出子串长度以及子串中周期重复的次数 ( 次数>1 ) 需要的只是对KMP性质的进一 ...
- Java泛型应用总结
一.泛型的引入原因 在操作集合的时候,之前方法的定义都是Object类型,向集合中添加对象,都自动向上转型,加入的元素可以是任何类型 但是,在取出元素的时候,通常想要使用对象的特有功能,就必须向下转型 ...
- [转]应用服务器ApacheSocketUnixthread
HttpClient容易忽视的细节——连接关闭 博客分类: java HttpClient client = new HttpClient(); HttpMethod method = new G ...
- HDU 3974 Assign the task 并查集/图论/线段树
Assign the task Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- 《pyhton学习手册》 第33章 异常编码细节
try/except/else语句 这些语句的一般的格式如下图所示 其中try中定义了主要执行的动作.except中定义了try语句当中发生异常的处理器.else定义了没有发生异常时候的处理器. tr ...
- Virtual Treeview 安装以及入门
Virtual Treeview是一套Delphi下优秀的VCL控件,代码质量高,使用灵活.功能强大.性能非常好,可以用于表达Treeview和表格类数据.它的代码现在托管在google code上. ...
- AT070TN92 电源
第二版STM32 + RA8875 + AT070TN92 + 触摸屏 + USB + C++... http://www.amobbs.com/thread-5510972-1-1.html