client code
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@File :client2.0.py
@IDE :PyCharm
@Author :杰的烂笔头
@Date :2023/7/15 16:35
"""
import os
import struct
from socket import *
from threading import Thread
def deal_image(sock):
while True:
# 接收服务端发送过来的数据,
fileinfo_size = struct.calcsize('128sq')
but = sock.recv(fileinfo_size)
if but:
# 解析为图片名和图片内容
filename, filesize = struct.unpack('128sq', but)
# 解析文件名,并取出图片名的前后空格和0
fn = filename.decode().strip("\x00")
# 重新命名图片名
new_filename = os.path.join('./', 'client_' + fn)
# 定义一个空变量,用来接图片内容
recvd_size = 0
# 写入二进制内容
fp = open(new_filename, 'wb')
# 如果图片内容和变量内容不相等
while not recvd_size == filesize:
# 图片内容长度减去变量长度如果大于1024字节
if filesize - recvd_size > 1024:
# 接收字节内容赋值data
data = sock.recv(1024)
# 写入空变量
recvd_size += len(data)
else:
# 接收字节内容赋值data
data = sock.recv(1024)
# 把剩余的图片内容直接赋值给变量
recvd_size = filesize
# 写入图片内容
fp.write(data)
print("----------")
# 关闭写入
fp.close()
# 关闭套接字
sock.close()
break
def send_data():
while True:
# 要向服务端发送的数据
msg = input(">")
# 向服务端发送数据并加密
client_socket.send(msg.encode('gbk'))
if msg == 'end':
print("结束发送")
break
deal_image(client_socket)
if __name__ == '__main__':
# 创建套接字
client_socket = socket(AF_INET, SOCK_STREAM)
# 连接的地址和端口
client_socket.connect(("172.20.10.3", 8888))
# 创建多线程,并指定线程函数,并传递参数
t2 = Thread(target=send_data)
# 启动线程,并执行目标线程函数
t2.start()
# 使主线程执行完,继续进行下一次循环
t2.join()
# 关闭套接字
client_socket.close()
Server code
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@File :server2.0.py
@IDE :PyCharm
@Author :杰的烂笔头
@Date :2023/7/15 16:35
"""
import os
import struct
from threading import Thread
from socket import *
def recv_data(client_socket, client_info):
while True:
# 接收客户端传递的数据
recv_data = client_socket.recv(1024)
if not recv_data:
print("客户端已断开连接")
break
# 把数据进行解码
recv_connent = recv_data.decode("gbk")
print(f"客户端:{recv_connent},来自:{client_info}")
# 如果数据为图片
if recv_connent == "图片":
# 给一个当前目录的图片路径
file_image = "0824de2cade4c0288bb040a262737d9.jpg"
fhead = struct.pack(b'128sq', bytes(os.path.basename(file_image), encoding="utf-8"),
os.stat(file_image).st_size)
# 向客户端发送图片名
client_socket.send(fhead)
# 读取二进制数据
fp = open(file_image, 'rb')
while True:
# 读取并赋值data
data = fp.read(1024)
if not data:
print("{0} send over....".format(file_image))
break
# 向客户端发送图片数据
client_socket.send(data)
# 如果客户端发送的数据为end
elif recv_connent == "end":
# 向客户端发送end并加密,表示结束
client_socket.send("end".encode("gbk"))
print("断开连接")
break
else:
client_socket.send("你好,我是菜狗!".encode('gbk'))
def handler(server_socket):
while True:
# 接收客户端发送过来的数据
# 内容 客户端地址
client_socket, client_info = server_socket.accept()
# 创建多线程并指定线程函数给函数传参
t1 = Thread(target=recv_data, args=(client_socket, client_info))
# 启动线程,并执行目标函数
t1.start()
# 使主线程执行完,继续进行下一次循环
t1.join()
if __name__ == '__main__':
# 创建套接字
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定地址端口
server_socket.bind(("172.20.10.3", 8888))
# 设置最大连接次数
server_socket.listen(5)
print("等待连接")
handler(server_socket)
# 关闭连接
server_socket.close()