socketserver简单介绍

'''
socketserver:是对socket的封装,实现并发处理
前两个TCP,UDP常用,后两个不常用
'''
import socketserver socketserver.TCPServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # TCP协议
socketserver.UDPServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # UDP协议
socketserver.UnixStreamServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下tcp
socketserver.UnixDatagramServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下udp '''
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+ ''' '''
创建一个SocketServer分三步:
一、创建BaseRequestHandler的子类并重写handle()方法
二、实例化TCPServer(或其他三种),传递IP和上面创建的子类做为参数
三、server.handle_request() #处理一个请求,一般不用
server.serve_forever() # 处理多个请求
'''
'''
===============BaseServer的方法==============
fileno() 返回文件描述符
handle_request() 处理单个请求
serve_forever(poll_interval=0.5)
处理请求直到收到shutdown请求,每0.5秒检查一次是否发了shutdown
清理工作可以放在service_actions()里面
service_actions() shutdown之后的清理工作
shutdown() 停止
server_close() 关闭
allow_reuse_address()允许重用地址,看见过address already in use,
突然断开客户端没有断开,在socket上server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
timeout() handleRequest里面用的 self.setup() 请求进来前
try:
self.handle() 请求处理中
finally:
self.finish() 最后
'''

服务器:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
'''
跟客户端所有的交互都是在handle里完成的,每次请求都新建一个Handler实例
self.request 服务端收发数据的句柄
self.data 存放在实例里的数据
self.client_address[0] 客户端IP地址
'''
def handle(self):
while True:
try:
self.data = self.request.recv(1024).decode()
self.data = self.data.upper()
self.request.send(self.data.encode())
except ConnectionResetError as e:
print("连接断开",e)
break if __name__ == '__main__':
# server = socketserver.TCPServer(("127.0.0.1", 6969), MyTCPHandler) 跟之前的socket一样不支持并发
server = socketserver.ThreadingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多线程
# server = socketserver.ForkingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多进程,Linux里好使,Windows里不好使
server.serve_forever()

客户端:

import socket

client = socket.socket()
client.connect(("127.0.0.1",6969)) while True:
data = input(">>").strip()
client.send(data.encode())
data = client.recv(1024).decode()
print(data)

最新文章

  1. php周计划1
  2. 第2月第3天 egorefresh
  3. Innodb之拷贝InnoDB表从一服务器到另一台服务器
  4. 将查询字符串解析转换为泛型List的名值集合.
  5. 网络开始---多线程---NSThread-02-线程状态(了解)(三)
  6. 通过box盒子模型给元素内容设置居中
  7. onclick事件分析
  8. 锁_rac环境kill锁表会话后出现killed状态(解决)
  9. springboot+maven快速构建项目
  10. 将list转换为json失败
  11. which命令
  12. 商务智能(BI)技术
  13. cpu亲和力总结taskset和setcpu及其他相关
  14. iOS依据字符串计算UITextView高度
  15. Linux下mysql远程连接问题
  16. C#Npoi
  17. [Postman]排除API请求(9)
  18. idea中svn的使用教程
  19. lodash 学习资料
  20. 【转】iPhone易被窃听应用三分钟即可获取所有信息

热门文章

  1. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
  2. Java 多线程(一)—— 概念的引入
  3. influxdb使用说明
  4. Jenkins 集群搭建
  5. WebApi系列~对HttpClient的响应流进行解压
  6. JdbcTemplate的一次爬坑记录
  7. vnc server的安装
  8. eclipse 创建maven 项目 动态web工程完整示例
  9. Sql Server 查询外键对应的Table 的通用方法
  10. [PHP] 工厂模式的日常使用