前言
国人对于做一款聊天App,似乎情有独钟。毕竟,移动互联网时代,谁还没有几个好友,几个闲聊的群。我今天说的这个项目,名叫“smallchat”。
仓库
smallchat,上线 github 3天,揽获 4 千星赞。是广大开发者,对作者实力的认可。
带上注释,只有 300 行代码的项目,即使非C语言开发者,也能读懂作者的编码思路。
这是一个好仓库,也是一手好代码。
1,仓库地址:
其实,名字叫做 “smallchat”,已经很“大”了。应该叫“tinychat”,微型聊天服务。
2,仓库由来
作者周末,跟几个前端朋友闲聊,回忆了 IRC 的旧时光。
翻看过去代码,一个 TCL实现的,竟然有 18 年了。时光荏苒如此。
慢慢地,他们讨论能不能实现一个最小的、最简单的、不考虑太多的聊天服务。作者于是用 C 写出来了。
客户端不讲究,用 telnet、nc,直接连接。接收消息,广播给其他客户端。
3,实现的功能
- 多客户端连接: 允许多个客户端连接到服务器。可以使用 telenet、nc(netcat)通过 IP + port 直连。
- 消息广播: 从一个客户端接收消息,同时广播到其他全部客户端。
- 命令支持: 实现了一个简单的命令,允许客户端设置昵称。
4,技术原理
4.1 socket 套接字
使用 C 语言编写的基于 sockets 的网络编程。
使用了基本的系统调用和网络库,如:
- sys/socket.h
- netinet/in.h
- unistd.h
4.2 并发链接
使用了 select() 函数来管理多个并发连接。基于 TCP 协议进行通信。
5,编译
由于代码是用 C 标准库实现的,没有其他依赖。有C编译器,就可以编译出来。
我在Windows中,使用子系统 Ubuntu 22.04,编译出的结果。首先看 Makefile 内容:
|
|
拉取线上代码到本地,进入根目录后,在命令行运行:
|
|
编译通过后,当前目录下的二进制可执行文件 smallchat
,就是聊天服务端。默认的端口监听在 7711
。你也可以手动在源代码里修改:
|
|
把常量 SERVER_PORT 修改为你希望的值即可。
关注公众号,后台回复【talk256】,获取仓库源码和编译文件。
6,测试
仓库代码使用的 system/socket.h
,是基于 unix 系统的网络链接库。如果要移植到Windows,需要修改 win 平台下的实现。
上一节编译好的 smallchat
可执行文件,在命令行打开:
|
|
然后再打开两个终端。我们使用 nc
发送和监听报文:
|
|
使用快捷指令 /nick
设置自己的昵称。我开了四个对话框,分别编号 1-4,如下图:
分别在4个对话框内,设置各自的昵称,然后发一段文字。可以看到,其他3个会话框,可以实时收取到文本。
在服务端,日志的输出如下图:
最后
本文尝试编译了 smalltalk 的源码,并在 ubuntu 22.04 下,使用 netcat 工具作为客户端,连接到 smalltalk 服务端。
通讯使用的套接字编程,客户端支持的编码,都可以展示。我测试了中文、英文、特殊 ASCII 字符,都可以展示。emoji 等 unicode 字符,则没有测试。
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者。