一、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. JS回调函数中的this指向(详细)

    首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun()     fun中的this->obj,自动指向.前的对 ...

  2. XVI Open Cup named after E.V. Pankratiev. GP of Ekaterinburg--I.Iron man

    n个服务器,k类任务,每个服务器完成一个任务都有特定的花费$cost_{i,j}$,但是你设置好某台机器去完成某项任务时他只能去完成这类任务,除非你可以花费$C$去更改配置.第$i$天要求去完成$q_ ...

  3. css伪类选择符

    1):link/:visited/:hover/:active (爱恨原则 love/hate)2):first-child/:last-child/:only-child/:nth-child(n) ...

  4. 一条shell命令让多台Linux服务器执行

    1.环境 局域网环境有3台Linux服务器,配置host文件 [root@master1 ~]# vim /etc/hosts 192.168.8.201 master1 192.168.8.202 ...

  5. 迁移 Emacs 的自定义设置

    在一台电脑上设置好了 Emacs 自定义的许多包和参数,想要便捷地把各项设置迁移到另一台目标电脑,其实是很简便的. 一般情况下,各个package位于 ~/.emacs.d/ 文件夹内,我们需要做的只 ...

  6. windows下使用 fdfs_client 上传文件

    在上一篇中介绍了使用 FastDFS 与 Nginx 在 Linux 系统上实现分布式图片服务器,现在介绍在 windows 系统下使用该分布式图片服务器. 需要安装 fdfs_client 模块和配 ...

  7. PHP语言学习之php做图片上传功能

    本文主要向大家介绍了PHP语言学习之php做图片上传功能,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 今天来做一个图片上传功能的插件,首先做一个html文件:text.php < ...

  8. 洛谷1196【NOI2002】题解

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  9. Static,重载,List的知识点

    声明为static的成员可以在它的类的对象创建之前被访问,静态方法不能访问实例变量. 声明为static的变量称为静态变量或类变量,static可以用来修饰属性.方法和代码块. 多重继承的初始化顺序是 ...

  10. eclipse 中修改项目名称,启动tomct原项目找不到的问题

    eclipse 中修改项目名称,启动tomct原项目找不到的问题 1 在开发和练习中,经常会导入其他开源项目,修改项目名称,部署到tomcat 后,然后访问项目会找不到项目,可能是新项目名称和配置文件 ...