一、环境准备

Mac下命令查询网络端口占用情况

  • netstat命令

netstat -an | grep 3000

3000可以替换为你所需要查询的端口号

  • lsof命令

通过list open file命令可以查看到当前打开文件,在linux中所有事物都是以文件形式存在,包括网络链接及硬件设备;

lsof -i:3000

-i参数表示网络链接,:3000指明端口号,该命令会同时列出pid,方便kill

查看所有进程监听的端口

sudo lsof -i -P | grep -i "listen"

  • kill进程

kill pid

准备前可能遇到的问题

  • 端口号被占用,上面是查询相关命令;

  • 连接不上:项目没有启动,在项目目录下启动项目,eg: http目录下有个net.js文件(启动项目文件),可以在http的文件目录下执行:node net.js

Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
复制代码

二、 Show you the code

  • 建立一个文件夹:mkdir http
  • 建立项目文件: cd http && touch net.js
  • 注意:不要复制粘贴哦,跟着我一步一步敲下面代码吧

let clients = {} // 存在形式:{ '唯一的值': {name: '匿名',socket: socket}}let server = net.createServer(function (socket) {let key = socket.remoteAddress + socket.remotePort;clients[key] = {name: '匿名',socket}server.getConnections(() => {socket.write('欢迎来到聊天室:\r\n');});socket.setEncoding('utf8');socket.on('data', function(data) {data = data.replace("\r\n", '');let char = data.split(":");switch (char[0]) {case 'l':list(socket); // 把列表显示给当前的用户break;case 'b': // b: 广播,向所有用户发消息broadCast(key, char[1]);break;case 's': // 私聊:向特定的人发消息private(char[1], char[2], key);break;case 'r': // 重命名rname(socket, char[1], key);break;default:break;}})
});
// let c = {'xxx': {name: 'whoareyou', socket}, 'qqq': {name: 'whocares'}}
function private(username, content, key) {let user = Object.values(clients).find(item => item.name == username);user.socket.write(`${clients[key].name}:${content}\r\n}`);
}
function broadCast(key, content) {for (let k in clients) {if (k != key) {clients[k].socket.write(`${clients[key].name}:${content}\r\n}`);}}
}
function rname(socket, newName, key) {clients[key].name = newName;socket.write(`恭喜:您的新名字是 ${newName}\r\n`);
}
function list(socket) {let userList = Object.values(clients).map(item => item.name).join('\r\n');socket.write(`当前用户列表\r\n${userList}\r\n`);
}
server.listen(3000, () => {console.log('Listening on port: 3000')
})
复制代码

三、 The end

写完这个简易的聊天程序后,感觉自己在演戏,一人分饰三角,我也是厉害了,哈哈哈。。。自娱自乐完之后,把其中乐趣也教给你吧:

  • 首先运行跟着我敲的代码:node net.js

  • 开启多个终端(Ctrl + N),就三个吧,当然你想体验多个也是可以的

  • 在每个终端执行:telnet localhost 3000 (Mac一般自带telnet)

  • 在每个终端进去之后,最好先重命名一下,让别人知道你是谁(根据代码,可执行:r: 你的名字)

  • 注意:输入信息之前需要加上 :

    // l: 显示所有用户
    // b: 广播
    // s:(此处是你要私聊的对象名字): 私聊
    // r:(此处是你重命名后的名字)
    复制代码
  • 奉上我的抽风之作(绝对是个戏精。。):

转载于:https://juejin.im/post/5b7ecb786fb9a01a0c0fe522

