今天我们就制作一个python远程聊天工具。
我们要聊天要用软件,下载的聊天软件其实就是客户端。
如果要能聊天,还要有服务端才行。
服务端其实就是处理信息数据的中转站,客户端就是收发信息的那一端。
今天我们制作的python远程聊天工具也是这样,
只是运行前要保证客户端程序中的一个IP地址设为服务端的真实IP地址,
服务端程序中的IP地址也是要设成服务端那边的真实IP地址。
客户端代码:
import socket
import threading
HOST = '192.168.2.26' # 主机名,可以是IP地址
PORT = 65432 # 端口号,需与服务端相同
# 定义函数,用于接收并处理服务端发送的消息
def receive_msg(sock):
while True:
data = sock.recv(1024) # 一次最多读取1024字节数据
if not data:
break
msg = data.decode() # 将二进制数据转换为字符串
print(msg)
# 创建socket对象
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 建立连接
s.connect((HOST, PORT))
# 在主线程中循环读取控制台输入,并发送消息给服务端
while True:
msg = input() # 在控制台输入要发送的消息
s.sendall(msg.encode()) # 将消息转换为二进制数据,并发送给服务端
# 新建一个线程用于接收并处理服务端发送的消息
threading.Thread(target=receive_msg, args=(s,)).start()
服务端代码:
import socket
import threading
# 定义全局变量,用于保存客户端连接和昵称信息
connections = []
nicks = []
# 定义函数,用于接收并处理客户端消息
def handle_client(conn, addr):
with conn:
# 当有新连接加入时,提示其输入昵称
conn.sendall('请输入你的昵称:'.encode())
nickname = conn.recv(1024).decode()
print('客户端', addr, '设置昵称为', nickname)
# 将新昵称添加到全局列表中
nicks.append(nickname)
# 将新连接加入全局列表中
connections.append(conn)
# 循环监听客户端消息
while True:
try:
data = conn.recv(1024) # 一次最多读取1024字节数据
if not data:
break
msg = data.decode() # 将二进制数据转换为字符串
print(nickname, ':', msg)
# 循环向所有已连接的客户端发送消息
for c in connections:
if c != conn: # 不向消息来源客户端发送消息
c.sendall(('[' + nickname + ']: ' + msg).encode())
except Exception as e:
print('error:', e)
break
# 移除断开连接的昵称和套接字
connections.remove(conn)
nicks.remove(nickname)
print('客户端', addr, '已断开连接')
# 如果所有客户端都断开连接,就不再处理此线程,继续等待新的连接
if not connections:
print('等待新的连接...')
return
HOST = '192.168.2.26' # 主机名,可以是IP地址
PORT = 65432 # 端口号,建议使用1024以上的端口号
# 创建socket对象
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 绑定主机名和端口号
s.bind((HOST, PORT))
# 开始监听连接请求,一直循环下去
s.listen()
print('服务器已启动,等待客户端连接...')
# 接收连接请求,并创建新线程处理连接
while True:
try:
conn, addr = s.accept()
# 打印连接信息
print('客户端', addr, '已连接')
# 在新线程中处理客户端连接
threading.Thread(target=handle_client, args=(conn, addr)).start()
except Exception as e:
print('error:', e)