天天看點

python socket程式設計_初試python的socket程式設計--ftp

server端:

#_*_coding:utf-8_*_

import SocketServer

import os

import commands

class MyTCPHandler(SocketServer.BaseRequestHandler):

def handle(self):

while True:

instruction = self.request.recv(1024).strip() #接收用戶端指令

if not instruction:break

instruction = instruction.split('|')

if hasattr(self,instruction[0]):

func = getattr(self,instruction[0])

func(instruction)

def FileTransfer(self,msg):

print '----filetransfer---',msg

if msg[1] == 'get':

print "clients wants to download file:",msg[2]

if os.path.isfile(msg[2]):

file_size = os.path.getsize(msg[2])

res = "ready|%s" % file_size

else:

res = "file doesn't exist"

print 'res=====',res

self.send_confirmation = "FileTransfer|get|%s" %res

self.request.send(self.send_confirmation)

feedback = self.request.recv(100)

if feedback == 'FileTransfer|get|recv_ready':

f = file(msg[2],'rb')

send_size = 0

while not file_size == send_size:

if file_size - send_size > 1024:

data = f.read(1024)

send_size += 1024

else:

data = f.read(file_size - send_size)

send_size += (file_size - send_size)

self.request.send(data)

print file_size,send_size

elif msg[1] == 'put':

pass

def ls(self,msg):

print msg

cmd_result = commands.getstatusoutput(msg[0])

self.request.sendall(cmd_result[1])

if __name__ == '__main__':

HOST,PORT = "",9002

server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)

server.serve_forever()

client端:

#_*_coding:utf-8_*_

import socket

import os

class FtpClient(object):

def __init__(self,host,port):

self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.sock.connect((host,port))

def start(self):

self.interactive()

def interactive(self):

while True:

user_input = raw_input(">>:").strip()

if len(user_input) == 0:continue

user_input = user_input.split()

if hasattr(self,user_input[0]):

func = getattr(self,user_input[0])

func(user_input)

else:

print "wrong command usage"

def get(self,msg):

print '--get func---',msg

if len(msg) == 2:

file_name = msg[1]

instruction = "FileTransfer|get|%s" % file_name

print 'instruction====',instruction

self.sock.send(instruction)

feedback = self.sock.recv(100)

print '--->',feedback

if feedback.startswith("FileTransfer|get|ready"):

file_size = int(feedback.split("|")[-1])

self.sock.send("FileTransfer|get|recv_ready") #告訴伺服器端已經準備好了接收

recv_size = 0

f = file('client_recv/%s' % os.path.basename(file_name),'wb')

print '---->',file_name

while not file_size == recv_size:

if file_size - recv_size > 1024:

data = self.sock.recv(1024)

recv_size += len(data)

else:

data = self.sock.recv(file_size - recv_size)

recv_size += (file_size - recv_size)

f.write(data)

print file_size,recv_size

else:

print '---recv file:%s---' % file_name

f.close()

else:

print feedback

else:

print "wrong command usage!"

def ls(self,msg):

if len(msg) == 1:

self.sock.send(msg[0])

result = self.sock.recv(1024)

print result

if __name__ == '__main__':

f = FtpClient('localhost',9002)

f.start()