python day31--网络编程,tcp,udp的指令,及黏包
一、TCP
tcp中遇到黏包会让数据传输完。
server
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen()
while True:
cmd=input('>>>')
conn,addr=sk.accept()
conn.send(cmd.encode('utf-8'))
ret=conn.recv(1024).decode('utf-8')
print(ret)
conn.close()
sk.close()
client
import socket
import subprocess
sk=socket.socket()
sk.connect(('127.0.0.1',8090))
while True:
cmd=sk.recv(1024).decode('gbk')
ret=subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out='stdout:'+(ret.stdout.read()).decode('gbk')
std_err='stderr:'+(ret.stderr.read()).decode('gbk')
print(std_err)
print(std_out)
sk.send(std_out.encode('utf-8'))
sk.send(std_err.encode('utf-8'))
sk.close()
二、UDP
udp传输遇不会黏包。
server
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8090))
msg,addr=sk.recvfrom(1024)
while True:
cmd=input('>>>')
if cmd=='q':break
sk.sendto(cmd.encode('utf-8'),addr)
msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8')) sk.close()
client
import socket
import subprocess
sk=socket.socket(type=socket.SOCK_DGRAM)
addr=('127.0.0.1',8090) sk.sendto('吃了吗'.encode('utf-8'),addr)
while True:
cmd,addr=sk.recvfrom(1024)
ret=subprocess.Popen(cmd.decode('gbk'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out='stdout:'+(ret.stdout.read()).decode('gbk')
std_err='stderr:'+(ret.stderr.read()).decode('gbk')
print(std_err)
print(std_out)
sk.sendto(std_out.encode('utf-8'),addr)
sk.sendto(std_err.encode('utf-8'),addr)
sk.close()
三、黏包
tcp协议的拆包机制:网络设备在传输时会把数据拆成几块来传输,这样会产生数据碎片,从而造成数据丢失。
tcp黏包:发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段。若连续几次需要send的数据都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据。
四、网盘作业
server
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr=sk.accept()
user=conn.recv(1024).decode('utf-8')
pwd=conn.recv(1024).decode('utf-8')
print(user,pwd)
while True:
if user=='alex' and pwd=='':
conn.send(bytes('1.上传文件 2.下载文件',encoding='utf-8'))
shell=conn.recv(10240).decode('utf-8')
print(shell)
if shell== '':
txt=conn.recv(10240).decode('utf-8')
with open('a.txt','w',encoding='utf-8') as f1:
f1.write(txt)
conn.send(bytes('上传成功',encoding='utf-8'))
break
elif shell== '':
with open('b.txt','r',encoding='utf-8') as f1:
conn.send(bytes(f1.read(), encoding='utf-8'))
conn.send(bytes('下载成功',encoding='utf-8'))
break
conn.close()
sk.close()
client
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
user=input('输入用户名:')
pwd=input('输入密码:')
sk.send(bytes(user,encoding='utf-8'))
sk.send(bytes(pwd,encoding='utf-8'))
shell=sk.recv(1024).decode('utf-8')
print(shell)
cmd=input('>>>')
sk.send(bytes(cmd,encoding='utf-8'))
while True:
if cmd=='':
with open('a1.txt','r',encoding='utf-8') as f1:
sk.send(bytes(f1.read(),encoding='utf-8'))
msg=sk.recv(10240).decode('utf-8')
print(msg)
break
elif cmd=='':
with open('C:/Users/lenovo/Desktop/111/b1.txt','w',encoding='utf-8') as f1:
info=sk.recv(10240).decode('utf-8')
msg=sk.recv(10240).decode('utf-8')
f1.write(info)
print(msg)
break
sk.close()
python day31--网络编程,tcp,udp的指令,及黏包的更多相关文章
- 32.网络编程TCP/UDP服务
网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- iOS 网络编程 TCP/UDP HTTP
一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...
- 28_网络编程-TCP/UDP
一.传输层 1.定义 IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议.根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是 ...
- python 网络编程-TCP/UDP
摘抄自:廖雪峰的官方网站:http://www.liaoxuefeng.com/ TCP客户端和服务器端代码: #coding=utf-8 #客户端程序TCP 连接 import socket s=s ...
- Java网络编程——TCP/UDP
UDP:面向无连接 ☆ 将数据及源地址和目的地址封装成数据包中 ☆ 每个数据报的大小限制在64K ☆ 不可靠协议 ☆ 不需要建立连接,速度快 TCP:面向有连接 ☆ 建立连接,形成传输数据的通道 ☆ ...
- 【python】网络编程-TCP协议套接字
服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSI ...
- UNIX网络编程——tcp流协议产生的粘包问题和解决方案
我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
随机推荐
- Cookie、Session和自定义分页
一.cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响, ...
- 一个空格引起的错误。 python
'render_field' tag requires a form field followed by a list of attributes and values in the form att ...
- JavaScript中函数立即调用的写法
第一:在含数前面加一元运算符: //方法1 +function (i) { console.log('+'); }(1); //方法2 -function (i) { console.log('-' ...
- vs2015 c# winfrom应用程序打包成64位
关于Winform打包过程在网上已有详细教程,参考:https://www.cnblogs.com/yinsq/p/5254893.html 此次工作中需要打包成64位的程序,网上没有查到方法,现在讲 ...
- 【Jquery+Express.js】 submit() 方法提交form
前端页面 .html 生成一个动态模块 Modal <div class="modal fade" id="addStaff" tabindex=&quo ...
- java中之内存溢出说明
java语句是编译型和解释型语言,选通过编译命令javac 把java文件编译为.class字节码文件,然后通过java虚拟机(JVM)加载class文件到内存运行. 而java虚拟机在运行程序时有自 ...
- fetch跨域浏览器请求头待研究
fetch('https://wwww.baidu.com', {headers: { "Access-Control-Allow-Origin": "*", ...
- JQ菜单滑块
网站导航滑块效果: 复制以下代码保存到html文件中即可查看效果... <html> <head> <title>JQ菜单滑块</title> < ...
- Robot Framework自动化使用
自动化测试框架---Robot Framework Robot Framework是用Python语言写的,所以在安装Robot Framework以前必须安装Python环境.Robot Frame ...
- socket架构
套接字基本概念 Socket是应用层与Tcp/ip协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它把复杂的tcp/ip协议族隐藏在socket接口后面,对用 ...