Python3基础-socketserver实现并发

Python提供了两个基本的socket模块。一个是socket,它提供了标准的BSD Socket API;

另一个是socketServer就是对socket的再封装,它提供了服务器中心类,可以简化网络服务器的开发。

socketserver最主要的作用:就是实现一个并发处理

1、socketserver一共有这么几种类型:

1、TCP 协议
class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
2、UDP 协议
class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
3、Unix 本机之间进程的TCP、UDP (不常用)
class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)

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

首先,您必须创建一个请求处理类,继承BaseRequestHandlerclass类并且重写父类的handle()方法,该方法将处理传入的请求。
其次,你必须实例化一个上面类型中的一个类(如TCPServer)传递服务器的地址和你上面创建的请求处理类 给这个TCPServer。
然后,调用handle_request()或者serve_forever()方法来处理一个或多个请求。
ser.handle_request() # 只处理一个请求,处理完就退出了
ser.serve_forever() # 处理多个请求,永远执行。
最后,调用server_close()关闭socket。

3、socketserver服务器端和客户端代码

TCP socketserver使用

import  socketserver
ip_post = ('127.0.0.1',8898)

class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        print("conn is:",self.request) #conn   conn,addr = sock.accept()
        print("addr is:",self.request)  #addr  conn,addr = sock.accept()

        while True:
            try:
                #收消息
                data = self.request.recv(1024)
                print('收到客户端的消息是',data)

                #发消息
                self.request.sendall(data.lower())
            except Exception as e:
                print(e)
                break

if __name__ == '__main__':
    s=socketserver.ThreadingTCPServer(ip_post,Myserver) #创建了一个线程的TCP服务器类,也就是通过多线程来进行应答客户端
    s.serve_forever()
服务端
from socket import *
import  struct
from  functools import  partial

ip_port = ('127.0.0.1', 8898)
buffer_size =1024

tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect(ip_port)

while True:
    cmd = input('请输入字母>>>').strip()
    if not cmd: continue
    if cmd == 'quit': break
    tcp_client.send(cmd.encode('utf-8'))

    data =tcp_client.recv(buffer_size)

    print('收到服务端返回的结果', data.decode('gbk'))

tcp_client.close()
客户端

UDP  socketserver使用

# UDP socketserver使用
import socketserver

# 这个请求类要继承BaseRequestHandler,并且还有重写父类里的handle()
class MyUdpServer(socketserver.BaseRequestHandler):

    def handle(self):
        #接收数据
        data,sock = self.request
        print(data)
        sock.sendto(data.upper(), self.client_address)


if __name__ == '__main__':
    server = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyUdpServer)
    server.serve_forever()
服务端
import socket
ip_post =('127.0.0.1',8080)
udp_ck = socket.socket(type=socket.SOCK_DGRAM)
while True:
    msg = input('请输入字母>>>').strip()
    udp_ck.sendto(msg.encode('utf-8'),ip_post)
    back_msg,addr = udp_ck.recvfrom(1024)
    print(back_msg.decode('utf-8'),addr)
客户端

 

 

 

posted @ 2020-04-27 18:31  槑槑DE  阅读(385)  评论(0)    收藏  举报