标准类库 - 因特网协议与支持之socketserver

by:授客 QQ1033553122

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的更多相关文章

  1. Python 标准类库- 因特网协议于支持之UUID

    标准类库- 因特网协议于支持之UUID by:授客 QQ:1033553122   测试环境 python3 UUID生成函数定义 uuid.getnode() 获取一个表示硬件地址的48位正整数.第 ...

  2. python模块:网络协议和支持

    python模块:网络协议和支持 webbrowser 调用浏览器显示html文件 webbrowser.open('map.html') [webbrowser - Convenient Web-b ...

  3. Python 标准类库-Windows特殊服务之msvcrt

    标准类库-Windows特殊服务之msvcrt   by:授客 QQ:1033553122 广告:出售自研自动化小平台(无需编码也可用),有需要请联系 测试环境 win7 64位 Python 3.4 ...

  4. python 标准类库-数据类型之集合-容器数据类型

    标准类库-数据类型之集合-容器数据类型   by:授客 QQ:1033553122 Counter对象 例子 >>> from collections import Counter ...

  5. Python 标准类库-数据类型之copy-深拷贝浅拷贝操作

    标准类库-数据类型之copy-深拷贝浅拷贝操作   by:授客 QQ:1033553122 Python中赋值并不会拷贝对象,只是创建目标和对象的绑定关系. copy.copy(x) 返回x的浅拷贝 ...

  6. Python 标准类库-日期类型之datetime模块

    标准类库-日期类型之datetime模块    by:授客 QQ:1033553122 可用类型 3 实践出真知 4 timedelta对象 4 class datetime.timedelta(da ...

  7. python 标准类库-并行执行之subprocess-子进程管理

    标准类库-并行执行之subprocess-子进程管理 by:授客QQ:1033553122 1.使用subprocess模块 以下函数是调用子进程的推荐方法,所有使用场景它们都能处理.也可用Popen ...

  8. Python 标准类库-数字和数学模块之decimal使用简介

    标准类库-数字和数学模块之decimal使用简介 by:授客 QQ:1033553122 例子 >>>from decimal import * >>>getcon ...

  9. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

随机推荐

  1. Java:基于MD5的文件监听程序

    前述和需求说明 和之前写的 Python:基于MD5的文件监听程序 是同样的功能,就不啰嗦了,就是又写了一个java版本的,可以移步 python 版本去看一下,整个的核心思路是一样的.代码已上传Gi ...

  2. NumPy 超详细教程(3):ndarray 的内部机理及高级迭代

    系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 ndarray 对象的内部机理 ...

  3. WPF获取原始控件样式。

    要获取WPF控件的原始样式,需要我们安装Blend for Visual Studio. 然后,我们打开Blend for Visual Studio,创建一个WPF项目. 然后,我们向页面拖动一个B ...

  4. Spring Cloud Alibaba基础教程:Nacos的集群部署

    继续说说生产环境的Nacos搭建,通过上一篇<Spring Cloud Alibaba基础教程:Nacos的数据持久化>的介绍,我们已经知道Nacos对配置信息的存储原理,在集群搭建的时候 ...

  5. 工程实践:给函数取一个"好"的名字

    工程实践:给函数取一个"好"的名字 早在2013年,国外有个程序员做了一个有意思的投票统计(原始链接请见:<程序员:你认为最难做的事情是什么?>),该投票是让程序员从以 ...

  6. 万马齐喑究可哀-中文编程的又一波"讨论"

    刚申诉了自动折叠, 还是把回答转帖一下: 吴烜:假设中国人最先开发电脑和设计程序语言,那么各种程序语言会使用汉字吗? 这种有明显倾向性的问题怎么还有市场呢...不管谁先开发的电脑(就不论算盘之类是不是 ...

  7. NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes

    原文:http://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg 当我们使用k8s集群部署好应用的Service时,默认的Service类型是ClusterIP, ...

  8. String字符串创建与存储机制

    Java内存可以粗略的区分为堆内存(Heap)和栈内存(Stack),堆中存放的是对象实例,而栈中存放的则是方法调用过程中的局部变量或引用等. 在Java语言中,字符串的生命与初始化有如下两种方式: ...

  9. Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题

    [转载]原文地址:https://www.cnblogs.com/bjh1117/p/6605037.html 前提:本机已经安装了Oracle11g数据库. 需求:使用PL SQL数据库连接工具操作 ...

  10. selenium+谷歌无头浏览器爬取网易新闻国内板块

    网页分析 首先来看下要爬取的网站的页面 查看网页源代码:你会发现它是由js动态加载显示的 所以采用selenium+谷歌无头浏览器来爬取它 1 加载网站,并拖动到底,发现其还有个加载更多 2 模拟点击 ...