有人能说说 node.js net.socket 和 node.js搭建socket.ioo 的区别在哪吗

socket.io入门整理 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序。
1 npm install socket.io
利用Node的搭建Http服务
分为两个文件,服务端文件app.js和客户端index.html
01 var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
05 app.listen(80);
07 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);
20 io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
这里需要注意的是:
require(‘’).listen(app) 实际上这句就是讲socket的监听加入的app设置的http模块了
io.sockets.on(‘connection’,function()…)这里设置了在连接后进行的处理,代码示例中,主要包含两件事,一个是向前段发送news的事件,一个是监听my other event事件。
index.html
1 &script src=&/socket.io/socket.io.js&&&/script&
2 &script&
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
8 &/script&
客户端一个引用了socket.io.js的javscript库
还有就是连接服务器(通过io.connect(‘’))
之后在监听收到news的事件后,发送my other event事件
利用Express3框架
上面的例子只是使用nodejs建立了一个交互,也可以使用express2的web框架,
具体app.js代码如下:
ar 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三个事件外,用户可以自定义自己的事件
// note, io.listen(&port&) will create a http server for you
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
io.sockets.emit('this', { will: 'be received by everyone'});
socket.on('private message', function (from, msg) {
console.log('I received a private message by ', from, ' saying ', msg);
socket.on('disconnect', function () {
io.sockets.emit('user disconnected');
有的时候需要存储一些和客户端关联的数据在会话里,socket.io也是支持的,代码如下:
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('set nickname', function (name) {
socket.set('nickname', name, function () {
socket.emit('ready');
socket.on('msg', function () {
socket.get('nickname', function (err, name) {
console.log('Chat message by ', name);
socket.set和socket.get方法分为用于设置和获取变量。
设置命名空间
有的时候要一个程序支持多个应用,如果使用默认的 “/” 命名空间可能会比较混乱。如果想让一个连接可以支持多个连接,可以使用如下的命名空间的方法:
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’ });
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&
发送获取数据
有的时候,你需要在发送数据后,等待服务器的消息确认。当然简单的发,可以通过两次消息发送,来完成。这里介绍一种使用回调函数的方法:
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('ferret', function (name, fn) {
fn('woot');
client.html
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
&script src=&/socket.io/socket.io.js&&&/script&
var socket = io.connect('http://localhost');
socket.on(&notice&, function(data){
var msg = document.getElementById('all').
document.getElementById('all').innerText = msg + &\n& + data.
var chat_fn = function(){
var msg = document.getElementById(&message&).
socket.emit(&chat&, {message: msg});
socket.on(&nickname ready&, function(data){
alert(&nickname changed.&);
var change_nickname = function(){
var nickname = document.getElementById(&nickname&).
socket.emit('set nickname', nickname);
&/script&
&textarea id=&all& cols=40 rows=20&&/textarea&
&br /&
&label&Message:&/label&
&input id=&message& type=&text& name=&message& cols=120/&
&input id=&chat_btn& type=&button& value=&chat& onclick=&javascript:chat_fn()& /&
&label&NickName:&/label&
&input id=&nickname& typee=&text& name=&nickname& /&
&input id=&chang_name& type=&button& value=&nickname& onclick=&javascript:change_nickname()& /&
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的监听吗?
赞. 这种时刻就差 Live Demo 了
为什么我照着代码写会报错~
好老的东西。。不懂还适用不
1.0版本api有变化
没有get和set了
接收发送事件
socket.io允许用户自定义发送接收的事件。除了connect,message,disconnect三个事件外,用户可以自定义自己的事件
// note, io.listen(&port&) will create a http server for you
var io = require(‘’).listen(80);
io.sockets.on(‘connection’, function (socket) {
io.sockets.emit(‘this’, { will: ‘be received by everyone’});
socket.on(‘private message’, function (from, msg) {
console.log('I received a private message by ', from, ’ saying ', msg);
socket.on(‘disconnect’, function () {
io.sockets.emit(‘user disconnected’);
此处,说明是会创建一个http请求,但是我没明白,这个请求创建了之后,要怎么访问呢,我看代码engine.io.js里,有这样一段代码:
function listen(port, options, fn) {
if (‘function’ == typeof options) {
options = {};
var server = http.createServer(function (req, res) {
res.writeHead(501);
res.end('Not Implemented');
server.listen(port, fn);
// create engine server
var engine = exports.attach(server, options);
engine.httpServer =
创建的一个501请求,但是这样创建的一个,用什么方法可以访问呢??
还有就是如果才能触发 connection事件呢??
一直没搞明白这两个问题
==============补充=======================
按我的理解是,创建了一个HTTP服务,然后通过浏览器去访问,然后再通过客户端的 **var socket = io(‘’);**来建立长链接,然后触发后端的
io.on(‘connection’, function (socket) {
console.log(4);
socket.emit(‘news’, { hello: ‘world’ });
socket.on(‘my other event’, function (data) {
console.log(data);
但是,上面的代码,不清楚在哪个地方可以触发事件,并且怎么访问建立的HTTP服务!请知道的解答一下,谢谢
怎么给特定用户发消息?
可以问下google
private chat
楼主您好,这个聊天用cluster改写吗?我们写好的聊天压测并发只有不到2K,想用cluster改写不知道怎么做啊,楼主有这方面的经验吗?
怎么测试呀?有详细的步骤吗
几乎所有的教程都没有涉及到socket中对错误的处理
我前几天写的,用express4
现在还有内存泄漏吗?
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
按 TCP 或者 HTTP, 两个服务监听同一端口是会报错的,
但 Socket.IO 却可以直接监听 Express 服务器的同一端口,
具体原因是什么?
WebSockets 是基于 HTTP 实现, 是否相关?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
应该是两个程序监听一个端口会报错。
websocket, http 都是基于tcp实现的。websocket 的连接请求都是用的http。websocket和http是在一个层面上的东西。比如在Go中处理websocket请求:
http.HandleFunc("/ws", serveWs)
处理action:
func serveWs(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
http.Error(w, "Method not allowed", 405)
if r.Header.Get("Origin") != "http://"+r.Host {
http.Error(w, "Origin not allowed", 403)
ws, err := websocket.Upgrade(w, r, nil, )
if _, ok := err.(websocket.HandshakeError); ok {
http.Error(w, "Not a websocket handshake", 400)
} else if err != nil {
log.Println(err)
c := &connection{send: make(chan []byte, 256), ws: ws}
h.register &- c
c.writePump()
h.unregister &- c
和普通的http请求处理很类似,也是使用GET方法,Node的原理也是一样的。
另外一个端口可以接受多个tcp请求。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为 WebSocket 是基于 HTTP 1.1 的一个功能,它本身是依赖 HTTP 的(使用 101 状态码来切换协议)。Express 应该知道自己已经监听了那个端口,所以没有再尝试监听(bind(2)),而只是给那个端口来的请求注册了针对 HTTP WebSocket 请求的处理方法。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
按理说TCP与HTTP之间是不能用「或者」的。
在OSI模型中,TCP是第四层传输层的协议,HTTP是第七层应用层的协议。
你的问题可以这样理解,socket.io 和 Express 都在使用node正在监听的端口来分别处理请求,而不是分别监听端口。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:

我要回帖

更多关于 nodejs socket.io wss 的文章

 

随机推荐