原文链接:http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264

我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序。
最最开始

先安装socket.io:

npm install socket.io

利用Node的搭建Http服务

分为两个文件,服务端文件app.js和客户端index.html

app.js
var app =require('http').createServer(handler)
, io =require('socket.io').listen(app)
, fs =require('fs')0405 app.listen(80);
function handler (req, res){fs.readFile(__dirname+'/index.html',function(err, data){
if(err){
res.writeHead(500);
return res.end('Error loading index.html');
}else{
      res.writeHead(200);
res.end(data);
}
});
}
io.sockets.on('connection',function(socket){
socket.emit('news',{ hello:'world'});
socket.on('my other event',function(data){
console.log(data);
});
});

这里需要注意的是:
require('socket.io').listen(app) 实际上这句就是讲socket的监听加入的app设置的http模块了
io.sockets.on('connection',function()....)这里设置了在连接后进行的处理,代码示例中,主要包含两件事,一个是向前段发送news的事件,一个是监听my other event事件。

index.html

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news',function(data){
console.log(data);
socket.emit('my other event',{my:'data'});
});
</script>
 

客户端一个引用了socket.io.js的javscript库
还有就是连接服务器(通过io.connect('http://localhost'))
之后在监听收到news的事件后,发送my other event事件

利用Express3框架
上面的例子只是使用nodejs建立了一个交互,也可以使用express2的web框架, 具体app.js代码如下:

var app =require('express')(), 
server =require('http').createServer(app),
io =require('socket.io').listen(server); server.listen(80); app.get('/',function(req, res){
res.sendfile(__dirname +'/index.html');}); io.sockets.on('connection',function(socket){
socket.emit('news',{ hello:'world'});
socket.on('my other event',function(data){
console.log(data);
});
});

接收发送事件
socket.io允许用户自定义发送接收的事件。除了connect,message,disconnect三个事件外,用户可以自定义自己的事件


app.js
var io =require('socket.io').listen(80);
var chat = io
.of('/chat')
.on('connection',function(socket){
socket.emit('a message',{that:'only','/chat':'will get'});
chat.emit('a message',{
everyone:'in','/chat':'will get'});});
var news = io
.of('/news')
.on('connection', function (socket) {
socket.emit('item', { news: 'item' });
}); client.js
<script>var chat = io.connect('http://localhost/chat'), news = io.connect('http://localhost/news'); chat.on('connect',function(){
chat.emit('hi!');}); news.on('news',function(){
news.emit('woot');});</script>

 
 

发送获取数据
有的时候,你需要在发送数据后,等待服务器的消息确认。当然简单的发,可以通过两次消息发送,来完成。这里介绍一种使用回调函数的方法:

app.js
var io =require('socket.io').listen(80); io.sockets.on('connection',function(socket){
socket.on('ferret',function(name, fn){
fn('woot');});});
client.html
<script>var socket = io.connect();// TIP: .connect with no args does auto-discovery
socket.on('connect',function(){// TIP: you can avoid listening on `connect` and listen on events directly too!
socket.emit('ferret','tobi',function(data){
console.log(data);// data will be 'woot'});});</script>

广播
向所有的连接触发事件,这里注意:不包括本身连接的事件。

var io =require('socket.io').listen(80);

io.sockets.on('connection',function(socket){
socket.broadcast.emit('user connected');});

我写的聊天程序:

index.html

<scriptsrc="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on("notice",function(data){ var msg = document.getElementById('all').value;
document.getElementById('all').innerText = msg +"\n"+ data.message;}); var chat_fn =function(){var msg = document.getElementById("message").value;
socket.emit("chat",{message: msg});}; socket.on("nickname ready",function(data){
alert("nickname changed.");}); var change_nickname =function(){var nickname = document.getElementById("nickname").value; socket.emit('set nickname', nickname);};</script>
<textareaid="all"cols=40rows=20>
</textarea><br/>
<label>Message:</label>
<inputid="message"type="text"name="message"cols=120/>
<inputid="chat_btn"type="button"value="chat"onclick="javascript:chat_fn()"/>
<label>NickName:</label>
<inputid="nickname"typee="text"name="nickname"/>
<inputid="chang_name"type="button"value="nickname"onclick="javascript:change_nickname()"/>
app.js

var app =require('http').createServer(handler), io =require('socket.io').listen(app), fs =require('fs');

app.listen(80);function handler (req, res){
fs.readFile(__dirname +'/index.html',function(err, data){if(err){
res.writeHead(500);return res.end('Error loading index.html');} res.writeHead(200);
res.end(data);});} io.sockets.on('connection',function(socket){// socket.emit('news', { hello: 'world' });// socket.on('my other event', function (data) {// console.log(data);// }); socket.set('nickname','nickname',function(){}); socket.on('set nickname',function(name){
socket.set('nickname', name,function(){
console.log("change nickname=>"+ name);
socket.emit('nickname ready');});}); socket.on('chat',function(data){
socket.get('nickname',function(err, name){ socket.emit("notice",{message: name +":"+ data.message});
socket.broadcast.emit("notice",{message: name +":"+ data.message});
console.log("chat: "+ data.message);});});});

