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()