在学习node的时候都会练习做一个聊天室的项目,主要使用socket.io模块和http模块。这里我们使用更加原始的方式去写一个在命令行聊天的聊天室。

http模块,socket.io都是高度封装之后的模块,我们使用更加原始的net模块来做。

socket

做聊天室,我们首先要了解一下socket,用百度百科上的定义:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket对TCP/IP封装提供网络开发的接口,提供网络通信的接口。详细可以看看各种百科的资料。

服务端

1.基本接口介绍

创建服务端

  1. const server = net.createServer((socket) => {
  2. //这里的毁掉函数中的参数就是一个socket
  3. }
  4. //监听端口和主机
  5. server.listen({
  6. port:4433,
  7. host:'127.0.0.1'//要想别人访问到,要写服务启动所在机子的ip地址,默认localhost
  8. }, () => {
  9. //这里是启动成功后的回调
  10. console.log('server bound')
  11. })

服务创建成功之后,socket可以提供客户端(访问者)的一些信息,这里主要用的两个属性

  1. socket.remoteAddress :客户端的ip地址
  2. socket.remotePort:客户端访问的接口,这里是随机分配,注意这里的接口跟我们创建服务的接口不同,表示的意义也不一样建立网络通信连接至少要一对端口号,服务端监听的端口是为了跟服务端所在机子的其他服务区分,客户端访问这个端口的时候自然也要区分,分配不同端口

socket的event事件

  1. //监听客户端发送过来的消息
  2. socket.on('data', (data) => {
  3. //这里data是一个buffer要转化为字符串,然后去一下两端空格
  4. let receive = JSON.parse(data.toString().trim());
  5. })
  6. //给客户端发送消息
  7. socket.write(string[,encoding]);

错误处理error

  1. socket.on('error', (err) => {
  2. //在测试中发现,不去监听这个错误事件,当你客户端掉线之后服务端也会断开所以做一些错误处理
  3. })
2.聊天设计
聊天过程我们分三部分

1.登录

2.跟所有人聊

3.跟特定对象聊

首先我们确定聊天信息的发送格式,就像http里面有头部,内容等。我们发送的信息,应该包括发送者名字,给谁发以及发送的消息,设定为一下格式

  1. const send = {
  2. name:"",
  3. message:"",
  4. to:""
  5. }

服务端要根据给谁发做不同的处理

1.登录(login):我们要给所有的人发信息,XXX登录了聊天室,还要记录这个访问的socket,以便于后续给特定的人发消息,格式{username:socket}

2.跟所有人聊天(server):除了发消息本人要给其他人发送

3.跟某一个人聊天(client):找到相应的socket发送消息

  1. socket.on('data', (data) => {
  2. let receive = JSON.parse(data.toString().trim());
  3. switch(receive.to){
  4. case "login":
  5. DealInfo.login(receive, socket);
  6. break;
  7. case "server":
  8. DealInfo.server(receive, socket);
  9. break;
  10. default:
  11. DealInfo.client(receive, socket);
  12. break;
  13. }
  14. })

之前我们有监听socket的错误处理,也就是当用户掉线的时候,我们就可以把记录的socket删除掉,并提示当前用户数。这里可以从记录的socket个数求取,也可以根据以下方法

  1. server.getConnections((err, count) => {
  2. if(err){
  3. throw err;
  4. }
  5. console.log(`${deleteKey}下线了 当前在线人数${count}`);
  6. })

客户端

1.基本接口介绍

创建socket连接

  1. const client = net.connect({
  2. port:4433,
  3. host:'127.0.0.1'//默认localhost
  4. }, () => {
  5. //连接成功之后的回调
  6. })

client的事件

  1. //监听服务端发送过来的信息
  2. client.on('data', (data) => {
  3. //这里data是一个buffer
  4. let receive = JSON.parse(data.toString().trim());
  5. }).on('error', (err) => {
  6. //错误处理
  7. })
  8. //给服务端发送消息
  9. client.wirte(string[, encoding]);
2.聊天设计
基本设置

登录:要输入聊天名再去连接客户端

群聊或者跟某一个人聊只需要区分用户即可,跟某一个人聊的输入格式为name:message

聊天格式:name>message

2.1用户名

这里我们使用readline这个模块

  1. const readline = require('readline');
  2. const rl = readline.createInterface({
  3. input: process.stdin,
  4. output: process.stdout
  5. });
  6. rl.question('What is your name >', (name) => {
  7. //回调中的参数就所输入的信息,当输入非空的时候作为用户名,之后按我们的聊天格式输出预先样式
  8. //设立设定prompt的输出内容,只要调用rl.prompt()即可
  9. rl.setPrompt(`${name.trim()}>`);
  10. rl.prompt();
  11. }

监听用户输入

  1. rl.on('line', (line) => {
  2. let stdinInfo = line.trim().split(':');
  3. if(stdinInfo.length == 2){
  4. //跟某个用户聊天
  5. send.to = stdinInfo[0];
  6. send.message = stdinInfo[1];
  7. }else{
  8. //跟所有人聊天
  9. send.to = "server";
  10. send.message = stdinInfo[0];
  11. }
  12. client.write(JSON.stringify(send));
  13. rl.prompt();
  14. })

详细代码地址:https://github.com/Stevenzwzhai/node-socket-chatroom

使用原生node写一个聊天室的更多相关文章

  1. 原生node写一个静态资源服务器

    myanywhere 用原生node做一个简易阉割版的anywhere静态资源服务器,以提升对node与http的理解. 相关知识 es6及es7语法 http的相关网络知识 响应头 缓存相关 压缩相 ...

  2. Golang之写一个聊天室

    . 海量用户在线聊天系统 . 点对点聊天 . 用户登录&注册 一.服务端开发 . 用户管理 用户id:数字 用户密码:字母数字组合 用户昵称:用来显示 用户性别:字符串 用户头像:url 用户 ...

  3. 零基础实现node+express个性化聊天室

    本篇文章使用node+express+jquery写一个个性化聊天室,一起来get一下~(源码地址见文章末尾) 效果图 项目结构 实现功能 登录检测 系统自动提示用户状态(进入/离开) 显示在线用户 ...

  4. 利用socket.io构建一个聊天室

    利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...

  5. 基于react+react-router+redux+socket.io+koa开发一个聊天室

    最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...

  6. 用原生js写一个"多动症"的简历

    用原生js写一个"多动症"的简历 预览地址源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现. 会动的简历实现 ...

  7. 使用 NIO 搭建一个聊天室

    使用 NIO 搭建一个聊天室 前面刚讲了使用 Socket 搭建了一个 Http Server,在最后我们使用了 NIO 对 Server 进行了优化,然后有小伙伴问到怎么使用 Socket 搭建聊天 ...

  8. 使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  9. node+express+socket.io制作一个聊天室功能

    首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...

随机推荐

  1. IOS 计算文字尺寸(UILabel)

    方式1 :普通用法 #define  MJNameFont [UIFont systemFontOfSize:14] /** * 计算文字尺寸 * * @param text 需要计算尺寸的文字 * ...

  2. SQL的注入式攻击方式和避免方法

    SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...

  3. Codeforces Round #404 (Div. 2) ABC

    A. Anton and Polyhedrons Anton's favourite geometric figures are regular polyhedrons. Note that ther ...

  4. Thread 创建线程

    1.该线程变量 无参数 我们可以把线程的变量 理解为一个 委托.可以指向一个方法.有点像c语言中的指向函数的指针. 第1步我们创建了 Thread变量t1 ,第2步创建了一个方法threadChild ...

  5. iOS开发网络缓存原理

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

  6. Redis高可用

    redis高可用只要在于三个方面 主从复制 哨兵机制 集群机制 主从复制 主从复制作用: 1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.2.故障恢复:当主节点出现问题时,可 ...

  7. PHP实现的一个时间帮助类

    背景 工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率 主要功能 根据相差的天数获取连续的时间段 /** * 根据相差的天数获取所有连续的时间段 * @param $ ...

  8. dts--tests(三)

    sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...

  9. 列表,元组的操作,for循环

    1.列表 # li = ["wang","jian","wei"] # print(li) # 结果:['wang', 'jian', 'w ...

  10. win8电脑字体出现方格的解决方法

    一般电脑出现乱码有几种可能,最常见的可能就是电脑字体的丢失,其次就是电脑字体被病毒所损坏,因此,首先我们要做的就是下载字体并进行安装. 下载 simsun.tcc点击安装,如果电脑字体依然是这种情况( ...