数码知识屋
霓虹主题四 · 更硬核的阅读氛围

网络通信socket编程入门:从零开始写一个简单的聊天程序

发布时间:2025-12-15 22:39:47 阅读:3 次

什么是Socket?

你有没有想过,两个手机之间是怎么发消息的?比如你在微信上给朋友发了一句‘吃饭了吗’,这条消息是怎么跨过网络,准确送到对方手机上的?其实背后有个叫Socket的东西在默默工作。

简单来说,Socket就是网络通信的入口。它像是一对电话机,一端拨号,另一端接听,双方通过这个通道传递信息。在编程里,我们用Socket来实现不同设备之间的数据交换。

Socket的工作原理

想象你要打电话给朋友。第一步是拿起电话拨号,相当于客户端发起连接;第二步是朋友那边电话响了,他接起来,这就像服务端监听并接受连接。等两边都准备好了,就能开始说话——也就是传输数据。

在网络中,每个程序都有自己的“门牌号”,叫做端口号。比如你访问网页,浏览器其实是连到服务器的80端口。而Socket就是靠IP地址+端口号来定位通信目标的。

写一个最简单的服务端

我们用Python来写个例子,让它更接地气。先做一个能接收消息的服务端:

import socket

# 创建一个TCP/IP协议的Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('localhost', 65432)
server_socket.bind(server_address)

# 开始监听,最多允许5个等待连接
server_socket.listen(5)
print('等待客户端连接...')

# 等待客户端连接
client_socket, client_address = server_socket.accept()
print(f'客户端 {client_address} 已连接')

# 接收数据
data = client_socket.recv(1024)
print(f'收到消息:{data.decode()}')

# 回复一句
client_socket.sendall(b'你好,已收到!')

# 关闭连接
client_socket.close()
server_socket.close()

再写一个对应的客户端

光有服务端不行,还得有个主动发起对话的客户端:

import socket

# 创建Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端
server_address = ('localhost', 65432)
client_socket.connect(server_address)

# 发送消息
client_socket.sendall(b'你好,我是客户端')

# 接收回复
response = client_socket.recv(1024)
print(f'收到回复:{response.decode()}')

# 关闭连接
client_socket.close()

把这两个文件保存好,先运行服务端,再运行客户端,你就会看到两边都打印出了对方的消息。就像两个人真的在打电话一样。

为什么选择TCP?

上面的例子用了TCP协议,因为它靠谱。就像寄挂号信,每封信都要确认签收。如果中途丢了,系统会自动重发。适合聊天、文件传输这类不能丢数据的场景。

当然还有UDP,像是发广播,不保证对方一定收到,但速度快。适合视频直播、在线游戏这种对实时性要求高、偶尔丢包也能接受的情况。

常见问题和调试技巧

初学者常遇到“地址已被使用”的错误。那是因为程序没完全退出,端口还占着。可以改个端口号,或者加一行代码让Socket允许重用地址:

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

另一个问题是recv返回空数据。这通常意味着对方已经关闭连接。记得做好判断,别直接decode空值,会报错。

调试时可以用netstat命令查看哪些端口正在被使用。Windows上是netstat -an,Linux和macOS也类似。找到对应端口,就知道服务有没有真正跑起来。

下一步可以怎么玩

现在你已经有了基础通信能力。接下来可以试试让服务端支持多个客户端同时连接,用多线程或select模型处理并发。也可以加个循环,让聊天持续进行,而不是发一次就断开。

再进一步,可以自己定义消息格式,比如前面加个长度,后面跟内容,避免粘包问题。甚至可以模仿HTTP,搞个简单的请求响应协议。

别觉得这些离你很远。你现在写的每一行Socket代码,都是微信、QQ、网页加载背后的基本单元。从最简单的recv和send开始,慢慢就能拼出完整的网络应用。