服务端
import os
import sys
import struct
def socket_service_image():
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# s.connect(('服务器的ip',6666))
# 服务器和客户端在不同的系统或不同的主机下时使用的ip 和端口,首先要查看服务器所在的系统网卡的ip
s.bind(('192.168.10.126',8989))
#服务器和客户端都在一个系统下使用的ip和端口
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print('Wait for Connection...........................')
while True:
sock,addr = s.accept()
deal_image(sock,addr)
def deal_image(sock,addr):
print('Accept connection from {0}'.format(addr)) # 查看发送端的ip和端口
while True:
fileinfo_size = struct.calcsize('128sq')
buf = sock.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sq',buf)
fn = filename.decode().strip('\x00')
new_filename = os.path.join('./','new_'+fn)
# 在服务器端新建图片名 (可以不用新建的,直接用原来的也行,只要客
recvd_szie = 0
fp = open(new_filename,'wb')
while not recvd_szie == filesize:
if filesize - recvd_szie > 1024:
data = sock.recv(1024)
recvd_szie += len(data)
else:
data = sock.recv(1024)
recvd_szie = filesize
fp.write(data)
fp.close()
sock.close()
break
socket创建一个套接字:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
bind绑定端口号:
s.bind(('192.168.10.126',8989))
listen(10)监听连接最大接收10个链接
s.listen(10)
exit()异常退出
sys.exit(1)
accept()生成一个scoket
sock,addr = s.accept()
deal_image(sock,addr)
os.path.getsize获取文件大小
sock.sendall(filesize.to_bytes(8, 'big'))
read(1024)读取文件数据
data = fp.read(1024)
send(data)发送数据
s.send(data)
open(filepath,'rb')新建文件
open(filepath,'wb')
close()关闭套接字
s.close()
客户端:
import socket
import os
import sys
import struct
def sock_client_image():
while True:
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# s.connect(('服务器的ip',6666))# 服务器和客户端在不同的系统或不同的主机下时使用的ip 和端口,首先要查看服务器所在的系统网卡的ip
s.connect(('192.168.9.105',8989)) # 服务器和客户端都在一个系统下时使用的ip和端口
except socket.error as msg:
print(msg)
print(sys.exit(1))
filepath = input('input the file:') # 输入当前录下的图片名 xxx.jpg
fhead = struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding='utf-8'),
os.stat(filepath).st_size)# 将xxx.jpg以128sq的格式打包
s.send(fhead)
fp = open(filepath,'rb')# 打开要传输的图片
while True:
data = fp.read(1024)# 读入图片数据
if not data:
print('{0} send over...'.format(filepath))
break
s.send(data) # 以二进制的格式发送图片
s.close()
# break # 循环发送
if __name__ == '__main__':
sock_client_image()
fp = open(filepath,'rb')打开要发送的文件
fp = open(filepath,'rb')
read()读取文件
data = fp.read(1024)
s.send(data)以发送二进制形式发送
os.path.basename(filepath)获取文件名
os.path.basename(filepath)
os.stat(文件名).st_size获取文件大小
os.stat(filepath).st_size
struct.pack(b'128sq',encoding='utf-8')使用b'128sq'格式将文件名和文件打包为字符串
fhead = struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding='utf-8'),
os.stat(filepath).st_size)