`
xitongyunwei
  • 浏览: 930142 次
文章分类
社区版块
存档分类
最新评论

在python用socket传送文件

 
阅读更多

putget_server.py


#encoding=utf-8
import socket
import common
import sys
import thread
import threading

class connection:
def __init__(self, s):
self.socket = s
self.status = "Read"
self.data = ""
self.data_len = 0

def read_command(self):
buf = ""
while True:
data = self.socket.recv(1024)
buf += data
if buf.find("/r/n/r/n") != -1:
pos = buf.find("/r/n/r/n")
self.command = buf[:pos]
self.data += buf[pos+len("/r/n/r/n"):]
self.data_len = len(self.data)
return buf

def read_n_byte(self):
self.data = self.socket.recv(1024)
self.data_len = len(self.data)

def send_file(self, filename):
fd = open(filename,"rb")
fd.seek(0, 2)
flen = fd.tell()
fd.seek(0, 0)
self.socket.send("%d/r/n/r/n"%(flen))
rest = flen
while rest >0:
buf = fd.read(1024)
rest -= len(buf)
self.socket.send(buf)

def do_socket(s):
conn = connection(s)
buf = conn.read_command()
commands = conn.command.split()
if commands[0] == "get":
conn.send_file(commands[1])
conn.socket.close()
elif commands[0] == "put":
fd = open(commands[1], "wb")
n = (long)(commands[2])
n -= conn.data_len
fd.write(conn.data)
while n>0:
conn.read_n_byte()
n -= conn.data_len
fd.write(conn.data)
fd.close()

if __name__=='__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 9999))
sock.listen(5)
while True:
conn, addr = sock.accept()
print addr
try:
thread.start_new_thread(do_socket,(conn,))
#do_socket(conn)
except Exception,e:
print e

get.py


#encoding=utf-8
import socket
import sys

if __name__=='__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], (int)(sys.argv[2])))
filename = sys.argv[3]
buf = "get %s/r/n/r/n"%(filename)
sock.send(buf)
data = ""
while True:
data += sock.recv(1024)
if data.find("/r/n/r/n") != -1:
break
pos = data.find("/r/n/r/n")
length = (int)(data[:pos])
data = data[pos+4:]
fd = open(filename, "wb")
fd.write(data)
rest = length - len(data)
while rest>0:
data = sock.recv(1024)
fd.write(data)
rest -= len(data)
fd.close()
sock.close()

put.py


#encoding=utf-8
import socket
import sys

if __name__=='__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], (int)(sys.argv[2])))
filename = sys.argv[3]
fd = open(filename, "rb")
fd.seek(0,2)
length = fd.tell()
fd.seek(0,0)
buf = "put %s %d/r/n/r/n"%(filename,length)
sock.send(buf)
rest = length
while rest>0:
buf = fd.read(1024)
rest -= len(buf)
sock.send(buf)
sock.close()
http://bbs.superlinux.cn/viewthread.php?tid=2559&extra=page%3D1&frombbs=1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics