day8--socketserver回顾

sockeserver主要实现多并发的情况,我们知道,socket只能一对一用户进行交互,如何实现一对多交互,socketserver就是用来解决这个问题的。

socketserver--共有这么几种类型:

TCPServer:TCPServer类别的,都是socket。

UDPServer:适用于UDP协议下。

1、class socketserver.TCPServer(server_address,RequestHandlerClass,bind_and_activate=True)

2、class socketserver.UDPServer(server_address,RequestHandlerClass,bind_and_activate=True)

3、calss sockstserver.UnixStreamServer(server_address,RequestHandlercalss,bind_and_activate=True)

4、class socketserver.UnixDatagramServer(server_address,RequestHandlerClass,bind_and_activate=True)

创建一个socketserver 至少分以下几步:

1、必须创建一个RequsetHandlerClass的类,而且必须重写父类里面handle()方法;

2、必须声明一个处理请求:

(1)server.handle_request()    只处理一个请求

(2)server.serve_forever()     处理多个请求,永远执行。

基本的socketserver代码

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

socketserver其实与socket一样,只是socketserver能够实现一对多的交互,下面来看一个简单实例:

    服务器端:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):    """    The request handler class for our server.

It is instantiated once per connection to the server, and must    override the handle() method to implement communication to the    client.    """

def handle(self):        # self.request is the TCP socket connected to the clientwhile True:            self.data = self.request.recv(1024).strip()            if len(self.data) == 0:                breakprint("{} wrote:".format(self.client_address[0]))            print(self.data)            print("地址:",self.client_address)            # just send back the same data, but upper-casedself.request.sendall(self.data.upper())

if __name__ == "__main__":    HOST, PORT = "0.0.0.0", 9994

# Create the server, binding to localhost on port 9999    #server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)                #socket方式,与socket一样,一对一server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)      #多线程方式进行一对多交互#server = socketserver.ForkingTCPServer((HOST,PORT),MyTCPHandler)         #多进程方式进行一对多交互

# Activate the server; this will keep running until you    # interrupt the program with Ctrl-Cserver.serve_forever()

socketserver的三种方式:

TCPServer:实现和socket一样的功能,也是一对一;

ThreadingTCPServer:多线程,一对多的形式;

ForKingTCPServer:多进程;一对多的形式,多并发。

    客户端:

import socket

class Myclient(object):
    def __init__(self):
        self.client = socket.socket()

    def connect(self,ip,port):
        self.client.connect((ip,port))

    def interactive(self):
        while True:
            mess = input(">>:").strip()
            if len(mess) == 0:
                print("不能发送空的数据")
                continue
            self.client.send(mess.encode("utf-8"))
            data = self.client.recv(1024).decode("utf-8")
            print(data)

if __name__ == "__main__":
    client = Myclient()
    client.connect("localhost",9999)
    client.interactive()

socketserver中,所有的功能都封装到了handle()方法里面,上面启动服务器之后,可以启动多个客户端,交流如下:

服务器端的交互情况:

127.0.0.1 wrote:
b‘asfda‘
地址: (‘127.0.0.1‘, 49256)
127.0.0.1 wrote:
b‘gagds‘
地址: (‘127.0.0.1‘, 49254)
127.0.0.1 wrote:
b‘\xe6\x88\x91\xe4\xbb\xac‘
地址: (‘127.0.0.1‘, 49254)
127.0.0.1 wrote:
b‘\xe9\x83\xbd\xe6\x98\xaf‘
地址: (‘127.0.0.1‘, 49254)
127.0.0.1 wrote:
b‘\xe5\xa5\xbd\xe5\x93\x88‘
地址: (‘127.0.0.1‘, 49254)
127.0.0.1 wrote:
b‘shibushi‘
地址: (‘127.0.0.1‘, 49252)
127.0.0.1 wrote:
b‘\xe6\x98\xaf\xe5\x91\x80\xef\xbc\x8c\xe9\x83\xbd\xe6\x98\xaf\xe4\xb8\x80\xe6\xa0\xb7‘
地址: (‘127.0.0.1‘, 49252)

可以看出,实现了多并发,连接了3个不同的端口。

self.client_address输出是:(‘127.0.0.1‘, 49252),可见,self.client_address是有IP和PORT(端口号)组成的。

socketserver的三种交互方式,刚才还忘记了,一定要知道,如何用socketserver实现多并发。

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):    """    The request handler class for our server.

It is instantiated once per connection to the server, and must    override the handle() method to implement communication to the    client.    """

