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的更多相关文章

  1. node.js中使用socket.io + express进行实时消息推送

    socket.io是一个websocket库,包含客户端的js和服务端的node.js,可以在不同浏览器和移动设备上构建实时应用. 一.安装 socket.io npm install socket. ...

  2. node基于express的socket.io

    前一段事件,我一个同学给他们公司用融云搭建了一套web及时通信系统,然后之前我的公司也用过环云来实现web及时通信,本人对web及时通信还是非常感兴趣的.私下读了融云和环信的开发文档,然后发现如果注册 ...

  3. [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 ...

  4. dotnet调用node.js写的socket服务(websocket/socket/socket.io)

    https://github.com/jstott/socketio4net/tree/develop socket.io服务端node.js,.里面有js写的客户端:http://socket.io ...

  5. Node.js入门:异步IO

    异步IO     在操作系统中,程序运行的空间分为内核空间和用户空间.我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务. 同步IO的并行模式 ...

  6. [Node.js] Level 7. Persisting Data

    Simple Redis Commands Let's start practicing using the redis key-value store from our node applicati ...

  7. [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  ...

  8. [Node.js] Level 2 new. Event

    Chat Emitter We're going to create a custom chat EventEmitter. Create a new EventEmitter object and ...

  9. [Node.js] Level 5. Express

    Express Routes Let's create an express route that accepts GET requests on'/tweets' and responds by s ...

随机推荐

  1. Oracle意外赢官司,程序员或过苦日子

    关于“Google在Android平台使用Java侵犯知识产权”一案,2014年5月,联邦法院判定Oracle获胜,这个结果完全出人意料,因为这样一来无异于打开了软件开发领域中API使用方式的潘多拉之 ...

  2. 使用matplotlib绘图(二)之柱状图

    # 使用matplotlib绘制柱状图 import numpy as np import matplotlib.pyplot as plt # 设置全局字体,以支持中文 plt.rcParams[' ...

  3. [HZOI 2016]我们爱数数

    [HZOI 2016]我们爱数数 题目大意: 一张圆桌,每个位置按顺时针从\(1\)到\(n\)编号.有\(n\)个人,编号从\(1\)到\(n\).如果编号为\(i\)的人坐到了编号为\(i\)的位 ...

  4. 25.最小生成树(kruskal算法)

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立 ...

  5. noip200706字符串的展开

    试题描述: 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获 ...

  6. pt-archive提速的实践经验

    最近遇到很多业务需求,需要进行数据导出工作,由于有格式要求,故之前一直使用mysqldump的方法. mysqldump -uuser -ppassword -S mysql.sock -t db t ...

  7. XY8782S00 BL-W8782 BL-R8782MS1 SDIO接口 高性能、低功耗、体积小 wifi无线模块

    1.产品简介 BL-8782是一款高性能.低功耗.体积小SDIO接口无线模组,符合IEEE802.11N标准,并向下兼容IEEE802.11B/G标准,支持IEEE 802.11i安全协议,以及IEE ...

  8. mOByDiC E90C2600 EOBD/OBDII to RS232 gateway

    http://www.ozenelektronik.com/downs/pdf/oe90c2600.pdf Features • Compatible with EOBD/OBDII standard ...

  9. C++入门级 一

    如果您想学习电脑编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧! 方案一 Basic语言 & Visual Basic 优点 (1)Basic 简单易学,很容易 ...

  10. 电子书mobi的格式详解

    https://wiki.mobileread.com/wiki/MOBI#Format Like PalmDOC, the Mobipocket file format is that of a s ...