Python Socket TCP中文自动回复聊天程序实现与常见坑点解析
本文提供基于Python Socket和TCP协议的客户端与服务端中文自动回复聊天程序完整代码。重点解析了运行中常见的错误,如客户端误用bind而非connect,以及收发数据时必须进行编码解码以支持中文。代码经Windows 7与Python 3.4环境实测有效,适合网络编程初学者参考。
本示例展示了如何利用Python的Socket库结合TCP协议,实现一个支持中文自动回复的客户端与服务端聊天功能。内容旨在为读者提供实用的代码参考与调试思路。
【吐槽】
网络上许多代码示例看似严谨,实际运行却常出现错误。部分爱好者习惯直接复制粘贴收藏代码,却很少验证其可运行性,导致使用者踩坑。
【正文】
此前曾尝试运行基于UDP协议的C/S聊天程序并成功修改,但在处理TCP协议时却屡屡受挫。经过多次尝试与排查,发现了不少问题。
经过以下关键修改后,程序得以正常运行:
1、对发送和接收的数据分别进行编码和解码操作; 2、将客户端代码第10行的bind()方法改为connect()(这是极易出错的关键点)。
本示例基于Windows 7操作系统及Python 3.4版本环境开发。
以下是完整代码,经本人亲自测试确认无误:
服务器端代码:
# tcp_server.py
'''服务器'''
from socket import *
from time import ctime
HOST = '' #主机地址
PORT = 23345 #端口号
BUFSIZ = 2048 #缓存区大小,单位是字节,这里设定了2K的缓冲区
ADDR = (HOST, PORT) #链接地址
tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建一个TCP套接字
tcpSerSock.bind(ADDR) #绑定地址
tcpSerSock.listen(5) #最大连接数为5
while True: #无限循环
print('尝试连接客户端。。。')
tcpCliSock, addr = tcpSerSock.accept() #等待接受连接
print('链接成功,客户端地址为:', addr)
while True:
data = tcpCliSock.recv(BUFSIZ) #接收数据,BUFSIZ是缓存区大小
if not data: break #如果data为空,则跳出循环
print(data.decode())
msg = '{} 服务器已接收 [自动回复]'.format(ctime())
tcpCliSock.send(msg.encode())
tcpCliSock.close() #关闭连接
tcpSerSock.close() #关闭服务器
客户端代码:
# tcp_client.py
'''客户端'''
from socket import *
from time import ctime
HOST = 'localhost' #主机地址
PORT = 23345 #端口号
BUFSIZ = 2048 #缓存区大小,单位是字节,这里设定了2K的缓冲区
ADDR = (HOST, PORT) #链接地址
tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建一个TCP套接字
#tcpCliSock.bind(ADDR) #绑定地址
tcpCliSock.connect(ADDR) #绑定地址
while True:
msg = input('请输入:') #输入数据
if not msg: break #如果 msg 为空,则跳出循环
tcpCliSock.send(msg.encode())
data = tcpCliSock.recv(BUFSIZ) #接收数据,BUFSIZ是缓存区大小
if not data: break #如果data为空,则跳出循环
print(data.decode())
【运行截图】
实验步骤:首先启动服务器端程序,随后运行客户端程序。

启动后,即可在客户端界面自由输入文字,与服务器端进行实时聊天交互:

如需了解更多Python相关知识,可参考本站系列教程:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python文件与目录操作技巧汇总》。
希望本文提供的代码与解析能对您的Python程序设计学习有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









