有四个基本的具体服务器类:

class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
    这使用Internet TCP协议,它在客户端和服务器之间提供连续的数据流。如果bind_and_activate为true,构造函数将自动尝试调用server_bind()和server_activate()。其他参数传递到BaseServer基类。

class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
  这使用数据报,其是可能在运输中不按顺序到达或丢失的信息的离散分组。参数与TCPServer相同。

class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True)
    这些更常用的类与TCP和UDP类类似,但使用Unix域套接字;它们在非Unix平台上不可用。参数与TCPServer相同。

socket 网络编程【实现FTP文件上传和下载】

示例:使用SocketServer网络服务框架实现FTP文件上传和下载功能

服务端:

 1 # !/usr/bin/python
 2 # -*- coding:utf-8 -*-
 3 '''
 4 _author_=Captain
 5 '''
 6 import SocketServer
 7 import os
 8 
 9 class Myserver(SocketServer.BaseRequestHandler):
10     def handle(self):
11         base_path="D:\\temp"    #文件保存路径
12         conn=self.request
13         client_address=self.client_address
14         print "客户端:"+str(client_address)+"connected..."
15         conn.send("服务端已准备接收...")
16         while True:
17             pre_data1,pre_data2=conn.recv(1024).split('|')
18             if pre_data1=='put':  #如果客户端是要上传文件
19                 file_name,file_size=pre_data2.split('-')  #对客户端传递过来的文件名和文件大小两个值分割开
20                 recv_size=0
21                 file_dir=os.path.join(base_path,file_name)   #生成文件保存的路径
22                 with open(file_dir,'wb') as f:
23                     Flag = True
24                     while Flag:
25                         if int(file_size)>recv_size:
26                             data = conn.recv(1024)
27                             recv_size += len(data)
28                             f.write(data)
29                         else:
30                             recv_size = 0
31                             Flag = False
32                             conn.send("upload successed")
33 
34             elif pre_data1 == 'get':   #如果客户端是要下载文件
35                 file_size = os.stat(pre_data2).st_size
36                 file_path,file_name = os.path.split(pre_data2)
37                 conn.send(file_name + '|' + str(file_size))  #将文件名和计算出的文件大小发给客户端
38                 send_size = 0
39                 with open(pre_data2, 'rb') as f:
40                     Flag = True
41                     while Flag:
42                         if send_size + 1024 > file_size:   #如果文件大小不是1024的倍数,即最后的数据
43                             data = f.read(file_size - send_size)
44                             Flag = False
45                         else:
46                             data = f.read(1024)
47                             send_size += 1024
48                         conn.send(data)
49 
50 
51 if __name__ == '__main__':
52     instance = SocketServer.ThreadingTCPServer(('127.0.0.1',8866), Myserver)  #使用异步多进程
53     instance.serve_forever()
View Code

相关文章: