`
yangsq
  • 浏览: 182134 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用python实现的简单Server/Client文件传输

阅读更多

还是那个题目(题目和流程见java版本),感觉光用java写一点新意也没有,恰巧刚学习了python,何不拿来一用,呵呵:

服务器端:

python 代码
  1. import SocketServertime  
  2.   
  3. class MyServer(SocketServer.BaseRequestHandler):   
  4.     userInfo = {   
  5.         'yangsq'    : 'yangsq',   
  6.         'hudeyong'  : 'hudeyong',   
  7.         'mudan'     : 'mudan' }   
  8.   
  9.     def handle(self):   
  10.         print 'Connected from', self.client_address   
  11.            
  12.         while True:   
  13.             receivedData = self.request.recv(8192)   
  14.             if not receivedData:   
  15.                 continue  
  16.                
  17.             elif receivedData == 'Hi, server':   
  18.                 self.request.sendall('hi, client')   
  19.                    
  20.             elif receivedData.startswith('name'):   
  21.                 self.clientName = receivedData.split(':')[-1]   
  22.                 if MyServer.userInfo.has_key(self.clientName):   
  23.                     self.request.sendall('valid')   
  24.                 else:   
  25.                     self.request.sendall('invalid')   
  26.                        
  27.             elif receivedData.startswith('pwd'):   
  28.                 self.clientPwd = receivedData.split(':')[-1]   
  29.                 if self.clientPwd == MyServer.userInfo[self.clientName]:   
  30.                     self.request.sendall('valid')   
  31.                     time.sleep(5)   
  32.   
  33.                     sfile = open('PyNet.pdf', 'rb')   
  34.                     while True:   
  35.                         data = sfile.read(1024)   
  36.                         if not data:   
  37.                             break  
  38.                         while len(data) > 0:   
  39.                             intSent = self.request.send(data)   
  40.                             data = data[intSent:]   
  41.   
  42.                     time.sleep(3)   
  43.                     self.request.sendall('EOF')   
  44.                 else:   
  45.                     self.request.sendall('invalid')   
  46.                        
  47.             elif receivedData == 'bye':   
  48.                 break  
  49.   
  50.         self.request.close()   
  51.            
  52.         print 'Disconnected from', self.client_address   
  53.         print  
  54.   
  55. if __name__ == '__main__':   
  56.     print 'Server is started\nwaiting for connection...\n'   
  57.     srv = SocketServer.ThreadingTCPServer(('localhost', 50000), MyServer)   
  58.     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文件传完了。

客户端:

python 代码
  1. import sockettime  
  2.   
  3. class MyClient:   
  4.   
  5.     def __init__(self):   
  6.         print 'Prepare for connecting...'   
  7.   
  8.     def connect(self):   
  9.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
  10.         sock.connect(('localhost', 50000))   
  11.   
  12.         sock.sendall('Hi, server')   
  13.         self.response = sock.recv(8192)   
  14.         print 'Server:', self.response   
  15.   
  16.         self.s = raw_input("Server: Do you want get the 'thinking in python' file?(y/n):")   
  17.         if self.s == 'y':   
  18.             while True:   
  19.                 self.name = raw_input('Server: input our name:')   
  20.                 sock.sendall('name:' + self.name.strip())   
  21.                 self.response = sock.recv(8192)   
  22.                 if self.response == 'valid':   
  23.                     break  
  24.                 else:   
  25.                     print 'Server: Invalid username'   
  26.   
  27.             while True:   
  28.                 self.pwd = raw_input('Server: input our password:')   
  29.                 sock.sendall('pwd:' + self.pwd.strip())   
  30.                 self.response = sock.recv(8192)   
  31.                 if self.response == 'valid':   
  32.                     print 'please wait...'   
  33.   
  34.                     f = open('b.pdf', 'wb')   
  35.                     while True:   
  36.                         data = sock.recv(1024)   
  37.                         if data == 'EOF':   
  38.                             break  
  39.                         f.write(data)   
  40.                            
  41.                     f.flush()   
  42.                     f.close()   
  43.   
  44.                     print 'download finished'   
  45.                     break  
  46.                 else:   
  47.                     print 'Server: Invalid password'   
  48.                    
  49.   
  50.         sock.sendall('bye')   
  51.         sock.close()   
  52.         print 'Disconnected'   
  53.   
  54. if __name__ == '__main__':   
  55.     client = MyClient()   
  56.     client.connect()   

line-34到line-41处理文件下载,client收到server的“EOF”信号后,就知道文件传完了。

最后需要说明一下python的文件,由于是内置类型,所以不想java那样有那么多的reader,writer,input,ouput啊。python中,在打开或建立一个文件时,主要是通过模式(mode)来区别的。

python的网络编程确实简单,因为它提供了各种功能的已经写好的类,直接继承就Ok了。

python还在学习中,上面的例子跑通是没问题,但写得肯定不够好,还得学习啊

分享到:
评论
3 楼 yangsq 2007-10-09  
Thanks, i've changed it
2 楼 mathgl 2007-10-08  
receivedData = self.request.recv(8192)   
            if not receivedData:   
                continue  

这里的 if not receiveData:
其实并不需要
如果你的socket是block的 在recv那里会一直等待(block)
直到有一些数据到达为止
1 楼 mathgl 2007-10-08  
我也写了几个类似的程序
是公司用来传输文件用的

基本上差不多 差别在于其中一个用 socket
另外一个用twisted罢了

相关推荐

    python和gsoap实现server/client模式,很好的资料

    根据给定文件的信息,我们可以提炼出以下关于使用Python与gSOAP实现Server/Client模式的关键知识点: ### Python ZSI 模块介绍 - **模块概述**:Python ZSI(Zolera System Inc.)是一个用于创建和操作Web服务的...

    远程控制编码server/client代码

    1. Server.py 或 Server.java:这是服务器端的代码,可能使用Python或Java编写,负责监听网络连接,处理client的请求,执行操作并回送结果。 2. Client.py 或 Client.java:客户端代码,用于发送命令并接收响应,...

    Python Socket实现简单TCP Server/client功能示例

    本文将详细介绍如何使用Python的Socket库来实现一个简单的TCP Server和Client,并结合实例代码进行分析。 #### 一、Socket基础知识 **1.1 Socket简介** - **定义**:Socket通常被称为“套接字”,它是网络通信的一...

    Python实现简单的HTTP服务器(GET/POST)

    本文将深入探讨如何使用Python实现一个简单的HTTP服务器,支持GET和POST请求。通过理解这个过程,你可以更好地理解网络通信的基本原理,以及Python在网络编程中的应用。 首先,让我们了解HTTP(超文本传输协议)的...

    Python实现基于HTTP文件传输实例

    因为需要最近看了一下通过POST请求传输文件的内容 并且自己写了Server和Client实现了一个简单的机遇HTTP的文件传输工具 二、实现代码: Server端: 复制代码 代码如下:#coding=utf-8 from BaseHTTPServer import ...

    python实现文件传输

    在这个项目中,我们利用Python的socket库来构建一个简单的文件传输系统,包括服务器端到客户端(Server-to-Client)和客户端到服务器(Client-to-Server)的文件传输。 首先,我们要理解socket库的基础概念。Socket...

    Python3 实现的HTTP服务端(server)和客户端(clients)通信

    这个文件很可能包含了使用Python内置的`http.server`模块创建一个简单的HTTP服务器的代码。`http.server`提供了一些基础类,如`BaseHTTPRequestHandler`和`HTTPServer`,它们可以被继承和扩展以处理HTTP请求。通常,...

    python 使用socket传输图片视频等文件的实现方式

    在Python中,使用socket模块实现文件传输是一个基础且实用的技能。本文将详细介绍在Python环境下,如何使用socket传输包括图片和视频在内的各种文件。文章内容涵盖了服务器端和客户端的代码实现,以及文件处理的相关...

    基于Python的网络传输文件功能的设计与实现.zip

    4. **FTP(File Transfer Protocol)**:虽然Python可以自定义实现文件传输,但也可以利用标准库`ftplib`来实现FTP协议,方便地上传和下载文件。FTP适合于需要权限验证和管理的场景。 5. **HTTP/HTTPS**:Python的`...

    OpenCV+TCP+server+client.zip

    在本项目中,"OpenCV+TCP+server+...总结来说,"OpenCV+TCP+server+client.zip"项目是一个结合了计算机视觉、网络编程和实时数据传输的实用示例,展示了如何使用Python和OpenCV构建一个简单的局域网视频监控系统。

    python实现ftp文件传输

    这次我使用的是socket实现client与ftp server之间的通讯和文件传输,client另起一个flask服务器,用于用户在浏览器端的交互。系统实现的功能有:用户登录注册,用户查看ftp服务器端文件和下载上传删除操作,支持多...

    SQL Server Native Client 10.0.zip

    在Django这样的Python Web框架中,如果需要连接到SQL Server 10.0,SQL Server Native Client可以作为一个必要的驱动来实现这一功能。Django通常通过Python的数据库API(如pymssql或pyodbc)与数据库进行交互,而...

    python 实现简单的FTP程序

    Python实现简单的FTP程序涉及到网络编程和文件操作,主要利用了Python的socketserver模块来构建一个基本的FTP服务器,以及socket库来处理网络通信。FTP协议是基于TCP/IP协议的,通常由命令通道和数据通道组成,用于...

    SQL Server Native Client 11-sqlncli-11驱动

    5. **安全性**:SQL Server Native Client 11包含了最新的安全特性,如集成Windows身份验证、加密连接、最小权限原则等,确保数据在传输和存储过程中的安全性。 6. **安装文件**:压缩包中的`sqlncli_11_x64.msi`是...

    基于python实现简单C/S模式代码实例

    在IT行业中,C/S(客户端/服务器)模式是一种常见的架构设计,它分为客户端(Client)和服务器端(Server)两部分。在这个模式中,客户端负责与用户交互,发送请求到服务器,而服务器则处理这些请求并返回结果。C/S...

    一个server端与多个client端通信python代码

    在Python编程中,实现服务器(Server)与多个客户端(Client)之间的通信是常见的网络编程任务。这个场景通常涉及网络协议,如TCP/IP或UDP,以及多线程或多进程技术来处理来自不同客户端的并发请求。在这个项目中,...

    利用python进行大文件的传输

    在给定的文件中,`socker_server.py`是服务器端代码,它主要负责读取YAML配置文件,获取文件信息,并通过Socket接口与客户端建立TCP连接,实现文件的发送。在Python中,可以使用内置的`socket`模块创建Socket对象,...

    PYTHON使用socket传输文件

    在Python编程中,`socket`模块是用于网络通信的基础接口,它可以实现客户端(client)与服务器端(server)之间的数据交换。在这个场景中,我们有`client.py`和`server.py`两个文件,分别代表了客户端和服务器端的...

    modbus通信的Python实现

    在Python中,我们可以使用各种库来实现Modbus通信,其中一个常见的库是`pyModbusTCP`,这也是压缩包文件`pyModbusTCP-master`所包含的内容。 在深入探讨Python实现Modbus TCP通信之前,我们先理解一下Modbus的基本...

Global site tag (gtag.js) - Google Analytics