Python 标准类库 - 因特网协议与支持之socketserver
标准类库 - 因特网协议与支持之socketserver
by:授客 QQ:1033553122
socketserver 模块,简化网络服务编写任务。
创建服务的步骤
1  通过子类化BaseRequestHandler 类,创建一个请求处理程序,并且重写handle()方法,该方法将处理接收到的请求
2 传递服务器地址和请求处理程序类参数,实例化server类(如TCPServer)
3 调用server对象的handle_request()、serve_forever()方法,处理单个、多个请求
实例
socketserver.TCPServer
服务端(单线程服务器)
#!/usr/bin/env python 3.4.0
#-*- encoding:utf-8 -*-
__author__ = 'shouke'
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    供server使用的RequestHandler类.
    每个客户端连接连接到服务器时都会被初始化一次,并且必须重写handle()方法以便同客户端交流。
    """
    def handle(self):
        while True:
            # self.request即为与客户端连接的TCP socker
            self.data = self.request.recv(1024).decode('utf-8').strip()
            print('receive data from client[host:%s port:%s]:%s' % (self.client_address[0], self.client_address[1], self.data))
            if self.data == 'bye':
                self.request.sendall(bytes('bye', encoding='utf-8'))
                self.request.close()
                break
            else:
                self.request.sendall(self.data.upper().encode('utf-8'))
if __name__ == '__main__':
    # 创建TCPSocket服务器,绑定到10.118.52.26地址上,端口8000
    server = socketserver.TCPServer(('10.118.52.26', 8000), MyTCPHandler)
# 激活服务器,让服务器一直运行,直到按Ctrl+C
    server.serve_forever()
客户端
#!/usr/bin/env python 3.4.0
#-*- encoding:utf-8 -*-
__author__ = 'shouke'
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    供server使用的RequestHandler类.
    每个客户端连接连接到服务器时都会被初始化一次,并且必须重写handle()方法以便同客户端交流。
    """
    def handle(self):
        while True:
            # self.request即为与客户端连接的TCP socker
            self.data = self.request.recv(1024).decode('utf-8').strip()
            print('receive data from client[host:%s port:%s]:%s' % (self.client_address[0], self.client_address[1], self.data))
            if self.data == 'bye':
                self.request.sendall(bytes('bye', encoding='utf-8'))
                self.request.close()
                break
            else:
                self.request.sendall(self.data.upper().encode('utf-8'))
if __name__ == '__main__':
    # 创建TCPSocket服务器,绑定到10.118.52.26地址上,端口8000
    server = socketserver.TCPServer(('10.118.52.26', 8000), MyTCPHandler)
# 激活服务器,让服务器一直运行,直到按Ctrl+C
    server.serve_forever()
运行结果

函数说明:
BaseServer.serve_forever(poll_interval=0.5)
处理shudown请求除外的请求。
有关socket说明
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
使用给定的地址家族,socket 类型,协议号创建一个新的socket。
family:默认为AF_INET,其它可选值有AF_INET6, AF_UNIX, AF_CAN or AF_RDS
type:默认为SOCK_STREAM,其它可选值有 SOCK_DGRAM, SOCK_RAW ,或者其它SOCK_XXX常量
protocol:通常为0或者忽略,当family为AF_CAN时,为CAN_RAW、CAN_BCM
Socket 对象
socket.close()
标记socket为closed
close()释放与连接关联的资源,但不一定立即关闭连接。如果要及时关闭连接,请在调用close()之前调用shutdown()。
socket.connect(address)
连接给定地址的远程socket
socket.recv(bufsize[, flags])
从socket接收数据。返回值即为接收的数据。
buffsize:每次接收的最大数据量。.
flags默认为0
注意:为了同硬件和网络设备最佳匹配,buffsize应该为一个相对小的2次幂,比如4096
socket.sendall(bytes[, flags])
发送字节数据到socket。不同于send方法,该方法会持续发送bytes参数给定的数据,直到所有数据被发送、错误发生。如果发送成功,则返回None,否则抛出异常。没有方法判断到底成功发送了多少数据
socket.send(bytes[, flags])
发送字节数据到socket。返回发送字节数,如果只传输了部分数据,程序会尝试发送剩余数据。
更多资料参考官方文档,socket模块
服务端(多线程服务器)
#!/usr/bin/env python 3.4.0
#-*- encoding:utf-8 -*-
__author__ = 'shouke'
import socket
import time
if __name__ == '__main__':
    if_sock_connected = False
    try:
        # 创建一个socket (SOCK_STREAM 表示为TCP socket)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
        sock.connect(('10.118.52.26', 8000))
# 发送数据
        if_sock_connected = True
        i = 0
        while i < 100:
            if i == 6:
                sock.sendall(bytes('bye\n', "utf-8"))
            else:
                sock.sendall(bytes('hello world with tcp\n', "utf-8"))
                print("sent data to server:{}".format(bytes('hello world with tcp\n', "utf-8")))
            # 从服务器接收数据
            received = str(sock.recv(1024), "utf-8")
            print('receive data from server:%s' % received)
            if received == 'bye':
                break
            time.sleep(1)
            i += 1
    except Exception as e:
        print('程序运行出错:%s' % e)
    finally:
        if if_sock_connected:
            sock.close()
