Linux Python可传输图片的聊天室
时间: 2024-03-18 19:42:37 浏览: 190
要在 Linux 上使用 Python 构建一个可以传输图片的聊天室,你可以在上面的代码基础上进行修改。以下是一个简单的示例代码:
服务端代码:
```python
import socket
import threading
# 客户端处理函数
def handle_client(client_socket, client_address):
while True:
try:
# 接收客户端消息
message = client_socket.recv(1024).decode("utf-8")
if message:
if message == "image":
# 接收图片
image_data = b''
while True:
data = client_socket.recv(1024)
if not data:
break
image_data += data
# 将图片发送给所有客户端
broadcast_image(image_data, client_address)
else:
# 将消息发送给所有客户端
broadcast_message(message, client_address)
else:
remove_client(client_socket)
break
except:
remove_client(client_socket)
break
# 将消息广播给所有客户端
def broadcast_message(message, sender_address):
for client in clients:
if client != sender_address:
client.sendall(message.encode("utf-8"))
# 将图片广播给所有客户端
def broadcast_image(image_data, sender_address):
for client in clients:
if client != sender_address:
client.sendall(b"image")
client.sendall(image_data)
# 移除客户端
def remove_client(client_socket):
if client_socket in clients:
clients.remove(client_socket)
client_socket.close()
# 服务器主函数
def server():
# 创建服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口和 IP
server_socket.bind(("0.0.0.0", 8000))
# 开始监听
server_socket.listen(5)
while True:
# 接收客户端连接
client_socket, client_address = server_socket.accept()
# 添加客户端到列表中
clients.append(client_socket)
# 创建新线程处理客户端请求
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()
if __name__ == "__main__":
# 客户端列表
clients = []
# 创建服务器线程
server_thread = threading.Thread(target=server)
server_thread.start()
```
客户端代码:
```python
import socket
import threading
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
# 创建客户端 socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(("127.0.0.1", 8000))
# 客户端处理函数
def handle_client():
while True:
try:
# 接收服务器消息
message = client_socket.recv(1024).decode("utf-8")
if message == "image":
# 接收图片
image_data = b''
while True:
data = client_socket.recv(1024)
if not data:
break
image_data += data
# 显示图片
show_image(image_data)
else:
# 显示消息
show_message(message)
except:
break
# 显示消息
def show_message(message):
message_listbox.insert(tk.END, message)
# 显示图片
def show_image(image_data):
# 将字节数据转换成图片
image = Image.open(io.BytesIO(image_data))
# 缩放图片
image.thumbnail((300, 300))
# 将图片显示在画布上
image_tk = ImageTk.PhotoImage(image)
image_canvas.create_image((150, 150), image=image_tk)
# 保留图片的引用,否则图片不会显示
image_canvas.image_tk = image_tk
# 选择图片
def select_image():
# 显示文件选择对话框
file_path = filedialog.askopenfilename()
if file_path:
# 打开图片文件
with open(file_path, "rb") as f:
# 读取图片数据
image_data = f.read()
# 发送图片给服务器
client_socket.sendall(b"image")
client_socket.sendall(image_data)
# 发送消息
def send_message():
# 获取消息
message = message_entry.get()
if message:
# 发送消息给服务器
client_socket.sendall(message.encode("utf-8"))
# 清空消息输入框
message_entry.delete(0, tk.END)
# 创建 GUI 窗口
root = tk.Tk()
root.title("图片聊天室")
root.geometry("500x500")
# 创建消息列表框
message_listbox = tk.Listbox(root, width=50, height=20)
message_listbox.pack(pady=10)
# 创建图片画布
image_canvas = tk.Canvas(root, width=300, height=300, bg="white")
image_canvas.pack()
# 创建选择图片按钮
image_button = tk.Button(root, text="选择图片", command=select_image)
image_button.pack(pady=10)
# 创建消息输入框和发送按钮
message_frame = tk.Frame(root)
message_frame.pack(pady=10)
message_entry = tk.Entry(message_frame, width=40)
message_entry.pack(side=tk.LEFT)
send_button = tk.Button(message_frame, text="发送", command=send_message)
send_button.pack(side=tk.LEFT, padx=10)
# 创建客户端线程
client_thread = threading.Thread(target=handle_client)
client_thread.start()
# 启动 GUI 窗口
root.mainloop()
```
在这个示例代码中,客户端使用 Tkinter 库构建了一个简单的 GUI 窗口,并提供了选择图片、发送消息等功能。当用户选择发送图片时,客户端会将图片数据发送给服务器,服务器再将图片数据广播给所有客户端。当客户端收到服务器发送的图片数据时,会将图片显示在画布上。你可以根据自己的需要修改代码并添加更多功能。
阅读全文