转载:socket.io 入门的更多相关文章

  1. socket.io入门整理教程

    socket.io入门整理  发布于 5 年前  作者 dtrex  124983 次浏览  最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...

  2. Socket.io 入门 - Renyi的博客

    Socket.io Vue 中使用 NPM 安装 npm install vue-socket.io --save npm install --save socket.io-client 引用 详情 ...

  3. socket.io 入门教程

    转载自:http://deadhorse.me/nodejs/2011/12/29/socket.io_induction.html socket.io socket.io是一个以实现跨浏览器.跨平台 ...

  4. Node.js、Express、Socket.io 入门

    前言 周末断断续续的写了第一个socket.io Demo.初次接触socket.io是从其官网看到的,看着get started做了一遍,根据官网的Demo能提供简单的服务端和客户端通讯. 这个De ...

  5. socket.io 入门篇(三)

    本文原文地址:https://www.limitcode.com/detail/5926e3a056fba70278bf2044.html 前言 上篇我们介绍了 socket.io 中room的概念和 ...

  6. socket.io 入门篇(二)

    本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...

  7. socket.io 入门篇(一)

    本文原文地址:https://www.limitcode.com/detail/591b114bb1d4fe074099d9c9.html 前言 本篇介绍使用node.js模块组件socket.io实 ...

  8. socket.io入门整理

    我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序. 最最开始 先安装socket.io: 1 npm install socket.io 利用Nod ...

  9. socket.io入门示例参考

    参考示例地址:http://www.linchaoqun.com/html/cms/content.jsp?menu=nodejs&id=1480081169735

随机推荐

  1. isDebugEnabled作用

       早上写了日志级别,然后想起在使用的时候经常用isDebugEnabled,一鼓作气.彻底弄懂它: 现象 if (logger.isDebugEnabled()) { logger.debug(m ...

  2. Roman to Integer [LeetCode]

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  3. Redis(7)Creating and Using Cluster Mode

    1. DocumentsCluster will not support SELECT, it only contains database 0.All the nodes use TCP bus a ...

  4. IntelliJ IDEA 12 与 Tomcat 集成并运行Web项目

    配置Tomcat Server 1.Ctrl+Alt+s或者File——>Setting...;选中“Application Servers”点击"+" 创建运行配置 上面的 ...

  5. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  6. HTML 中 META的作用

    说明: meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:n ...

  7. 谈谈CSS的布局,display、position、float

    前言 前端一直是我的一个很大的缺憾,这段时间痛顶思痛,决定好好的把前台的东西加强,这不,在学习了一段时间js之后,在做一些小练习,却发现最基本的一些css知识却还不了解,所以便有了这篇博文. 块级元素 ...

  8. android 计算器的实现(转)

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. 一模 (3) day1

    第一题: 题目大意:给出m个小于n的数,求出出现次数大于m div 2 的数. 1<=n<=2^31   1<=m<=10000 解题过程: 1.看到m的数据范围比较小,直接  ...

  10. C#编程

    C#最完整的webservice实例 http://fyinthesky.blog.163.com/blog/static/3555251720110115227337/ C# WinForm 实践开 ...