局域网传输的基本信息

  • 1.IO是什么?
    • ⦁定义
    • ⦁ 阻塞IO
    • ⦁ 非阻塞IO
  • 2.IO多路复用
    • 定义
    • select具体用法
  • 3.实现多路复用局域网文件传输
    • server.py
    • client.py
    • FileOperation.py
    • 注意事项
  • 运行效果

1.IO是什么?

⦁定义

在内存中存在数据交换的操作
和终端交互:input, output
和磁盘交互:read, write
和网络交互:recv, send

①IO密集型:在程序当中存在大量的IO,而CPU的运算较少,消耗CPU资源小,耗时长,效率不高
②计算密集型:在运算中存在大量计算,IO行为较少,CPU消耗大,执行速度快

⦁ 阻塞IO

定义:在执行IO操作时由于不满足某些条件形成的阻塞形态
效率:阻塞IO是一种效率很低的IO,逻辑简单。

⦁ 非阻塞IO

定义:通过修改IO的属性行为,使原本阻塞的IO变为非阻塞的状态
修改方法:
sockf.setblocking(bool)
功能:设置套接字为非阻塞IO
参数:True为阻塞,False为非阻塞

Sockf.settimeout(sec)
功能:超时检测,阻塞等待的时间,超时后不再阻塞
参数:超时时间,以秒为单位

2.IO多路复用

定义

同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO,以此形成可以同时处理多个IO的行为。避免一个IO阻塞造成其他IO无法执行,提高IO执行效率。
具体方案:①select: windows/linux/unix
②poll: linux/unix
③epoll: linux

select具体用法

①导入: from select import select
②监控IO:
rs,ws,xs = select(rlist,wlist,xlist)
功能:监控多个IO事件,阻塞等待IO发生
参数:rlist 列表,关注的等待发生的IO事件
wlist 列表,要主动处理的IO事件
xlist 列表,发生异常时要处理的IO事件
返回值:
rs: 列表,rlist中准别就绪的IO
ws: 列表,wlist中准别就绪的IO
xs: 列表, xlist中准别就绪的IO
③注意:

  • wlist 中如果有IO事件,select 会立即返回为ws
    *处理事件过程找那个不要出现死循环等长期占有服务端的情况
    *IO多路复用消耗资源较少,效率较高
  • 套接字获取地址的方法:
    sockfd.getpeername() 返回一个元组: (ip,port)

3.实现多路复用局域网文件传输

server.py

from select import *
from socket import *#导入模块
from FileOperation import *ip_address = "0.0.0.0"#设置IPV4地址
port = 8097#设置端口
num = 3#设置监听数量
addrs = []server = socket(family=AF_INET,type = SOCK_STREAM,proto = 0)server.bind((ip_address,port))
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,True)
#SO_REUSEADDR指的是一个网络地址在短时间重复利用
server.listen(num)
print("server is listening to the port:%d"%port)
print("server can be connected for %d clients at the same time "%num)
print("------------------------------------")rlist = [server]#存放关注的,等待发生的IO事件
wlist = []#存放主动处理的IO事件
xlist = []#存放发生异常的事件while True:rs,ws,xs = select(rlist,wlist,xlist)for i in rs:#遍历准备就绪的IO事件,如果准备就绪的IO事件i,如果i等于服务器server时,有客户端连接上来了。if i is server:coon,addr = i.accept()#连接rlist.append(coon)print(addr,"is connected......")addrs.append(addr)else:#如果i等于连接套接字类型,那就去接收data = i.recv(102400)#阻塞等待发送消息msg = dataadd_file("./vmware-1.exe",msg)if msg == "quit":#客户端要求断开连接rlist.remove(i)i.close()continueelse:i.send(b"ok")#向客户端反馈OK信息
server.close()

client.py

from socket import *#导入socket库
import time
from FileOperation import *global server_ip
global server_portserver_ip = "192.168.75.1"#这里使用cmd查看主机ipv4地址
server_port = 8097client = socket(family = AF_INET,type = SOCK_STREAM,proto = 0)while True:try:#服务端未打开时的异常client.setsockopt(SOL_SOCKET,SO_REUSEADDR,True)client.connect((server_ip,server_port))except:print("您是不是远离服务器了,靠近后再试一试!")server_ip = input("如果ip接口输入错误,请在这里重试:")server_port = input("如果ip端口输入错误,请在这里重试:")print("正在重试中...")print(server_ip)print(server_port)else:breakwhile True:msg,read_bool = open_file("vmware.exe")client.send(msg)if msg == "quit":breakdata = client.recv(1024)msg = data.decode()print("server:%s"%msg)client.close()

FileOperation.py

def open_file(dir):ReadBool = Nonemsg = Nonetry:with open(dir,"rb")as f:msg = f.read()except:passelse:ReadBool = Truereturn msg,ReadBooldef write_file(dir,message):WriteBool = Nonemsg = Nonetry:with open(dir,"wb+")as f:f.write(message)f.close()except:passelse:WriteBool = Truereturn msg,WriteBooldef add_file(dir,message):AddBool = Nonemsg = Nonetry:with open(dir,"ab+")as f:f.write(message)f.close()except:passelse:AddBool = Truereturn msg,AddBool

