由于还没有接触Python并发编程的知识,故这里的服务器单次只能和一个客户端交互,当断开当前客户端的连接后,其他客户端才可以与服务器交互,下面附上服务器和客户端的代码:
server.py:
import socket
server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立套接字
server_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置套接字选项使其可以重复使用
server_sock.bind(('127.0.0.1',8080)) #将套接字与本机地址绑定
server_sock.listen(5) #可挂起的客户端最大数量为5
print("starting...")
#收发消息
while True: #链接循环,一服务器对多客户端
conn, client = server_sock.accept() #conn为套接字对象,client包括客户端IP地址和端口号
while True: #通信循环
try:
data = conn.recv(1024) #最大可一次性接收1024字节的消息
if not data:
break #客户端断开连接时的处理,适用于Linux操作系统
print("客户端数据:", data.decode("utf-8")) #由于发送和接受的数据都是字节的形式,故接收端需解码一下
msg = input(">> ")
conn.send(msg.encode('utf-8')) #发送数据
except ConnectionResetError: #客户端断开连接时的处理,适用于Windows操作系统
break
conn.close() #关闭与该客户端的连接,继续接收其他客户端的连接请求
server_sock.close() #断开服务器连接
client.py:
import socket
client_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建客户端套接字
client_sock.connect(('127.0.0.1',8080)) #向服务器发送连接请求,参数为包含服务器IP地址和端口号的元组
#收发消息
while True:
msg = input(">> ").strip() #格式化,去掉输入信息中的空格
if not msg:
continue
client_sock.send(msg.encode('utf-8')) #发送消息并编码成utf-8格式
data = client_sock.recv(1024) #接收客户端发过来的消息
print(data.decode('utf-8')) #将客户端发过来的消息解码并输出
client_sock.close()
运行结果:
服务器端:
客户端: