python3 socketserver实操备忘

server端

#!/usr/bin/env python3
# 创建多线程socketserver,ThreadingTCPServer
'''
1.ThreadingTCPServer的父类:ThreadingMixIn(执行多线程类), TCPServer(创建socket对象,并绑定ip、端口)
2.TCPServer的父类是BaseServer
3.serve_forever是BaseServer里的方法
4.socketserver重点5个类:BaseServer、TCPServer 、UDPServer 、 UnixStreamServer、UnixDatagramServer。
5.ThreadingTCPServer为TCPServer的多线程类。
6.ThreadingUDPServer为UDPServer的多线程类。
7.自定义类名的传递和调用:MyServer--__init__(TCPServer)---__init__(BaseServer)---赋值给类变量RequestHandlerClass
  调用server(ThreadingTCPServer的实例).serve_forever()(BaseServer)时---_handle_request_noblock()(BaseServer)----process_request(ThreadingMixIn)----process_request_thread(ThreadingMixIn)----finish_request(BaseServer)------
  self.RequestHandlerClass()--自定义的类----__init__(BaseRequestHandler)---调用handle
'''
import socketserver


class MyServer(socketserver.BaseRequestHandler):  # 新创建类,父类必须是socketserver.BaseRequestHandler
    def handle(self):       # 此方法必须是handle(socketserver源码里定义),覆盖父类的handle方法,所有的逻辑代码在此执行
        print("服务器启动中。。。。")
        while True:
            # 相当于socket.accept()
            conn = self.request     # 等待连接。。。waiting....被动接受TCP客户的连接,(阻塞式)等待连接的到来
            # print(self.client_address)
            while True:
                try:
                    data = conn.recv(1024)  # recv不允许接收空数据。当断开链接时,data = "",接收数据中。。。waiting
                except Exception as e:      # 获取数据失败-出错时,断开连接
                    break
                if not data:
                    conn.close()
                    print("正常连接关闭!")
                    break
                print(str(data,"utf-8"))
                inp = input(">>>")
                conn.send(bytes(inp,"utf-8"))            
                  
        
if __name__ == "__main__":
    server = socketserver.ThreadingTCPServer(("127.0.0.1", 8000),MyServer)  # 创建一个ThreadingTCPServer类的实例对象。
    # ip及端口是在ThreadingTCPServer的父类TCPServer建立socket对象,并绑定ip及启动端口监听(默认监听数量:5)
    server.serve_forever()  #   启动,调用自定义类MyServer里的handle方法
 
'''
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    # 创建通道:套接字
address = ("127.0.0.1",8000)
sk.bind(address)    # 设置服务器ip地址及端口:绑定(主机,端口号)到套接字,元组
sk.listen(2)    # 设置最大排队人数
'''

client端:

#!/usr/bin/env python3
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
address = ("127.0.0.1",8000)
sk.connect(address)
while True:
    inp = input(">>>")
    if inp == "exit":
        break
    sk.send(bytes(inp,"utf-8"))
    data = sk.recv(1024)
    print(str(data,"utf-8"))
else:
    sk.close()

posted @ 2019-01-12 15:50  挖坑达人  阅读(3)  评论(0编辑  收藏  举报