SocketServer 模块是一个基于 socket 模块的高级别的套接字通讯模块,用于简化网络客户与服务器的实现,它支持使用多进程或多线程处理客户端请求。
“`
[root@localhost ~]# cat socketserver.py
!/usr/bin/env python
-- coding:utf-8 --
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler): # 定义一个类,并继承BaseRequestHandler这个类
def handle(self): # 重写handle方法,handle用来处理客户端请求
while True:
self.data = self.request.recv(1024).strip() 2.接收客户端请求
print(self.client_address[0])
print(self.data)
self.request.sendall(self.data.upper()) 3.发送客户端请求结果
if not self.data:
break
if name == “main“:
HOST, PORT = “localhost”, 1234
server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler) 1.创建一个TCP数据流的套接字(实现了多线程)
server.serve_forever() # 表示主进程不退出,如果主进程退出了,线程也就退出了,因此该方法相当于一直运行服务端来接收客户端请求,不退出
“`[root@localhost ~]# cat client.py
!/usr/bin/env python
-- coding: utf8 --
import time
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘127.0.0.1’, 1234))
while True:
s.sendall(‘Hello World’)
data = s.recv(1024)
print(data)
time.sleep(1)
s.close()
可以有多个客户端连接,服务端会多线程处理
使用 SocketServer 实现 FTP Server ,以便让多个客户端进行上传下载。
[root@localhost ~]# cat ftp_server.py
#!/usr/bin/env python
#!-*- coding:utf-8 -*-
import threading
import SocketServer
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
while True:
self.cmd = self.request.recv(1024).strip()
self.cmd_list = self.cmd.split()
if self.cmd_list:
if self.cmd_list[0] == 'get':
with open(self.cmd_list[1]) as fd:
while True:
self.data = fd.read(1024)
self.request.sendall(self.data)
if not self.data:
self.request.sendall('EOF')
break
if not self.cmd: break
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == "__main__":
HOST = ""
PORT = 1234
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
print "Server loop running in thread:", server_thread.name
server.serve_forever()
[root@localhost ~]# cat ftp_client.py
#!/usr/bin/env python
#!-*- coding:utf-8 -*-
import os
import tab
import time
import socket
HOST = '192.168.1.16'
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
cmd = raw_input("Please input cmd: ").strip()
if cmd.lower()== 'exit' or cmd.lower() == 'quit':
break
cmd_list = cmd.split()
if len(cmd_list) != 3:
print "Ex: get file1 file2"
continue
else:
s.sendall(cmd)
if not os.path.exists(cmd_list[2]):
dst_file = cmd_list[2]
else:
dst_file = cmd_list[2]+'.new'
n = 1
while True:
data_rev = s.recv(1024)
if data_rev.endswith('EOF'):
data = data_rev[:-3]
else:
data = data_rev
if n == 1:
with open(dst_file, 'wb') as fd:
fd.write(data)
print data
else:
with open(dst_file, 'a') as fd:
fd.write(data)
print data
n += 1
if data_rev[-3:] == 'EOF':
print "destination file is %s" % dst_file
break
s.close()