教你写一个基于TCP的简易聊天室相关推荐

  1. ajax无刷新聊天室,实现一个无刷新的基于ajax的简易聊天室

    实现一个基于ajax的简易聊天室 1 程序主页面 在线交流对话 include_once("server1.server.php"); #servidor para XAJAX $ ...

  2. 基于TCP的网络聊天室实现(C语言)

    基于TCP的网络聊天室实现(C语言) 一.网络聊天室的功能 二.网络聊天室的结果展示 三.实现思路及流程 四.代码及说明 1.LinkList.h 2.LinkList.c 3.client.c 4. ...

  3. java编写一个框架_手把手教你写一个基于 RxJava 的扩展框架

    背景 现在 RxJava 在 Android 开发中可谓时炽手可热,其受欢迎程度不言而喻,也因此在 github 上出现了一系列的基于 RxJava 的框架,如 RxBinding.RxPermiss ...

  4. 从头搭建一个基于 Python 的在线聊天室

    本场 Chat,是基于 Python + Redis + Flask 来搭建一个简单易用的在线聊天室.完全从零开始,一步一步完成整个项目. 主要分享内容: Flask 项目结构 Python Redi ...

  5. 局域网通信 | 基于广播实现简易聊天室

    前言 事情是这个样子的,实验室的那个横向项目有一个需求:同一个 WIFI 下的设备之间可以实现实时的语音聊天. 于是这两天抽空闲时间捣鼓了一下局域网通信.现在基本实现语音通信了,是基于 UDP 广播实 ...

  6. 基于TCP的网络聊天室

    综合分析: 基于TCP的聊天室,支持多个用户同时登陆服务器进行聊天.(相当于群) socket编程,做一对多的通信,必然要用到多线程,保证多个客户端(并行)登陆服务器时同时进行聊天. 项目要求: 利用 ...

  7. QT学习:基于TCP的网络聊天室程序

    TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用 ...

  8. LinuxC TCP实现简易聊天室

    目录 1.概述 1.1聊天室设计内容 2.系统设计 2.1系统功能设计 2.1.1用户管理 2.1.2聊天室管理 2.1.3聊天管理 2.2系统数据结构设计 2.3系统主要函数设计 3.系统实现 3. ...

  9. 基于TCP网络通信的聊天室

    在实训中,利用简单的ETCP网络通信模式来扩展的聊天室,包括服务器启动关闭.登录.注册.聊天群发以及下线(带音效)等功能,还有连接了数据库JDBC的功能,同时对所有的界面进行美化,在登录,注册界面背景 ...

最新文章

  1. 漫画:程序员的社会地位
  2. 百度AI原生云实践: 基于容器云打造 AI 开发基础设施
  3. 十三水算法php_基于PHP+Redis令牌桶限流
  4. [react] 在react中怎样改变组件状态,以及状态改变的过程是什么?
  5. Hibernate的transaction嵌套
  6. R文件报错:cannot resolve symbol ‘R’
  7. Debian忘记密码修改
  8. VTK(一)---VTK简单示例
  9. SUSE Linux 网络配置
  10. 顶级赛事 | 2019 CCF BDCI,最值得参与的国际大数据及AI赛事之一
  11. 局域网内部分电脑报错“指定的网络名不再可用”疑难杂症解决
  12. 简化版WIN7安装打印机时提示“打印机无法安装,打印处理器不存在。”正确处理方法...
  13. ffmpeg安装之mac安装
  14. php 模拟蜘蛛,PHP实现使用CURL模拟百度蜘蛛进行采集
  15. WIndows编译MAME0.184
  16. Linux(centos或者redhat)下下载RPM包到指定目录但不安装
  17. Unity制作简单3D图表
  18. linux(ubuntu)查看硬件设备命令
  19. Android端一对一视频聊天系统功能实现方式
  20. c99、gnu99与c89

热门文章

  1. 好的福利体系应该如何设计?
  2. 【可解释】|ISCAM
  3. java 多选题_java+vue实现添加单选题、多选题到题库功能
  4. Google Guava 工具集__3__ Ordering犀利的比较器 Object方法
  5. 【Linux】gcc/g++、gdb的使用
  6. dropdownlist控件设置默认值_html.dropdownlist 设置默认值
  7. springboot房地产管理系统java客户预定楼盘房型房屋订单jsp源码mysql
  8. 抖音开放平台,究竟开放了什么?
  9. “梦诛”见面会现场视频 web@yfrb.net
  10. idata 数据访问组件库 (2021版)