socket.io系列二 聊天应用

最初的打算是对应着官网进行自己的学习和翻译,可是才使用socket.io官网开始的代码写出来demo,发现网站已改版。

那么就按照新的官网进行学习了。


开始:聊天应用


这个教程中我们将会创建一个基本的聊天应用。由于它基本上不需要nodejs与socke.io的先前准备知识,因此这个教程能被各个水平段的用户看得懂。



介绍


使用传统的Web开发工具开发一款聊天应用时很困难的,比如LAMP(PHP)。困难之处在于轮询服务器的变化、跟踪时间戳,并且消息的发送接收比较慢。

Sockets是被认为最适合及时聊天系统的架构、在服务器与客户端之间进行双向通信的解决方案。

这意味着服务器可以主动推送消息到客户端。不论合适你发出聊天消息,服务器都能获知并且推送到其他在线的用户。


网站构架

第一步是创建用于消息与表单处理的服务器。服务端,我们将用nodejs的一个web框架express。开始之前,要确保nodejs已安装。

首先,创建一个名为‘chat-example’的空文件夹。在文件夹中创建‘package.json’的文件,用于描述我们的项目:

{
	"name":"socket-chat-example",
	"version":"0.0.1",
	"description":"my first socket.io app",
	"dependencies":{}
}

为了项目所依赖的模块比较容易填写在‘dependencies’,我们将使用‘npm install --save’的命令:

npm install --save express

现在‘express’已经安装,我们可以在根目录创建'index.js'文件来开始我们的项目创建:

var app = require('express')();
var http = require('http').server(app);

app.get('/',function(req,res){
	res.send('<h1>Hello world</h1>');
});

http.listen(3000,function(){
	console.log('listening on 3000');
});

解释如下:

1,‘Express’初始化赋予变量‘app’作为方法应用于HTTP服务(第二行);
2,定义一个路由方法‘/’用做我们访问网站首页的返回结果;
3,让http服务器监听3000端口。

如果你在运行‘node index.js’,你会看到下图:

如果你在chrome中访问http://127.0.0.1:3000/,你会看到如下图所示:


服务端的HTML

到目前为止,在index.js中我们用‘res.send’方法传递HTML字符串。如果这样放整个应用的HTML的话,代码会显得杂乱。因此,我们创建一个‘index.html’文件来解决。

我们用‘sendfile’来重构路由:

app.get('/',function(req,res){
	res.sendfile('index.html');
});

‘index.html’代码如下:

<!doctype html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
  </body>
</html>

如果你重新运行程序(先命令键+C再运行‘node index’)并且刷新浏览器页面的话,你会看到如下:



Socket.io综述

Socket.io由两部分组成:

1,一个整合或者在node.js HTTP架构的服务器:socket.io
2,一个用于浏览器加载的客服端的库:socket.io-client

在开发过程中,socket.io自动连接客户端,但是我们必须要安装socket.io的模块:

npm install --save socket.io

这样socket.io就会安装并且会在‘package.json’添加对它的依赖。改变‘index.js’的代码如下:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/',function(req,res){
	res.sendfile('index.html');
});

io.on('connection',function(socket){
	console.log('a user connected');
});

http.listen(3000,function(){
	console.log('listening on 3000');
});


我通过传递一个'http'对象初始化一个‘socket.io’的实例。然后我监听socket的‘connection’事件并且输出到面板。

在‘index.html’中增加下面的代码到‘</body>’前:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();
</script>


这样页面将会加载到'socket.io-client'(暴漏‘io’给全局并连接)。

注意,当我调用'io()'的时候,我并没有制定任何URL,因为这样它将会默认的去尝试链接主机的首页。

假如你重启服务器并刷新页面,你会在命令版上看到'a user connected'。试着打开几个页面,你会看到几条信息:



每个socket将会有一个独特的‘disconnect’事件:

io.on('connection',function(socket){
	console.log('a user connected');
	socket.on('disconnect',function(){
		console.log('user disconnected');
	});
});

