服務器 代碼,能夠兼容python2 和 python3python
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import socket, AF_INET, SOCK_STREAM服務器
class SimpleServer:
def startServer(self,port):
tcpSerSock=socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(("",port))
tcpSerSock.listen(5)
while True:
try:
print("server start! waiting connect...")
tcpCliSock,addr =tcpSerSock.accept()
print("from client " + addr[0])
while True:
filename_len = tcpCliSock.recv(1)
if not filename_len:
break
try:
filename_len = int(str(filename_len)) #python2
except:
filename_len = int(filename_len.decode()) #python3
filename = tcpCliSock.recv(filename_len).decode("utf8")
if(filename == "quit"):
tcpCliSock.close()
tcpSerSock.close()
return
with open(filename, 'wb') as f:
while True:
buf = tcpCliSock.recv(4096)
if not buf:
break
else:
f.write(buf)
print("recv ["+filename+"] ok!")
break
except:
pass
finally:
tcpCliSock.close()
tcpSerSock.close()socket
if __name__ == '__main__':
print("start server!")
s = SimpleServer()
s.startServer(1234)
print("end server!")tcp
==============================================================ui
客戶端 只在python3下試過 python應該是不行的code
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 發送格式爲 1字節的"文件名長度"+"文件名"+"二進制數據"
# 若是文件名是 quit 那就退出server
import os
from socket import socket, AF_INET, SOCK_STREAMutf-8
target = ('127.0.0.1',1234)get
class SimpleClient:
def setHost(self, host, port):
self.host = host
self.port = port
def __get_header (self,filename):
leng = len(filename) #文件名長度
assert leng<250
return str(leng) + filename #頭部 就是 「1字節的長度」+「文件名」
def send(self,filepath):
#生成文件頭
filename = os.path.basename(filepath)
header = self.__get_header(filename)
s = socket(AF_INET, SOCK_STREAM)
s.connect(target)
s.send((header).encode()) #先發送頭部
if(filepath == "quit"):
print("close server over!!!")
pass
else:
with open(filepath, 'rb') as f: #讀取數據發送
while True:
buf = f.read(4096)
if (len(buf)>0):
s.send(buf)
else:
break
print("send over!!!")
# result = s.recv(256).decode()
# print("result:"+result)
s.close()it
if __name__ == '__main__': c = SimpleClient() c.setHost("127.0.0.1", 1234) c.send("D:/testpy/data/a.jpg") # 發送文件 # c.send("quit") #退出服務器