您好,欢迎访问一九零五行业门户网

Python实现的简单文件传输服务器和客户端

还是那个题目(题目和流程见java版本),感觉光用java写一点新意也没有,恰巧刚学习了python,何不拿来一用,呵呵:
服务器端:
import socketserver, time class myserver(socketserver.baserequesthandler): userinfo = { 'yangsq' : 'yangsq', 'hudeyong' : 'hudeyong', 'mudan' : 'mudan' } def handle(self): print 'connected from', self.client_address while true: receiveddata = self.request.recv(8192) if not receiveddata: continue elif receiveddata == 'hi, server': self.request.sendall('hi, client') elif receiveddata.startswith('name'): self.clientname = receiveddata.split(':')[-1] if myserver.userinfo.has_key(self.clientname): self.request.sendall('valid') else: self.request.sendall('invalid') elif receiveddata.startswith('pwd'): self.clientpwd = receiveddata.split(':')[-1] if self.clientpwd == myserver.userinfo[self.clientname]: self.request.sendall('valid') time.sleep(5) sfile = open('pynet.pdf', 'rb') while true: data = sfile.read(1024) if not data: break while len(data) > 0: intsent = self.request.send(data) data = data[intsent:] time.sleep(3) self.request.sendall('eof') else: self.request.sendall('invalid') elif receiveddata == 'bye': break self.request.close() print 'disconnected from', self.client_address print if __name__ == '__main__': print 'server is started\nwaiting for connection...\n' srv = socketserver.threadingtcpserver(('localhost', 50000), myserver) srv.serve_forever()
说明:
line-55到line-58的作用就相当于java中某个类里面的main函数,即一个类的入口。
python中socketserver module里提供了好多实用的现成的类,baserequesthandler就是一个,它的作用是为每一个请求fork一个线程,只要继承它,就有这个能力了,哈哈,真是美事。
当然,我们继承了baserequesthandler,就是override它的handle方法,就像java中继承了thread后要实现run方法一样。实际上这个handle方法的内容和我们的java版本的run函数实现的完全一样。
line-30到line-43就是处理文件下载的主要内容了。看着都挺眼熟的呵:)
这里在文件发送完后发了一个“eof”,告诉client文件传完了。
客户端:
import socket, time class myclient: def __init__(self): print 'prepare for connecting...' def connect(self): sock = socket.socket(socket.af_inet, socket.sock_stream) sock.connect(('localhost', 50000)) sock.sendall('hi, server') self.response = sock.recv(8192) print 'server:', self.response self.s = raw_input(server: do you want get the 'thinking in python' file?(y/n):) if self.s == 'y': while true: self.name = raw_input('server: input our name:') sock.sendall('name:' + self.name.strip()) self.response = sock.recv(8192) if self.response == 'valid': break else: print 'server: invalid username' while true: self.pwd = raw_input('server: input our password:') sock.sendall('pwd:' + self.pwd.strip()) self.response = sock.recv(8192) if self.response == 'valid': print 'please wait...' f = open('b.pdf', 'wb') while true: data = sock.recv(1024) if data == 'eof': break f.write(data) f.flush() f.close() print 'download finished' break else: print 'server: invalid password' sock.sendall('bye') sock.close() print 'disconnected' if __name__ == '__main__': client = myclient() client.connect()
line-34到line-41处理文件下载,client收到server的“eof”信号后,就知道文件传完了。
最后需要说明一下python的文件,由于是内置类型,所以不想java那样有那么多的reader,writer,input,ouput啊。python中,在打开或建立一个文件时,主要是通过模式(mode)来区别的。
python的网络编程确实简单,因为它提供了各种功能的已经写好的类,直接继承就ok了。
python还在学习中,上面的例子跑通是没问题,但写得肯定不够好,还得学习啊
其它类似信息

推荐信息