python软件开发一个聊天软件,了解一下,最初的聊天实现方式,本次用到socket编程,及多线程技术,测试开发入门小玩意,没事玩一玩,还是可以的。
话不多说,直接上代码:
一、1V1聊天代码实现:
创建两个文件,sock_server.py和sock_client.py文件:
1.1 sock_server.py
import socket
# 创建socket对象
sk=socket.socket()
# 连接服务器ip及商品
sk.connect(('127.0.0.1',9999))
# 向服务器发送信息,需要先转换格式【encode('utf-8'))】,才能被服务器识别
sen_data=input('输入要发送的内容:')
sk.sendall(sen_data.encode('utf-8'))
# 接收来自服务器的信息,接收到信息并非是字节,所以需要解码才能被正常识别
ser_data=sk.recv(1024).decode('utf-8')
print('接收到的服务端数据:',ser_data)
# 断开连接
sk.close()
1.2 sock_client.py
import socket
# 定义服务器ip、端口
ip_ad=('127.0.0.1',9999)
# 创建socket对象
sk=socket.socket()
# 绑定ip端口
sk.bind(ip_ad)
# 开启监听
sk.listen()
print('服务器已经开启......')
# 等待接收客户端信息
conn,addr=sk.accept()
print('客户端地址:',addr)
# 等待接收客户端信息,接收到信息并非是字节格式,所以需要解码才能被正常识别【decode('utf-8')】
cli_data=conn.recv(1024).decode('utf-8')
print('接收到的客户端数据:',cli_data)
# 发送信息给客户端,发送的信息非字节格式,需要先转换格式【encode('utf-8'))】
sen_data=input('输入要发送的内容:')
conn.sendall(sen_data.encode('utf-8'))
# 断开连接
sk.close()
1.3 运行
1.3.1 初始状态
分别运行服务器和客户端代码:
服务器
客户端
1.3.2 客户端发送消息,服务器接收消息
客户端
服务器
1.3.3 服务器回复消息,客户端接收消息
服务器
客户端
一对一方式,发送一条消息,回复一条消息。enter键结束一条消息发送
二、多用户跟服务器聊天
分别创建三个文件:server.py、A_client.py、B_client.py
2.1 server.py
import socketserver
# 1. 继承一个类
class sqServer(socketserver.BaseRequestHandler):
def handle(self) -> None:
print('小可爱们,聊天服务器已上线......')
while True:
# 接收客户端数据
client_data=self.request.recv(1024)
print(client_data.decode('utf-8'))
# 发送消息给客户端
send_data=input('请输入内容:')
self.request.sendall(send_data.encode('utf-8'))
self.request.close()
# 2. 创建服务
server=socketserver.ThreadingTCPServer(('127.0.0.1',7777),sqServer)
# 3. 保持在线
server.serve_forever()
2.2 A_client.py
import socket
# 创建socket对象
sk=socket.socket()
# 连接服务器ip及商品
sk.connect(('127.0.0.1',7777))
while True:
# 向服务器发送信息,需要先转换格式【encode('utf-8'))】,才能被服务器识别
send_data='A: '+input('输入要发送的内容:')
sk.sendall(send_data.encode('utf-8'))
# 接收来自服务器的信息,接收到信息并非是字节,所以需要解码才能被正常识别
server_data=sk.recv(1024).decode('utf-8')
print('接收到的服务端数据:',server_data)
# 断开连接
sk.close()
2.3 B_client.py
import socket
# 创建socket对象
sk=socket.socket()
# 连接服务器ip及商品
sk.connect(('127.0.0.1',7777))
while True:
# 向服务器发送信息,需要先转换格式【encode('utf-8'))】,才能被服务器识别
send_data='B: '+input('输入要发送的内容:')
sk.sendall(send_data.encode('utf-8'))
# 接收来自服务器的信息,接收到信息并非是字节,所以需要解码才能被正常识别
server_data=sk.recv(1024).decode('utf-8')
print('接收到的服务端数据:',server_data)
# 断开连接
sk.close()
2.4 运行
分别运行三个文件,并且实现交互,查看最后结果:
2.4.1 初始状态
服务器:
A用户:
B用户:
2.4.2 A和B分别向服务器发送消息,服务器接收到消息
A用户
B用户:
服务器接收:
2.4.3 服务器回复消息,A和B收到消息
服务器回复
A收到的服务器消息
B收到的服务器消息
可以看到,多用户对服务器发起聊天,服务器会根据用户发送的时间先后,进行优先回复,并不需要指定A或B。而且,服务器回复完后,可以继续发送消息,此时,如果A先回复,则服务器刚发送的消息立即回复A。
可能有点绕,练下手,就知道了。