一、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的指令,及黏包的更多相关文章

  1. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  2. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  3. iOS 网络编程 TCP/UDP HTTP

    一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...

  4. 28_网络编程-TCP/UDP

    一.传输层       1.定义       IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议.根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是 ...

  5. python 网络编程-TCP/UDP

    摘抄自:廖雪峰的官方网站:http://www.liaoxuefeng.com/ TCP客户端和服务器端代码: #coding=utf-8 #客户端程序TCP 连接 import socket s=s ...

  6. Java网络编程——TCP/UDP

    UDP:面向无连接 ☆ 将数据及源地址和目的地址封装成数据包中 ☆ 每个数据报的大小限制在64K ☆ 不可靠协议 ☆ 不需要建立连接,速度快 TCP:面向有连接 ☆ 建立连接,形成传输数据的通道 ☆ ...

  7. 【python】网络编程-TCP协议套接字

    服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSI ...

  8. UNIX网络编程——tcp流协议产生的粘包问题和解决方案

    我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...

  9. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

随机推荐

  1. JavaScript前端面试题总结

    1.em和rem 像素(px):用于元素的边框或定位. em/rem:用于做响应式页面,em相对于父元素,rem相对于根元素. rem 单位翻译为像素值是由 html 元素的字体大小决定的. 此字体大 ...

  2. WinForm界面设计优化过程

    以在做的项目为例,记录一下界面美化过程中遇到的问题,由于项目是先做出来之后,又请美工进行稍微调整设计界面,所以会又些限制 1. TabControl的问题----在添加了背景图片后,TabContro ...

  3. 通讯录管理系统(C语言)

    /* * 对通讯录进行插入.删除.排序.查找.单个显示功能 */ #include <stdio.h> #include <malloc.h> #include <str ...

  4. day27_python_1124

    1.内容回顾 2.今日内容 3.创建-进程Process 4.join方法 5.进程之间数据隔离 1.内容回顾 # 进程 :是计算机中最小的资源分配单位# 进程的三状态 :就绪 运行 阻塞# 并发和并 ...

  5. Qt UI tips

    窗口居中:  adjustSize(); move((availableGeometry.width() - width()) / 2, (availableGeometry.height() - h ...

  6. 共识机制:AngelToken技术的根基

    共识机制是区块链技术的一个核心问题,它决定了区块链中区块的生成法则,保证了各节点的诚实性.账本的容错性和系统的稳健性. 常用的共识机制主要有 PoW.PoS.DPoS.Paxos.PBFT等. 基于区 ...

  7. 常用的lamp环境以及一些依赖包的安装

  8. 小白的首个maven web项目Step1软件安装一(jdk的下载配置和eclipse的安装)

    因为电脑太卡加了一个固态硬盘导致系统重装, 把之前的C盘和D盘合并成一个盘,这下之前下的杂七杂八的软件应该差不多都清干净了. 申请这个博客是想记录最近写项目学习的一些事,系统重装之后,发现自己都已经忘 ...

  9. pandas 常用技巧总结

    切片: loc:df.loc[num]:选择df 某一行 seriesdf.loc[[num1,num2]]: 选择df 某几行df.loc[[True,False,True,   ,True]]: ...

  10. 其他知识点,API

    日期和Math 获取2017-06-10格式的日期 Date.now() //当前时间毫秒数 var dt=new Date() dt.getTime() //毫秒数 dt.getFullYear() ...