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 ...
随机推荐
- 在使用 Git pull 时候报错 error: inflate
在使用 Git pull 时候报错 error: inflate 具体的错误是 这样的 error: inflate: data stream error (unknown compression m ...
- Netty 简介
上文我们介绍了NIO和BIO的区别,NIO相对于BIO是一次很大的进步.但我们平时开发中并不会使用NIO.这是因为NIO在开发中存在以下问题 NIO的类库和API繁杂,使用麻烦,需要熟练掌握Selec ...
- 文本主题模型之非负矩阵分解(NMF)
在文本主题模型之潜在语义索引(LSI)中,我们讲到LSI主题模型使用了奇异值分解,面临着高维度计算量太大的问题.这里我们就介绍另一种基于矩阵分解的主题模型:非负矩阵分解(NMF),它同样使用了矩阵分解 ...
- springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n ---internationalization 不就是i和n之间有18个字母... http://logging.a ...
- Django 系列博客(十六)
Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...
- golang判断文件是否存在
判断一个文件是否存在是一个相当常见的需求,在golang中也有多种方案实现这一功能. 现在我们介绍其中两种最常用也是最简单的实现,第一种将是跨平台通用的,而第二种则在POSIX平台上通用. 跨平台实现 ...
- [争什么! 掺在一起做撒尿牛丸啊! 笨蛋]ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...
- C#把动态创建的多个控件中指定控件显示在最上层
在创建多个控件后,有些控件会发生重叠,那么就需要在鼠标按下它时能显示在最上层,下面通过先将按下操作的控件删除然后再重建,就达到让它显示在最上层了 //控件按下 private void picture ...
- Java开发笔记(十二)布尔变量论道与或非
在编程语言的设计之初,它们除了可以进行数学计算,还常常用于逻辑推理和条件判断.为了实现逻辑判断的功能,Java引入了一种布尔类型boolean,用来表示“真”和“假”.该类型的变量只允许两个取值,即t ...
- React的组件模式
组件是 React 的核心,因此了解如何利用它们对于创建优秀的设计结构至关重要. 什么是组件 根据 React 官网的介绍,"组件让你可以将 UI 分割成独立的.可重用的部分,并独立管理每个 ...