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-网络编程的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  10. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

随机推荐

  1. Docker配置阿里云镜像加速器及开启远程连接

    适用于CentOS-7版本 mkdir /etc/docker vim /etc/docker/deamon.json 添加以下内容配置镜像 { "registry-mirrors" ...

  2. maven打war包

    测试/本地 mvn clean package -Dmaven.test.skip=true 生产服务器打包命令 mvn clean package -P prod -Dmaven.test.skip ...

  3. phpstorm 实现分屏显示

  4. python-内置函数-callable,chr,ord,bytes,随机验证码生成

    s="老男人" bytes(s,encoding="utf-8") 随机验证码的实现方法: 大写字母: li = [] for i in range(6): t ...

  5. WM_PAINT 与 WM_ERASEBKGND消息的深入分析

    当WM_PAINT消息不是由函数InvalidateRect产生的时(即通过最大话,最小化,移动,下拉菜单等),系统会先产生连续产生若干个WM_ERASEBKGND消息,紧接着在产生WM_PAINT消 ...

  6. 在其他程序集访问internal类

    前言  本文将介绍如何在其他程序集访问internal类的方法 首先我们新建一个解决方案,其中同时新建两个类库FooALibray和FooALibray,如下: 其中FooA类代码如下: intern ...

  7. ES6学习-4 解构赋值(1)数组的解构赋值

    解构赋值是ES6很大的一个提升,为我们带来了很多方便,但用不好,会使程序的可读性变差,所以用时要注意,尽量保持程序的易读性. 数组解构赋值 在JS没有支持解构赋值之前,我们声明几个变量并赋值通常都是像 ...

  8. Jsp授课

    2.1 JSP基础 2.1.1 JSP简介 JSP全称是Java Server Page,是一种动态网页技术标准.它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/ ...

  9. 7. IDEA概述和安装

    1.1IDEA概述 IDEA全称InteliJ IDEA,是用于Java语言开发的继承环境,它是业界公认的目前用于Java程序开发的最好工具 集成环境:把代码编写,编译,执行,调试等多种功能综合到一起 ...

  10. Redis 快速集群环境搭建

    环境 Linux :centos 7 redis:redis-5.0.9 Redis 集群环境搭建步骤 早期 redis 版本集群环境搭建需要安装 ruby 运行环境,搭建步骤比较繁琐: redis ...