def handle(self):        # self.request is the TCP socket connected to the clientwhile True:            self.data = self.request.recv(1024).strip()            print("{} wrote:".format(self.client_address[0]))            print(self.data)            print("地址:",self.client_address)            # just send back the same data, but upper-casedself.request.sendall(self.data.upper())

if __name__ == "__main__":    HOST, PORT = "localhost", 9999

# Create the server, binding to localhost on port 9999server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

# Activate the server; this will keep running until you    # interrupt the program with Ctrl-Cserver.serve_forever()
时间: 2024-10-30 05:27:56

day8--socketserver回顾的相关文章

python小白-day8 socketserver模块

SocketServer模块 SocketServer内部使用 IO多路复用 以及 "多线程" 和 "多进程" ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个"线程"或者"进程" 专门负责处理当前客户端的所有请求. ThreadingTCPServer ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 &

day8 socket socketserver 异常 断言

http://www.cnblogs.com/wupeiqi/articles/5040823.htmlsend http://www.cnblogs.com/alex3714/articles/5227251.html sendall不断调用send ,一次性发送过去,传大文件不合适 SocketServer  通过多线程的方式处理 部分代码 # _*_ coding:utf8 _*_ import socketserver class MyTCPHandler(socketserver.Ba

day8 java基础细节回顾

java之父--James Gosling java吉祥物--duke 编译: 源文件(.java文件)-->java编译器==>.class文件 运行:类装载器-->字节码校验器-->解释器(java跨平台)-->系统操作平台 JDK1.2<-->JAVA2.0 JDK1.5<-->JAVA5.0 三目运算符(隐式转换) eg: int a=1; System.out.println(true?'b':100); System.out.println

PYTHON学习笔记-DAY-8

Python之路,Day8 - Socket网络编程 本节内容 Socket介绍 Socket参数介绍 基本Socket实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 作业:开发一个支持多用户在线的FTP程序 1. Socket介绍 概念 A network socket is an endpoint of a connection across a computer network. Today, most communication betwe

【Python自动化运维之路Day10】网络篇之网络socketserver

课堂笔记: 上周回顾: socket: 1. 导入模块 2. 创建socket 3. send sendall, sendall本质上也是调用send 但是在内部做了一个while循环,拿到消息,循环发,知道消息完全发送 sendall: while True: 10 = send('adkflskjf023jlskdf') 10 = send('adkflskjf023jlskdf') ... send,一次不一定能完全发送 10 = send('adkflskjf023jlskdf') 所以

python之day10(socketserver)

Day10 上节回顾: socket            1 导入模块            2 创建socket            3                 字节                send    sendall                10字节 = send("alex123123deqasdsa")                sendall:        #会源源不断的发送完                    while True:  

Spring知识点回顾(01)

Spring知识点回顾(01) 一.依赖注入 1.声明Bean的注解 @Component @Service @Repository @Controller 2.注入Bean的注解 @Autowired @Inject @Resource 二.加载Bean 1.xml方式 - applicationcontext.xml : Beans, Bean, Component-Scan 2.注解方式 - @Configuration,@ComponentScan,@Bean 用@Configurati

Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾

Atitit.播放系统规划新版本 v4  q18  and 最近版本回顾 1 版本12 (ing)4 1.1 无映射nas系统..4 1.2 图片简介搜刮其4 1.3 12.8. 电影图片增加png,bmp等格式支持,目前只有jpg方式95 1.4 12.9. 电影简介增加utf8编码支持,目前只有gbk编码方式95 1.5 12.10. 路径item俩端过滤空格,增强对路径 的容错处理95 1.6 不同分店的分类配置分离5 1.7 问题自动反馈支持5 1.8 规划h5本地缓存系列 5 1.9 

程序员之路--回顾2015,展望2016

一.前言 回顾2015年,有太多的事情,从暑假末的来北京找工作,到家里兄弟的结婚,再到自己喜欢的人也来到北京找工作,,,有太多的需要来回忆,来记录.今天就在此刻(2016年1月3日下午10:17)来简单的对2015年的自己进行总结,然后规划一下2016年的奋斗目标. 二.先谈谈工作 从暑假结束快要结束的时候,看看原来写的随笔,也就是2015年8月22日,和同学一起踏上开往北京的火车.用了一个月的时间找到了一份自己还觉得不错的工作.找工作那一个月里面每天吃饭.看书.面试.睡觉.这里想对将要找工作的

待实验的socketserver

# -*- coding:utf-8 -*-# Author: Dennis Huang__Author__ = "Dennis" import socketserver class MyTCPHandler(socketserver.BaseRequestHandler) def handle(self): """ 所有请求在这里处理 """ self.data = self.request.recv(1024).strip