python Socket socketserver
Socket
套接字
socket的 类型 实现socket对象时传入 到socket 类中
socket.AF_INET 服务器间的通讯 IPv4
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流试 tcp 传输方式 默认类型
socket.SOCK_DGRAM 包式 udp 传输方式
返回前端数据 需要先发送报头
b'HTTP/1/1 200 OK \r\n\r\n'
基于 Tcp 传输方式
服务端 server
import socket
server = socket.socket()
# 允许地址重用
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 绑定 ip 及 端口
server.bind(("192.168.15.100", 8001))
监听 tcp 传入链接 可设置链接个数 listen(4)
server.listen()
# 等待建立链接 conn 管道 addr 客户端的地址
conn, addr = server.accept()
#接收数据
content = conn.recv(1024).decode("utf-8")
print(content)
# 发送数据
conn.send("再见".encode("utf-8"))
# 循环发送数据 直到数据发送完毕
conn.sendall("再见..........".encode("utf-8"))
# 关闭
conn.close()
server.close()
客户端 client
import socket
clinet = socket.socket()
clinet.connect(("192.168.15.100", 8001))
clinet.send(st.encode("utf-8"))
clinet.recv(1024).decode("utf-8")
clinet.close()
基于 Udp 传输方式
服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(("127.0.0.1", 8001))
# 等待接收数据
conn, addr = server.recvfrom(1024)
st = conn.decode("utf-8")
# 向某个地址 返回数据
server.sendto(st.encode("utf-8"), addr)
客户端
import socket
clinet = socket.socket(type=socket.SOCK_DGRAM)
clinet.sendto('你好啊!', ("127.0.0.1", 8001))
conn, addr = clinet.recvfrom(1024)
print(conn.decode("utf-8"))
server.sendto(st.encode("utf-8"), addr)
缓冲区
作用:
防止数据丢失
输入缓冲区 #recv
输出缓冲区 #send
粘包
粘包(tcp的两种粘包现象)
连续发送小的数据,并且每次发送之间的时间间隔很短(输出缓冲区:两个消息在缓冲区黏在一起了)
原因是TCP为了传输效率,做了一个优化算法(Nagle),减少连续的小包发送(因为每个消息被包裹以后,都会有两个过程:1 组包 2拆包)
第一次服务端发送的数据比我客户端设置的一次接收消息的大小要大,那么接收不完,第二次再接收的时候,就会将第一次剩余的消息接收到
粘包的根本原因是因为:双方不知道对方发送消息的大小
解决方案一:
发送消息之前,先计算要发送消息的长度,然后先将消息长度发送过去,对方给你回一个确认收到长度的信息,然后根据接收到的消息长度来修改自己一次接收消息的大小
这个过程多了一次交互粘包解决方案二
使用 **struct ** 模块打包
tcp和udp的区别
tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是面向流的,无消息保护边界0
udp协议:面向无连接,消息不可靠,传输速度快,消息是面向包的,有消息保护边界.
socketserver
- 简化网络服务端的编写
import socketserver
import struct
class Myserver(socketserver.BaseRequestHandler):
# 定义一个方法 handle 方法名字不可以变
def handle(self):
try:
while 1: # 循环接受 回复 数据
# self.request 就是 conn 链接通道
client_data = self.request.recv(1024).decode("utf-8")
print(client_data)
# 返回信息
self.request.send("输入>>>".encode("utf-8"))
except ConnectionResetError as c:
print(c)
if __name__ == "__main__":
server_ip = ('127.0.0.1',8001)
# 地址重用
# socketserver.TCPServer.allow_reuse_address = True
# 绑定ip 端口 启动 Myserver 类 ThreadingTCPServer>>>多线程的TCP服务端
server = socketserver.ThreadingTCPServer(server_ip, Myserver)
# 永久执行下去
server.serve_forever()
FTP
#进度条打印,print版
import time
for i in range(20):
#\r 回到行首打印内容,如果同一行有内容,那么就被抹掉了
n = '>' * i
print('\r%s' %n,end='')
time.sleep(0.5)
#进度条打印,sys版
import sys
import time
for i in range(10):
sys.stdout.write('>')
sys.stdout.flush()
time.sleep(0.5)
#搞百分比的样子
#0.42857142857142855 改成两位数,不进行四舍五入
print(3/7) #0.42857142857142855
print(round(3/7,2)) #0.43 43%
print(int(3/7*100))
python Socket socketserver的更多相关文章
- python socket和socketserver
Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API:另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发. 下面先 ...
- python3之socket&socketserver网络编程
1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...
- python利用socketserver实现并发套接字功能
本文实现利用python的socketserver这个强大的模块实现套接字的并发 目录结构如下: 测试文件请放在server_file文件夹里面 server.py #!/usr/bin/env py ...
- python之socketserver实现并发
python之socketserver实现并发 服务端 import socketserver #socketserver模块是用来实现并发 # 我们自己的类里一定要继承socketserver.Ba ...
- PYTHON SOCKET编程简介
原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...
- python socket编程笔记
用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...
- Python Socket网络编程详解
Socket 简介 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. s ...
- python socket编程 实现简单p2p聊天程序
目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...
- python - socket通信笔记
参考: 通过编写聊天程序来熟悉python中多线程和socket的用法:https://www.cnblogs.com/mingjiatang/p/4905395.html python socket ...
随机推荐
- Ansible快速上手
ansible 是通过python 语言开发的自动化运维工具,可以实现批量系统设置.批量程序部署.批量执行命令等功能 下面是基于docker使用ansible测试示例,可以让新手快速上手使用 一.新建 ...
- JSON 与 JS 对象的区别与对比
定义: JSON是什么?JSON是JS的一种简单数据格式,JSON是JavaScript原生格式,它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号. 问题: ...
- 封装自定义服务$http
var httpService = angular.module('httpService', []); httpService.factory("$httpService",fu ...
- python学习笔记(八)、特殊方法、特性和迭代器
1 新式类和旧式类 python类的工作方式在不断变化.较新的Python2版本有两种类,其中旧式类正快速退出舞台.新式类时Python2.2 引入的,提供了一些额外功能,如支持函数super 和 p ...
- 高效使用VSCode的9点建议
在开源 IDE 市场,最近几年 Visual Studio Code(简称 VSCode)越来越流行.自从 2015 年对外发布后,根据 2018 年 Stack Overflow 的调查报告,有 3 ...
- vue安装element-ui和px2rem的细节
1.按需引入element-ui vue脚手架搭建完成之后,可以到element-ui官网进行npm 安装: npm i element-ui -S 如果是完整引入可以按照官网一步一步做即可完成:这里 ...
- css direction 属性简介与实际应用。
目前正在用vue构建组件库.写到弹框的时候没想到按钮的顺序问题,但是在应用中,确实会有选项按钮顺序不同的情况发生,但是又想共用一个组件.那么问题就出现了.后来看到了这篇文章,才茅塞顿开. direct ...
- vmware 开启VM的硬件cpu虚拟化功能
物理机的cpu硬件虚拟化功能,通过开启bios中的设置,而vmware中创建的虚拟机也可以开启该特性,如下. 这样的话,就直接可以基于这些VM安装openstack计算节点.控制节点.网络节点了.
- Android中将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...
- 如何利用Vagrant快速搭建相同配置的开发环境?
作为一名程序猿,我们常常会遇到需要搭建开发环境的问题,特别是在新入职的时候,sublime, node, apache, mysql, php等等以及各种框架的安装.如果入职的是大公司有可能这些必要的 ...