贴上参考大神连接:
1.https://segmentfault.com/a/1190000016324980
2.https://www.jianshu.com/p/2a4b859e05df
(下边每一标号的其实改动不大,只不过我每天做一点,加一点功能,所以分开发了)
1.小试牛刀,客户端向服务器发送文件(一台机器测试)
这个比较简单 路径都是在程序设好的 先运行服务器 再运行客户端就行了 而且每次收到的文件格式都要在服务端修改 ,比较low
#server
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
clientsocket,addr = s.accept()
print('Got connection from', addr)
msg='Thank you for connecting...'
clientsocket.send(msg.encode('utf-8'))
dataPath = './'+'time.jpg'
fp = open(dataPath,'wb')
fp.close()
while True:
data = clientsocket.recv(1024)
if not data:
break
with open(dataPath, 'ab') as f:
f.write(data)
print('recv finish')
clientsocket.close()
import socket
import os.path
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port))#连接主机和端口
msg = s.recv(1024)
print(msg.decode('utf-8'))
while True:
#filename =input('please input filePath_name:')
filename = r'D:\python\video_jpg_gif\time.jpg'
if os.path.exists(filename):
with open(filename,'rb') as f:
for data in f:
s.send(data)
else:
print('file not exist')
print('send finish')
s.close()
break
结果:
2.输入文件名(包含路径)(一台机器测试)
文件名输入之后 会自动提取文件名和格式,然后创建相同格式的文件
#server
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
clientsocket,addr = s.accept()
print('Got connection from', addr)
msg='Thank you for connecting...'
clientsocket.send(msg.encode('utf-8'))
filename = clientsocket.recv(1024).decode('utf-8')
print('filename is:',filename)
dataPath = './'+filename
fp = open(dataPath,'wb')
fp.close()
while True:
data = clientsocket.recv(1024)
if not data:
break
with open(dataPath, 'ab') as f:
f.write(data)
print('recv finish')
clientsocket.close()
import socket
import os.path
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port))#连接主机和端口
msg = s.recv(1024)
print(msg.decode('utf-8'))
filename =input('please input filePath_name:')
s.send(os.path.basename(filename).encode('utf-8'))
while True:
if os.path.exists(filename):
with open(filename,'rb') as f:
for data in f:
s.send(data)
else:
print('file not exist')
print('send finish')
s.close()
break
结果:
如果是在不同机器测试:
只需要改动三行:
#服务器
host = '192.168.191.2'
port = 9826
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
#客户端
host = '192.168.191.2'
port = 9826
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host, port))#连接主机和端口
3.服务器会一直开着,每次传输文件要运行一下客户端
#server
import socket
import threading
##host = '192.168.191.2'
##port = 9826
##s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s = socket.socket()
s.bind((socket.gethostname(), 9826))
s.listen(1)
while True:
clientsocket,addr = s.accept()
while True:
filename = clientsocket.recv(1024).decode('utf-8')
print('filename is:',filename)
dataPath = './'+filename
while True:
data = clientsocket.recv(1024)
if not data:
print('not data')
break
with open(dataPath, 'ab') as f:
f.write(data)
print('recv finish')
clientsocket.close()#关闭当前服务的客户端
break
#client
import socket
import os.path
##host = '192.168.191.2'
##port = 9826
##s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s = socket.socket()
s.connect((socket.gethostname(), 9826))#连接主机和端口
while True:
filename =input('please input filePath_name:')
s.send(os.path.basename(filename).encode('utf-8'))
while True:
if os.path.exists(filename):
with open(filename,'rb') as f:
for data in f:
s.send(data)
else:
print('file not exist')
print('send finish')
s.close()
break
4.把3做成了界面而已,不同电脑,wifi为中介
#server
import socket
import threading
host = '192.168.191.2'
port = 9826
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
print('server open')
while True:
clientsocket,addr = s.accept()
while True:
filename = clientsocket.recv(1024).decode('utf-8')
print('filename is:',filename)
dataPath = './'+filename
while True:
data = clientsocket.recv(1024)
if not data:
break
with open(dataPath, 'ab') as f:
f.write(data)
print('recv finish')
clientsocket.close()#关闭当前服务的客户端
break
import socket
import os.path
from tkinter import *
from tkinter.scrolledtext import ScrolledText
win = Tk() # 创建主窗口
win.title('文件传输工具')
host = '192.168.191.2'
port = 9826
var = StringVar()
def send_file():
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host, port))#连接主机和端口
filename =esend.get()
s.send(os.path.basename(filename).encode('utf-8'))
while True:
if os.path.exists(filename):
with open(filename,'rb') as f:
for data in f:
s.send(data)
else:
var.set('file not exist')
var.set('s')
var.set('send finish')
s.close()
break
#下边是界面部分
lab = Label(win,textvariable = var)
lab.pack(side=BOTTOM, expand=True, fill=BOTH)
Label(win, text="输入文件路径").pack(side = LEFT)
esend = Variable()
entrySend = Entry(win, textvariable=esend).pack(side=LEFT)
Button(win, text="发送", command=send_file).pack(side = LEFT)
win.mainloop()
结果:
用法嘛,懂点中文都会哈哈