重启服务器后,如果你刷新一个页面几次,你将会看到如下:



发射事件


Socket.io的核心是你能发射和接收任何事件,包括带数据的事件。任何对象可以被编码成JSON,二进制也是支持的。

让我们做下面的事情:用户输入信息,服务器通过‘chat message’得到它。‘index.html’中‘script’的js代码改为如下:

<script src="/socket.io/socket.io.js"></script>
	<script src="jquery的CDN地址"></script>
	<script>
  		var socket = io();
  		$('form').submit(function(){
  			socket.emit('chat message',$('#m').val());
  			$('#m').val();
  			return false;
  		});
	</script>

 (考虑到国内墙的环境,可以安装jquery模块或者引入本地jQuery)

‘index.js’中‘socket’的代码如下:

io.on('connection',function(socket){
	socket.on('chat message',function(msg){
		console.log('message:'+msg);
	})
});

重启服务器刷新页面后,在文本框中输入信息按发送,将会在命令版看到你输入的信息:



Broadcasting/广播

下个目标是发送事件从服务器到其他用户。

为了发送事件给所有的人,Socket.IO提供了'io.emit'方法:

io.emit('some event',{for:'everyone'});

如果你想发送除了自己之外的任何人,可以使用'broadcast':

io.on('connection',function(socket){
    socket.broadcast.emit('hi');
});

这样的情况下,我们可以发送信息给任何人包括自己:

io.on('connection',function(socket){
	socket.on('chat message',function(msg){
		io.emit('chat message',msg);
	});
});


在客户端,我们可以捕获chat message事件。整个客户端的代码js代码如下:

var socket = io();
$('form').submit(function(){
 <span style="white-space:pre">	</span>socket.emit('chat message',$('#m').val());
	$('#m').val('');
  	return false;
  });
 socket.on('chat message',function(msg){
  	$('#messages').append($('<li>').text(msg));
  })

整个聊天应用只需要20行代码就实现了。


作业:

有几个想法可以改善这个聊天应用:

1,有人进入或者离开聊天室的时候通知所有的用户;

2,增加用户昵称;

3,增加‘用户正在输入’的功能;

4,显示在线用户;

5,增加私信;

6,分享你的改进。


你可以在github得到这个示例的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
socket.io和koa是两个不同的技术,分别用于实现实时通信和构建Web应用程序。Socket.io是一个JavaScript库,用于在客户端和服务器之间建立双向通信,常用于构建实时聊天室、游戏和实时协作应用。而Koa是一个Node.js的Web应用框架,用于构建高效、可扩展的Web应用程序。 如果你想在koa实现一个聊天室,你可以结合使用socket.io和koa。首先,你需要安装相应的依赖: ``` npm install koa npm install socket.io ``` 然后,你可以创建一个koa应用程序,并在其配置socket.io: ```javascript const Koa = require('koa'); const app = new Koa(); const server = require('http').createServer(app.callback()); const io = require('socket.io')(server); // 处理socket连接 io.on('connection', (socket) => { console.log('A user connected'); // 处理客户端发送的消息 socket.on('chat message', (msg) => { console.log('message: ' + msg); // 广播消息给所有客户端 io.emit('chat message', msg); }); // 处理socket断开连接 socket.on('disconnect', () => { console.log('A user disconnected'); }); }); // 启动服务器 server.listen(3000, () => { console.log('Server listening on port 3000');}); ``` 在上面的代码,首先创建了一个koa应用程序,并创建了一个HTTP服务器。然后,通过socket.io库将服务器和koa应用程序连接起来。在`io.on('connection')`回调处理socket连接事件,当有客户端连接时会输出一条日志。在`socket.on('chat message')`回调处理客户端发送的消息,并通过`io.emit('chat message')`广播给所有客户端。最后,在`socket.on('disconnect')`回调处理socket断开连接事件。 这只是一个简单的示例,你可以根据自己的需求来扩展和定制。希望对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值