在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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值