想实现一下两个电脑之间图片传输,同时建立一个局域网网站,可以在网络访问图片信息。
硬件配置:
>一台Linux电脑(发送端)
>一台window电脑(接受端)
>一部手机(当路由器用)
-
WiFi连接
两台电脑都连上手机的wifi,通过ifconfig(linux),ipconfig(window),查看两个电脑的IP地址IP_linux, IP_windows。 -
windows开启IIS服务
window端建立局域网网站服务,具体操作参考的是b站的一个10分钟视频
具体配置一下就行,然后再浏览器打开就可以看到对应文件夹的图片, -
socket 通信
server端代码:
import socket
import os
import sys
import struct
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('192.168.43.238', 6666))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print("Wait")
while True:
sock, addr = s.accept()
deal_data(sock, addr)
# break
# s.close()
def deal_data(sock, addr):
print("Accept connection from {0}".format(addr))
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')
print(fn)
print(filesize)
new_filename = 'F:\\DrinkLover\\' + fn
recvd_size = 0
fp = open(new_filename, 'wb')
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = sock.recv(1024)
recvd_size += len(data)
else:
data = sock.recv(1024)
recvd_size = filesize
fp.write(data)
fp.close()
sock.close()
break
if __name__ == '__main__':
socket_service()
client端代码:
'''
Fuction:客户端发送图片和数据
Date:2018.9.8
Author:snowking
'''
###客户端client.py
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(('192.168.43.40', 6666)) # 服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip
# s.connect(('192.168.43.40', 6666)) #服务器和客户端都在一个系统下时使用的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()
这样就好了。