一、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. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  2. 关于footer 小于一屏还要在底部显示的思考

    首先想到了页面是动态的  就是js 计算 但是有一个简单的方法就是 运用定位 1 footer 的祖先元素没有定位属性 absoulite (这样他就会相对于文档定位) left:0 bottom : ...

  3. 20175212课下作业 MyCP

    20175212课下作业 MyCP 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2 ...

  4. Linux虚机安装配置Tomcat

    d第一步:下载Tomcat包,网址http://tomcat.apache.org/ 选择tar.gz包下载,并传到虚机中 第二步:解压下载好的Tomcat包 命令:tar -zxvf apache- ...

  5. ubuntu16.04安装anaconda、环境配置

    anaconda默认3.7降级到3.6 conda install python=3.6 anaconda安装后找不到conda命令: 执行测试命令 conda info -e conda: comm ...

  6. C#连接sql server windows 和 sqlserver 身份验证的两种连接字符串

    //sql server 身份验证 连接字符串 private string ConnstrSqlServer = "server=服务器名称;uid=登录名称;pwd=登录密码;datab ...

  7. aspectj编程简介

    现在java生态中spring大行其道,一般使用aspectj进行切面编程使用注解方式实现,比较少使用原生的aspectj编程,网上的资料也比较少.最近工作中需要封装redisson客户端提供统一的r ...

  8. [Oracle][DATAGUARD] PHYSICAL STANDBY环境里,11.2.0.4 , 也可以使用Pfile来运行Primary和Standby(虽然很少有人用)

    ####Primary#### [oracle@primary ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 金 ...

  9. 多线程之 Thread类

    一.多线程第一种方式的实现步骤(继承Thread类) 代码演示: 1.定义MyThread类,继承Thread类 2.重写了里面的run方法,在run方法中定义线程要执行的任务 public clas ...

  10. 说一说js中的闭包

    不说官方给的定义,感觉自己刚开始看也不是很理解. 闭包 : 其实就是 该函数能使用函数外定义的变量. 为什么要使用闭包? 首先来说一下局部变量和全局变量的危害: 全局变量容易全局污染,局部变量又无法共 ...