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

先安装socket.io:

  1. npm install socket.io

利用Node的搭建Http服务

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

  1. app.js
  2. var app = require('http').createServer(handler)
  3. io = require('socket.io').listen(app)
  4. fs = require('fs')
  5. app.listen(80)
  6. function handler (req, res) {
  7. fs.readFile(__dirname + '/index.html',function (err, data) {
  8. if (err) {res.writeHead(500);
  9. return res.end('Error loading index.html');
  10. }
  11. res.writeHead(200);
  12. res.end(data);
  13. });
  14. }
  15. io.sockets.on('connection', function (socket) {
  16. socket.emit('news', { hello: 'world' });
  17. socket.on('my other event', function (data) {
  18. console.log(data);}); });

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

  1. index.html
  2. <script src="/socket.io/socket.io.js"></script>
  3. <script>
  4. var socket = io.connect('http://localhost');
  5. socket.on('news', function (data) {
  6. console.log(data);
  7. socket.emit('my other event', { my: 'data' });
  8. });
  9. </script>

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

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

  1. var app = require('express')()
  2. server = require('http').createServer(app)
  3. io = require('socket.io').listen(server);
  4.  
  5. server.listen(80);
  6.  
  7. app.get('/', function (req, res) {
  8. res.sendfile(__dirname + '/index.html');});
  9.  
  10. io.sockets.on('connection', function (socket) {
  11. socket.emit('news', { hello: 'world' });
  12. socket.on('my other event', function (data) {
  13. console.log(data);
  14. });});

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

  1. // note, io.listen(<port>) will create a http server for youvar io = require('socket.io').listen(80);
  2.  
  3. io.sockets.on('connection', function (socket) {
  4. io.sockets.emit('this', { will: 'be received by everyone'});
  5.  
  6. socket.on('private message', function (from, msg) {
  7. console.log('I received a private message by ', from, ' saying ', msg);
  8. });
  9.  
  10. socket.on('disconnect', function () {
  11. io.sockets.emit('user disconnected');
  12. });});

存储数据有的时候需要存储一些和客户端关联的数据在会话里,socket.io也是支持的,代码如下:

  1. var io = require('socket.io').listen(80);
  2.  
  3. io.sockets.on('connection', function (socket) {
  4. socket.on('set nickname', function (name) {
  5. socket.set('nickname', name, function () {
  6. socket.emit('ready');
  7. });
  8. });
  9.  
  10. socket.on('msg', function () {
  11. socket.get('nickname', function (err, name) {
  12. console.log('Chat message by ', name);
  13. });
  14. });});

socket.set和socket.get方法分为用于设置和获取变量。

设置命名空间有的时候要一个程序支持多个应用,如果使用默认的 “/” 命名空间可能会比较混乱。如果想让一个连接可以支持多个连接,可以使用如下的命名空间的方法:

  1. app.js
  2. var io = require('socket.io').listen(80);var chat = io
  3. .of('/chat')
  4. .on('connection', function (socket) {
  5. socket.emit('a message', {
  6. that: 'only'
  7. , '/chat': 'will get'
  8. });
  9. chat.emit('a message', {
  10. everyone: 'in'
  11. , '/chat': 'will get'
  12. });
  13. });

var news = io .of(‘/news’) .on('connection’, function (socket) { socket.emit('item’, { news: ‘item’ }); });

  1. client.js
  2. <script>
  3. var chat = io.connect('http://localhost/chat')
  4. , news = io.connect('http://localhost/news');
  5.  
  6. chat.on('connect', function () {
  7. chat.emit('hi!');
  8. });
  9.  
  10. news.on('news', function () {
  11. news.emit('woot');
  12. });</script>

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

  1. app.js
  2. var io = require('socket.io').listen(80);
  3.  
  4. io.sockets.on('connection', function (socket) {
  5. socket.on('ferret', function (name, fn) {
  6. fn('woot');
  7. });});
  8. client.html
  9. <script>
  10. var socket = io.connect(); // TIP: .connect with no args does auto-discovery
  11. socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
  12. socket.emit('ferret', 'tobi', function (data) {
  13. console.log(data); // data will be 'woot'
  14. });
  15. });</script>

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

  1. var io = require('socket.io').listen(80);
  2.  
  3. io.sockets.on('connection', function (socket) {
  4. socket.broadcast.emit('user connected');});

我写的聊天程序:

