SocketServer 模块

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值