网络编程socketserver
一、网络编程回顾
tcp是流式传输,字节流,数据与数据之间没有边界
优点:不限定长度,可靠传输
缺点:慢,和一端的通信连接conn会一直占用通信资源
udp协议式面向数据包的传输
优点:快,由于不需要建立连接,哪一端发送消息都能收到
缺点:不能传输过长的数据,不可靠
黏包现象:
由于tcp协议流式传输的特点,产生了数据连续发送的黏包现象
在一个链接建立起来的连接上传输的多余数据是没有边界的
数据的发送和接收实际上不是执行send/recv的时候就立即被发送或者接收,而是经过操作系统内核。
NAGLE算法能够将发送间隔时间很近的短数据合成一个包发送到接收端
拆包机制:当要发送的数据超过网络上能传输的最大长度,就会被tcp协议强制拆包
解决黏包问题(连续两次send):
如果是短数据,告诉接收端的边界即可
如果是长数据,不仅告诉接收端的边界,还需保证接收端完整地接收
二、其他方法及参数
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据,会自动拆分发送
s.sendall() 发送TCP数据
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
其他参数:
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
type = SOCK_STREAM (默认TCP协议)
family = AF_INET (默认网络通信)
AF_INET6 (基于ipv6)
AF_UNIX (基于本地通过文件通信)
fileno = None 指定了fileno,其他参数都无效,基于文件操作
三、验证客户端连接的合法性 —— 增强连接的安全性
实现原理:server端生成一个随机的字符串,发送到client端,通过处理随机字符串获得一个结果,接收到client端处理的结果,对比成功继续通信,否则就关闭连接
# server端
import socket
import hmac
import os sk = socket.socket()
sk.bind(('127.0.0.1',8899))
sk.listen()
#
conn,addr = sk.accept()
code = os.urandom(32) # 生成32位bytes类型的随机字节码
conn.send(code) # 给接收端发送验证码
key = b'abc' # 定义bytes类型的盐
ret = hmac.new(key,code) # 通过加密算法将随机字节码转为密文,接收的参数都是bytes类型
result = ret.digest() # 通过digest获取结果 client_digest = conn.recv(1024) # 获得client端加密后的结果
if result == client_digest: # 对比结果是否一致
print('合法的连接')
conn.send('开始对话'.encode('utf-8'))
else:
print('不合法的连接')
conn.close()
# client客户端
import socket
import hmac sk = socket.socket()
sk.connect_ex(('127.0.0.1',8899))
code = sk.recv(32)
key = b'abc'
ret = hmac.new(key,code)
sk.send(ret.digest()) print(str(sk.recv(1024),'utf-8'))
四、socketserver模块
socket是socketserver的底层模块,socketserver在socket的基础上做了进一步的封装
基于tcp协议的server不需要导入socket,直接导入socketserver即可
socketserver必须使用面向对象编程
# server端
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
conn.send(b'hello')
print(str(conn.recv(1024),'utf-8')) socketserver.TCPServer.allow_reuse_address = True # # 设置allow_reuse_address允许服务器重用地址
server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver) # 创建一个server的服务
server.serve_forever() # 让server永远运行下去,除非强制停止程序
# client端
import socket
sk = socket.socket() sk.connect_ex(('127.0.0.1',9000))
print(str(sk.recv(1024),'utf-8'))
sk.send('goodbye'.encode('utf-8'))
sk.close()
网络编程socketserver的更多相关文章
- Socket网络编程-SocketServer
Socket网络编程-SocketServer 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SocketServer概述 socket编程过于底层,编程虽然有套路,但是想要写 ...
- python网络编程——SocketServer/Twisted/paramiko模块
在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...
- 网络编程-socketserver
网络编程使用socketserver,通常包括以下几步:一.定义类,并继承socketserver.BaseRequestHandler 二.重写handle方法 三.实例化TCPServer,并传递 ...
- python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- 38 - 网络编程-socketserver
目录 1 socket编程弊端 2 SocketServer模块 2.1 服务器类 2.2 Mixin类 2.3 RequestHandlerClass是啥 2.4 编程接口 3 实现EchoServ ...
- python基础(15)-socket网络编程&socketserver
socket 参数及方法说明 初始化参数 sk = socket.socket(参数1,参数2,参数3) 参数1:地址簇 socket.AF_INET IPv4(默认) socket.AF_INET6 ...
- 【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类 ...
- python网络编程-socketserver
一:socketserver简化了网络服务器的编写. 它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer. 这4个类是同步进行处 ...
- python网络编程--socketserver 和 ftp功能简单说明
1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...
随机推荐
- 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)
数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...
- 修改ecshop的70种技巧
1.如何修改网站”欢迎惠临本店”答复(dafu):languages\zh_cn\common.php文件中,$_LANG['welcome']=’欢迎惠临本店’:将他修改成你需要的字样. 2.如何修 ...
- 什么时候该用readfile() , fread(), file_get_contents(), fgets()?
fread() 和 readfile() fread() 最大一次性能读取 8k长度的字节数,所以不能一次性读取大文件去作下载. 优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务 ...
- Win10利用CodeBlocks搭建Objective-C开发环境(一)
为了学习ios开发,而手头没有苹果机,若在windows平台下学习objective-c编程.则需要安装OC开发环境, 经过在网上查阅各种相关资料,历经多次失败,终于安装并测试成功,特将安装过程和经验 ...
- vue 跨域简记
0.服务端设置 app.use(function(req, res, next){ //设置跨域访问 res.header('Access-Control-Allow-Origin', '*'); r ...
- 使用Maven为SpringBoot项目打包
一.maven通过命令行打jar包 进入项目目录,执行如下命令: mvn -Dmaven.test.skip -U clean package 发现报如下错误: [ERROR] Failed to e ...
- ubuntu18.10 安装nodejs
进入官网下载页面 下载对应版本 2.解压tar.xz文件在linux下,大部分情况下不能直接解压tar.xz的文件. 需要用 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx. ...
- Appium移动自动化测试-----(六)1.appium-desktop下载安装
Appium 移动测试中有个很重新的组件 Appium-Server,它主要用来监听我们的移动设备(真机或模拟器),然将不同编程语言编写的 appium 测试脚本进行解析,然后,驱动移动设备来运行测试 ...
- Eclipse+TestNG搭建接口自动化测试框架
一.环境安装 1.前提 安装好jdk 配置好Java环境变量 安装Eclips 这些网上都有,就不再详细介绍. 资源分享链接:http://pan.baidu.com/s/1v9Fw6 2.安装Tes ...
- Python中turtle库的使用
Turtle图形库 Turtle库是Python内置的图形化模块,属于标准库之一,位于Python安装目录的lib文件夹下,常用函数有以下几种: 画笔控制函数 penup():抬起画笔: pendow ...