python10-网络编程
1,七层网络协议
应表会传网数物:
应用层、表示层、会话层 (这三层又可以合并为应用层,这样就是五层网络协议【osi五层协议】) python '你好'.encoding('utf-8')
传输层、 预备如何传输、使用的端口 (port,tcp,udp) 四层路由器,四层交换机
网络层、 ip (ipv4 ipv6) 路由器,三层交换机
数据链路层、 mac (mac, arp协议:可以通过ip找到mac) 二层交换机,网卡(单播、广播、组播,arp用到单播和广播)
物理层 转成电信号
2,TCP/UDP
tcp需要先建立连接,然后才能够通信(类似于打电话)
- 占用连接,可靠(消息不会丢失),实时性高,慢(效率低、面向连接、可靠、全双工)
- 三次握手
- 客户端向服务器端发送syn请求
- 服务端回复ack并发送syn请求
- 客户端接收到请求后再回复ack,连接建立
- 在socket中是由 客户端connect() 和 服务端accept()两个命令完成的
- 四次挥手
- 客户端向服务端发送fin请求
- 服务端回复ack确认
- 服务端向客户端发送fin请求
- 客户端回复ack确认
- 在socket中是由 客户端sk.close() 和 服务端 conn.close()两个命令完成的
- 挥手时服务端的ack和fin不能同时发送,因为客户端发送完所有信息时,服务端不一定完成了所有信息的发送
udp不需要建立连接,就可以通信(类似于发信息)
- 不占用连接,不够可靠(消息因为网络不稳定可能丢失),实时性不高(效率高、无连接的、不可靠的)
3,例子
'''
------------------------------
TCP协议
------------------------------
'''
'''server'''
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen()
conn, addr = sk.accept()
conn.send('你好'.encode('utf-8'))
msg = conn.recv(1024)
print(msg.decode('utf-8'))
conn.close()
sk.close()
'''client'''
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 6000))
msg = sk.recv(1024)
print(msg.decode('utf-8'))
sk.send('再见'.encode('utf-8'))
sk.close()
'''
------------------------------
UDP协议
------------------------------
'''
'''server'''
import socket
sk = socket.socket(type=socket.SOCK_DGRAM) #SOCK_DGRAM udp default tcp
sk.bind(('127.0.0.1', 6000))
# msg = sk.recv(1024)
# print(msg.decode('utf-8'))
while True:
msg = sk.recvfrom(1024)
print(msg)
print(msg[0].decode('utf-8'))
if msg[0].decode('utf-8') == '对方和你断开了连接':
continue
msgSend = input('>>>')
sk.sendto(msgSend.encode('utf-8'), msg[1])
'''client'''
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
server = ('127.0.0.1', 6000)
while True:
msgSend = input('>>>')
if msgSend.upper() == 'Q':
sk.sendto('对方和你断开了连接'.encode('utf-8'), server)
break
sk.sendto(msgSend.encode('utf-8'), server)
msg = sk.recv(1024).decode('utf-8')
if msg.upper() == 'Q':
print('对方和你断开了连接')
break
print(msg)
4,粘包
只出现在tcp协议中,因为tcp协议中多条消息之间没有边界,并且还有各种优化算法,因此会导致发送端和接收端都存在粘包现象:
发送端:两条消息很短,而且发送的间隔时间也很短
接收端:多条消息没有及时接收,而在接收方的缓存堆在一起导致粘包
'''server'''
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen()
conn, addr = sk.accept()
conn.send(b'hello')
conn.send(b'byebye')
conn.close()
sk.close()
'''client'''
import time
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 6000))
time.sleep(0.1)
msg = sk.recv(5)
print(msg)
msg = sk.recv(4)
print(msg)
sk.close()
解决粘包问题的本质:设置边界(发送长度、发送消息,交替进行)
1,自定义协议
'''server'''
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen()
conn, addr = sk.accept()
msg1 = input('>>>').encode('utf-8')
msg2 = input('>>>').encode('utf-8')
def sendFunc(msg):
num = str(len(msg))
ret = num.zfill(4)
conn.send(ret.encode('utf-8'))
conn.send(msg)
sendFunc(msg1)
sendFunc(msg2)
conn.close()
sk.close()
'''client'''
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 6000))
def receiveFunc():
num = sk.recv(4).decode('utf-8')
msg = sk.recv(int(num))
print(msg.decode('utf-8'))
receiveFunc()
receiveFunc()
sk.close()
2,struct模块
import struct
'''~2**32, 排除符号位,相当于1G的数据的长度'''
num1 = 1231341234
num2 = 1342342
num3 = 12
ret1 = struct.pack('i', num1)
print(ret1)
print(len(ret1))
ret2 = struct.pack('i', num2)
print(ret2)
print(len(ret2))
ret3 = struct.pack('i', num3)
print(ret3)
print(len(ret3))
ret11 = struct.unpack('i', ret1)
print(ret11)
print(type(ret11[0]))
python10-网络编程的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
随机推荐
- WPF之事件绑定命令
目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...
- 40 图 |我用 Mac M1 玩转 Spring Cloud
我的开源 Spring Cloud 项目 PassJava 一直可以在 Windows 上正常运行,最近不是换 Mac M1 了么,想把这个项目在 M1 上跑起来,毕竟我的那台 Windows 用起来 ...
- 【python】Leetcode每日一题-设计停车系统
[python]Leetcode每日一题-设计停车系统 [题目描述] 请你给一个停车场设计一个停车系统.停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位. 请你实现 Parki ...
- ERROR: Pool overlaps with other one on this address space
出现问题 配置了两个不同的docker-compose.yml,使用了相同的网段,导致了在运行第二个yml文件时命令行报错目标网段已存在,报错如下: Creating network "v2 ...
- ARP欺骗-断网小技巧
警告:请勿用于非法用途,后果自负! 环境: 攻击方: Kali Linux 被攻击方: Windows XP 二者在同一局域网下 步骤 1.查看Windows的IP,联网状态 在Windows的cmd ...
- gitlab的CI/CD实现
环境准备: gitlab账号公网账号:代码仓库和编译器 目标机:装有docker和gitlab-runner环境的服务器(Linux或类unix机器,我使用的时centos 项目代码:testgola ...
- Ansible_创建角色_role
一.创建角色目录结构 1.角色创建流程 1️⃣:在Ansible中创建角色不需要特别的开发工具.创建和使用角色包含三个步骤: 创建角色目录结构 定义角色内容 在playbook中使用角色 2.角色目录 ...
- 30-- A 代码记录分析
张的代码 30-- -A if(BT_INFO.RX.CACHE == BT_RX_CACHE[0]) { BT_INFO.RX.CACHE = BT_RX_CACHE[1]; } else { B ...
- SpringMVC MVC 架构模式
MVC 架构模式 MVC(Model.View 和 Controller)是一种架构模式,它是按照职责划分的思想将系统操作分为三个模块进行处理,每个模块负责一个职责,而且模块之间可以相互交互通信,共同 ...
- 国外DIY网站
https://site.douban.com/109950/widget/notes/250072/note/248811721/