1 个 c 文件:200 行代码,实现聊天服务,编译亲测,真的好用

编译文件只有 ~18KB

前言

国人对于做一款聊天App,似乎情有独钟。毕竟,移动互联网时代,谁还没有几个好友,几个闲聊的群。我今天说的这个项目,名叫“smallchat”。

仓库

smallchat,上线 github 3天,揽获 4 千星赞。是广大开发者,对作者实力的认可。

带上注释,只有 300 行代码的项目,即使非C语言开发者,也能读懂作者的编码思路。

这是一个好仓库,也是一手好代码。

1,仓库地址:

https://github.com/antirez/smallchat

其实,名字叫做 “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 内容:

1
2
3
4
5
6
7
all: smallchat

smallchat: smallchat.c
	$(CC) smallchat.c -o smallchat -O2 -Wall -W -std=c99

clean:
	rm -f smallchat

拉取线上代码到本地,进入根目录后,在命令行运行:

1
make

编译通过后,当前目录下的二进制可执行文件 smallchat,就是聊天服务端。默认的端口监听在 7711。你也可以手动在源代码里修改:

1
2
#define MAX_CLIENTS 1000 // This is actually the higher file descriptor.
#define SERVER_PORT 7711

把常量 SERVER_PORT 修改为你希望的值即可。

关注公众号,后台回复【talk256】,获取仓库源码和编译文件。

6,测试

仓库代码使用的 system/socket.h,是基于 unix 系统的网络链接库。如果要移植到Windows,需要修改 win 平台下的实现。

上一节编译好的 smallchat 可执行文件,在命令行打开:

1
./smallchat

然后再打开两个终端。我们使用 nc 发送和监听报文:

1
nc 127.0.0.1 7711

使用快捷指令 /nick 设置自己的昵称。我开了四个对话框,分别编号 1-4,如下图:

clients

分别在4个对话框内,设置各自的昵称,然后发一段文字。可以看到,其他3个会话框,可以实时收取到文本。

在服务端,日志的输出如下图:

server side

最后

本文尝试编译了 smalltalk 的源码,并在 ubuntu 22.04 下,使用 netcat 工具作为客户端,连接到 smalltalk 服务端。

通讯使用的套接字编程,客户端支持的编码,都可以展示。我测试了中文、英文、特殊 ASCII 字符,都可以展示。emoji 等 unicode 字符,则没有测试。

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者。