注意事项

  1. msg,read_bool = open_file("vmware.exe")
    是作者电脑中包含的文件,当使用TCP传输时,要记得将这个地方换成电脑中的可读取文件,不然程序会报错
  2. server_ip = "192.168.75.1"
    这里要转换为服务器的ipv4地址
  3. 要先打开server.py文件,再打开client.py。最好是在命令行运行

运行效果

局域网传输还在用飞鸽?还在用QQ,其实Python也可以实现类似的功能!Python基于scoket实现多路复用TCP局域网文件传输相关推荐

  1. c++网络编程——用TCP实现文件传输(windows下基于VS2017)

    c++网络编程--用TCP实现文件传输 定义文件传输协议 服务端代码 客户端代码 测试 文件传输协议FTP是基于TCP协议实现的,为了体验这个过程,本文自定义一个简单的文件传输协议,并基于TCP协议编 ...

  2. 【TCP实现文件传输 --文件上传和下载】

    TCP实现文件传输 客户端 服务器 测试 查看服务器目录文件 下载文件 上传文件 小结 客户端 #include <stdio.h> #include <sys/types.h> ...

  3. 关于TCP中文件传输阻塞问题的原因及解决方案和相关优化。

    **## 在自学java过程中遇到的一些问题** 对于如图所示--文件传输示例:由客户端读取本机文件并上传至服务器,服务器进行读取后保存到服务器硬盘上. 但此过程中易出现阻塞问题,即客户端和服务器端在 ...

  4. 利用tcp完成文件传输linux,Linux下基于TCP的文件传输

    服务器: #include #include #include #include #include #include #include #define SERVER_PORT 6666 #define ...

  5. 阿帕奇服务器文件上传,Apache HttpCore4.4基于经典的IO实现HTTP文件传输服务器

    代码案例:package com.what21.http.core4_4; import java.io.File; import java.io.IOException; import java.n ...

  6. java实现TCP协议文件传输

    /*** 需求:将指定文件从D盘目录d:\1下移动到d:\2下* @param args* @throws IOException*/ public static void main(String[] ...

  7. 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输

    文章目录 26.1 远程登录 26.1.1 `TELNET` 1. 分时环境 2. 登录 3. 网络虚拟终端 4. 嵌入 5. 选项 6. 操作方式 26.1.2 Rlogin和SSH 26.2 电子 ...

  8. java编程文件传输_JAVA文件传输程序

    源代码已经上传了. 第3章      设计文档 3.1       任务概述 本项任务要开发一款P2P文件传输软件,该软件可以在局域网和互连上使用,具有文件传输,断点续传,多线程连接等功能. 3.1. ...

  9. 什么是文件共享软件?文件传输软件如何共享?

    它是一个文件共享软件应用程序,可让强大的数据保护层下将任何大小的文件发送到世界上的任何地方.以光速发送和共享无限数量的文件.可以提交门户并使用语言,品牌,存储等自定义门户.可以选择一个存储点,例如文件 ...

最新文章

  1. Linux下日志文件过大解决方案
  2. com.squareup.okhttp.Interceptor
  3. HTML 代码常用技巧
  4. git使用(一)----git安装
  5. generate报错 make_如何安装opencv_contrib及解决其安装编译问题
  6. 十三、前端基本功:DOM练习
  7. console react 去除_vue或react项目生产环境去掉console.log的操作
  8. 元素(块、行内、行内块
  9. Windows10最新MySQL8.0.23安装教程(超级详细)
  10. eclipse和idea开发servlet的区别
  11. freebsd 6.2 安装配置笔记[转]
  12. typedef 与结构体struct
  13. 徐小湛概率论与数理统计课件_考研数学 徐小湛教授线性代数90讲
  14. C++ SLT之map的用法总结
  15. 在堆区开辟内存(动态内存的开辟)
  16. swal如何加入html语言,前端基础(九):SweetAlert(弹出框)
  17. 51JOB:根据HR处理简历的一般流程,简历投递后会有如下几种状态出现
  18. PDFsharp使用介绍
  19. 千兆网络PHY芯片 RTL8211E的实践应用(原理图及PCB实现)
  20. 柏林噪声(Perlin Noise)

热门文章

  1. 免安装绿色软件共享 傻瓜gif制作 flash CS3 动画 影片制作
  2. 【人事】电话面试时需要注意什么
  3. 在线考试系统 mysql_在线考试系统
  4. ssm基于jsp的网上购物系统 毕业设计-附源码190917
  5. 车间作业计划(production activity production)
  6. 神经网络国内外发展概况,图神经网络和神经网络
  7. 关于WEBQQ的实现(二)
  8. matlab连接板,怎样用Matlab连接控制Arduino开发板
  9. 高校财务信息化管理收费平台建设完成 | 校盈家学校收费管理系统
  10. 如何估算剩余的bug数量