运行结果

更多资料,烦参考官方文档,socketserver模块。
Python 标准类库 - 因特网协议与支持之socketserver的更多相关文章
- Python 标准类库- 因特网协议于支持之UUID
		
标准类库- 因特网协议于支持之UUID by:授客 QQ:1033553122 测试环境 python3 UUID生成函数定义 uuid.getnode() 获取一个表示硬件地址的48位正整数.第 ...
 - python模块:网络协议和支持
		
python模块:网络协议和支持 webbrowser 调用浏览器显示html文件 webbrowser.open('map.html') [webbrowser - Convenient Web-b ...
 - Python 标准类库-Windows特殊服务之msvcrt
		
标准类库-Windows特殊服务之msvcrt by:授客 QQ:1033553122 广告:出售自研自动化小平台(无需编码也可用),有需要请联系 测试环境 win7 64位 Python 3.4 ...
 - python 标准类库-数据类型之集合-容器数据类型
		
标准类库-数据类型之集合-容器数据类型 by:授客 QQ:1033553122 Counter对象 例子 >>> from collections import Counter ...
 - Python 标准类库-数据类型之copy-深拷贝浅拷贝操作
		
标准类库-数据类型之copy-深拷贝浅拷贝操作 by:授客 QQ:1033553122 Python中赋值并不会拷贝对象,只是创建目标和对象的绑定关系. copy.copy(x) 返回x的浅拷贝 ...
 - Python 标准类库-日期类型之datetime模块
		
标准类库-日期类型之datetime模块 by:授客 QQ:1033553122 可用类型 3 实践出真知 4 timedelta对象 4 class datetime.timedelta(da ...
 - python 标准类库-并行执行之subprocess-子进程管理
		
标准类库-并行执行之subprocess-子进程管理 by:授客QQ:1033553122 1.使用subprocess模块 以下函数是调用子进程的推荐方法,所有使用场景它们都能处理.也可用Popen ...
 - Python 标准类库-数字和数学模块之decimal使用简介
		
标准类库-数字和数学模块之decimal使用简介 by:授客 QQ:1033553122 例子 >>>from decimal import * >>>getcon ...
 - python第六天  函数  python标准库实例大全
		
今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...
 
随机推荐
- 整合X-Admin前端框架改造ABP
			
“站在巨人的肩膀上”,这样一来,不要万事亲恭,在值得的方向上节约时间,毕竟人生就这么一次.在接触ABP以来,一直想花点时间整合LayUI前端框架到ABP中,进而能够逐渐打磨出一套适合自己的框架,开发习 ...
 - Springboot文件上传代码笔记
			
1.在src下创建filter包,包内Class名UploadFilter package com.gd.filter; import org.apache.catalina.servlet4prev ...
 - Service Fabric service 根据环境变量读取配置文件
			
前言 一个服务或者产品,往往需要三个环境:一个开发环境(Development),一个测试环境(Staging),一个生产环境(Production), 这就不可避免的需要多个配置文件来匹配相应的环境 ...
 - 解决 Vue 动态生成 el-checkbox 点击无法赋值问题
			
博客地址:https://ainyi.com/68 最近遇到一个问题,在一个页面需要动态渲染页面内的表单,其中包括 checkbox 表单类型,并且使用 Element 组件 UI 时,此时 v-mo ...
 - MVC设计模式思想及简单实现
			
一.什么是MVC MVC即Model-View-Controller(模型-视图-控制器)是一种软件设计模式,最早出现在Smalltalk语言中,后被Sun公司推荐为Java EE平台的设计模式. M ...
 - Nodejs实现用户注册
			
1创建连接池对象 2导出连接池对象 /** * 1.引入mysql模块 * 2.创建连接池对象 * 3.导出连接池对象 */ const mysql = require('mysql'); var p ...
 - 什么是移动BI
			
移动商务智能(移动商务智能或移动智能)定义为一个包含技术和组织元素的系统,可向用户提供历史和/或实时信息,以便在智能手机和平板电脑等移动设备上进行分析笔记本电脑),以实现有效的决策和管理支持,以提高公 ...
 - 如何购买并配置linux服务器上的数据库
			
首先百度搜索阿里云 如果是学生可以学生认证 然后注册账号->个人认证->学生认证 然后你会发现 服务器一年只要114,114你买不了上当,买不了吃亏,买下面的ECS服务器,系统可以选择wi ...
 - Socket深度探索 4 PHP(转)
			
[连载] Socket 深度探索 4 PHP (一) [连载] Socket 深度探究 4 PHP (二) [连载] Socket 深度探究 4 PHP (三)
 - 20171201 - macOS High Sierra 神级 bug
			
昨日亲测有效,macOS High Sierra 神级 bug,系统管理员 root 密码为空,输入就可以登录,具备最高权限. 让人不禁想象 Apple Software 怎么了,人才都流失了吗?