index.html

  1. <script src="/socket.io/socket.io.js"></script><script>
  2. var socket = io.connect('http://localhost');
  3.  
  4. socket.on("notice", function(data){
  5. var msg = document.getElementById('all').value;
  6. document.getElementById('all').innerText = msg + "\n" + data.message;
  7. });
  8.  
  9. var chat_fn = function(){
  10. var msg = document.getElementById("message").value;
  11. socket.emit("chat", {message: msg});
  12. };
  13.  
  14. socket.on("nickname ready", function(data){
  15. alert("nickname changed.");
  16. });
  17.  
  18. var change_nickname = function(){
  19. var nickname = document.getElementById("nickname").value;
  20. socket.emit('set nickname', nickname);
  21. };</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()" />
  22. app.js
  23.  
  24. var app = require('http').createServer(handler)
  25. , io = require('socket.io').listen(app)
  26. , fs = require('fs');
  27.  
  28. app.listen(80);function handler (req, res) {
  29. fs.readFile(__dirname + '/index.html',
  30. function (err, data) {
  31. if (err) {
  32. res.writeHead(500);
  33. return res.end('Error loading index.html');
  34. }
  35.  
  36. res.writeHead(200);
  37. res.end(data);
  38. });}
  39.  
  40. io.sockets.on('connection', function (socket) {
  41. // socket.emit('news', { hello: 'world' });
  42. // socket.on('my other event', function (data) {
  43. // console.log(data);
  44. // });
  45.  
  46. socket.set('nickname', 'nickname', function(){
  47. });
  48.  
  49. socket.on('set nickname', function(name){
  50. socket.set('nickname', name, function(){
  51. console.log("change nickname=>" + name);
  52. socket.emit('nickname ready');
  53. });
  54. });
  55.  
  56. socket.on('chat', function(data){
  57. socket.get('nickname', function(err, name){
  58.  
  59. socket.emit("notice", {message: name + ":" + data.message});
  60. socket.broadcast.emit("notice", {message: name + ":" + data.message});
  61. console.log("chat: " + data.message);
  62. });
  63. });});

socket.io实现在线群聊的更多相关文章

  1. 使用socket.io开发简单群聊功能

    1.新建package.json文件: { "name": "socket-chat-example", "version": " ...

  2. 关于Socket.IO的知识点记录

    最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在expres ...

  3. 基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊功能

    1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块  修改了start 脚本  nodemo ...

  4. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  5. 【socket.io研究】3.手机网页间聊天核心问题

    前面我们已经说了服务器相关的一些内容,且又根据官网给出的一个例子写了一个可以聊天的小程序,但是这还远远不够呀,这只能算是应用前的准备工作.接下来,一起来考虑完善一个小的聊天程序吧. 首先,修改服务器的 ...

  6. nodejs+socket.io即时聊天实例

    在这之前你应该先安装好 Node.js,安装过程不再讲解 首先在你的电脑上创建一个新目录,姑且命名为 chat,然后在该目录创建两个文件,分别是 app.js 和 index.html. app.js ...

  7. 基于Express+Socket.io+MongoDB的即时聊天系统的设计与实现

    记得从高中上课时经常偷偷的和同学们使用qq进行聊天,那时候经常需要进行下载qq,但是当时又没有那么多的流量进行下载,这就是一个很尴尬的事情了,当时就多想要有一个可以进行线上聊天的网站呀,不用每次痛苦的 ...

  8. 基于 socket.io 的 AI 服务 杂谈

    为什么会想到来聊下这个话题. 前几天在公司的项目中,开发一个基于 socket.io 的直播 IM 功能. 直播分为两部分,一部分是比较昂贵的 视频推流, 另外一部分是 IM 即时聊天服务. 从这里开 ...

  9. .net下使用socket.io随笔记录

    一.问题背景 目前公司在互联网产品上需要程序与前端部分要进行一个实时交互,在进行一定程度上的选型后,决定使用socket.io框架进行一个实践,算是公司的一个新的 尝试,也算是给自己增加增长见闻,由于 ...

随机推荐

  1. 记第一次面试的悲惨经历QAQ

    面试岗位:测试开发 自我介绍 :根据介绍的内容,会问简历上涉及到的东西,主要是项目: 手写代码:给一个数组,求数组中所有数字拼接后能得到的最小数字.例:{3,32,312},输出312323. 关于计 ...

  2. 把以100000+4位随机码的登录账号(比如1000001234),赋予制单页面的权限,怎么写sql啊

    insert into sys_user_role (user_id,role_id,office_id)  select id,'000101100000000004UP',company_id f ...

  3. Leetcode 283.移动零

    移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组 ...

  4. Light oj-1259 - Goldbach`s Conjecture

                                                                                    1259 - Goldbach`s Co ...

  5. hdu 3732

    #include<stdio.h> #include<string.h> int n,m,dp[10001]; int max(int a,int b) {  return a ...

  6. Postman调试依赖登录接口的3种方法

    在接口测试种, 我们经常会遇到有些接口登录后才能访问.我们在使用Postman调试这种接口时一般有3种方法: 依次请求 如果有登录接口的文档,或者通过抓包比较容易抓出登录请求的参数和格式,可以先使用P ...

  7. [NOIP2001] 提高组 洛谷P1024 一元三次方程求解

    题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  8. hdu3853:LOOPS

    题目大意:r*c个点,每个点有Aij的概率回到自己本身,Bij的概率向右一格,Cij的概率向下一格,求从(1,1)到(r,c)的期望步数. 题解:有了hdu4405的经验,从后往前推期望.那么,E(i ...

  9. 匿名函数--lambda函数

    匿名函数 匿名函数:为了解决一些功能很简单的需求而设计的一句话函数 (python对匿名函数支持有限,只有一些简单的条件下可以用匿名函数) 匿名函数固定格式: func = lambda *args: ...

  10. tomcat启动提示java.lang.UnsatisfiedLinkError: D:\soft\devTool\apache-tomcat-7.0.57\bin\tcnative-1.dll: C

    https://blog.csdn.net/a274360781/article/details/52411984