Python 网络通信协议 tcp udp区别

时间:2022-02-27 14:42:46

网络通信的整个流程

  在这一节就给大家讲解,有些同学对网络是既熟悉又陌生,熟悉是因为我们都知道,我们安装一个路由器,拉一个网线,或者用无限路由器,连上网线或者连上wifi就能够上网购物、看片片、吃鸡了,但是这一系列的神操作到底是怎么让我们上网了呢?让我们起底揭秘!由于网络的内容非常的多,本篇博客主要是学socket网络编程,所以我把网络这方面的内容放到了我另外一篇博客上,这个博客很简单,不是什么深入研究类的博客,没有学过网络的或者说对网络不太熟悉的同学可以去看看,地址是网络通信的整个流程,有网络基础的同学,可以直接往下面学习,如果你自认上学时是个学渣,也可以过去大致溜一眼~~~将来你面向的是开发,所有网络这一块对你来讲就是大致知道就可以了,但是以后想在技术上有深造,那么就需要你深入的研究一下网络了,内容非常多,学海无涯~~

别忘了端口+IP能够确定一台电脑上的某一个应用程序~~

  那么我们通过下面的代码简单看一下socket到底是个什么样子,大概怎么使用:下面的程序就是一个应用程序,和qq啊、微信啊是一样的,都叫做应用程序。

  

import socket
#创建一个socket对象
server = socket.socket() #相当于创建了一部电话
ip_port = ('192.168.111.1',8001) #创建一个电话卡
server.bind(ip_port) #插上电话卡
server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错
print('')
#等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr
conn,addr = server.accept() #阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口)
print('')
print(conn)
print('>>>>>>>>>',addr)
while True:
from_client_data = conn.recv(1024) #服务端必须通过两者之间的连接通道来收消息
from_client_data = from_client_data.decode('utf-8')
print(from_client_data)
if from_client_data == 'bye':
break
server_input = input('明威说>>>>:')
conn.send(server_input.encode('utf-8'))
if server_input == 'bye':
break
conn.close() #挂电话
server.close() #关手机 test_server.py

  listen(3),这个3的意思是我连接着一个,后面还可以有三个排队的,也就是支持4个人的服务,但是后面三个要排队。

import socket
#创建一个socket对象
server = socket.socket() #相当于创建了一部电话
ip_port = ('192.168.111.1',8001) #创建一个电话卡
server.bind(ip_port) #插上电话卡
server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错
print('')
#等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr
conn,addr = server.accept() #阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口)
print('')
print(conn)
print('>>>>>>>>>',addr)
while True:
from_client_data = conn.recv(1024) #服务端必须通过两者之间的连接通道来收消息
from_client_data = from_client_data.decode('utf-8')
print(from_client_data)
if from_client_data == 'bye':
break
server_input = input('明威说>>>>:')
conn.send(server_input.encode('utf-8'))
if server_input == 'bye':
break
conn.close() #挂电话
server.close() #关手机 test_server.py

  注意:先运行server,然后再运行client,然后你会发现client这个文件再输出台的地方让你输入内容,你输入一个内容然后回车,你会发现server那边的控制台就输出了以client发送的内容

osi七层模型

互联网的核心就是由一堆协议组成,协议就是标准,标准就是大家都认可的,所有人都按照这个来,这样大家都能够互相了解,互相深入了~~~比如全世界人通信的标准是英语

Python 网络通信协议 tcp udp区别

五层通信流程:

Python 网络通信协议 tcp udp区别

基于TCP和UDP两个协议下socket的通讯流程

1.TCP和UDP对比

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

直接看图对比其中差异

Python 网络通信协议 tcp udp区别

 

继续往下看

TCP和UDP下socket差异对比图:

Python 网络通信协议 tcp udp区别

上面的图只是让大家感受一下TCP和UDP协议下,socket工作流程的不同,两者之间的差异是tcp需要连接,udp不需要,有些同学是不是有些迷糊,老师,这里面的bind、listen啥的都是什么东西啊,我感觉人生是迷茫的!calm down!下面我们就分开两者,细细学习!

2.TCP协议下的socket

来吧!先上图!

基于TCP的socket通讯流程图片:

Python 网络通信协议 tcp udp区别

虽然上图将通讯流程中的大致描述了一下socket各个方法的作用,但是还是要总结一下通讯流程(下面一段内容)

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

上代码感受一下,需要创建两个文件,文件名称随便起,为了方便看,我的两个文件名称为tcp_server.py(服务端)和tcp_client.py(客户端),将下面的server端的代码拷贝到tcp_server.py文件中,将下面client端的代码拷贝到tcp_client.py的文件中,然后先运行tcp_server.py文件中的代码,再运行tcp_client.py文件中的代码,然后在pycharm下面的输出窗口看一下效果。

server端代码示例(如果比喻成打电话)

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选) tcp_server.py

client端代码示例

import socket
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) # 对话(发送/接收)
print(ret)
sk.close() # 关闭客户套接字 tcp_client.py

在看UDP协议下的socket之前,我们还需要加一些内容来讲:看代码

    server端

import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
# sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8090))
sk.listen()
conn,addr = sk.accept() #在这阻塞,等待客户端过来连接
while True:
ret = conn.recv(1024) #接收消息 在这还是要阻塞,等待收消息
ret = ret.decode('utf-8') #字节类型转换为字符串中文
print(ret)
if ret == 'bye': #如果接到的消息为bye,退出
break
msg = input('服务端>>') #服务端发消息
conn.send(msg.encode('utf-8'))
if msg == 'bye':
break conn.close()
sk.close() 只能与第一个客户端通信server端代码

    client端

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8090)) #连接服务端 while True:
msg = input('客户端>>>') #input阻塞,等待输入内容
sk.send(msg.encode('utf-8'))
if msg == 'bye':
break
ret = sk.recv(1024)
ret = ret.decode('utf-8')
print(ret)
if ret == 'bye':
break
sk.close() 只能与第一个客户端通信client端代码

  你会发现,第一个连接的客户端可以和服务端收发消息,但是第二个连接的客户端发消息服务端是收不到的

  原因解释:
    tcp属于长连接,长连接就是一直占用着这个链接,这个连接的端口被占用了,第二个客户端过来连接的时候,他是可以连接的,但是处于一个占线的状态,就只能等着去跟服务端建立连接,除非一个客户端断开了(优雅的断开可以,如果是强制断开就会报错,因为服务端的程序还在第一个循环里面),然后就可以进行和服务端的通信了。什么是优雅的断开呢?看代码。
server端代码:
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
# sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #允许地址重用,这个东西都说能解决问题,我非常不建议大家这么做,容易出问题
sk.bind(('127.0.0.1',8090))
sk.listen()
# 第二步演示,再加一层while循环
while True: #下面的代码全部缩进进去,也就是循环建立连接,但是不管怎么聊,只能和一个聊,也就是另外一个优雅的断了之后才能和另外一个聊
#它不能同时和好多人聊,还是长连接的原因,一直占用着这个端口的连接,udp是可以的,然后我们学习udp
conn,addr = sk.accept() #在这阻塞,等待客户端过来连接
while True:
ret = conn.recv(1024) #接收消息 在这还是要阻塞,等待收消息
ret = ret.decode('utf-8') #字节类型转换为字符串中文
print(ret)
if ret == 'bye': #如果接到的消息为bye,退出
break
msg = input('服务端>>') #服务端发消息
conn.send(msg.encode('utf-8'))
if msg == 'bye':
break
conn.close() 优雅的断开一个client端之后另一个client端就可以通信的代码

    client端代码

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8090)) #连接服务端 while True:
msg = input('客户端>>>') #input阻塞,等待输入内容
sk.send(msg.encode('utf-8'))
if msg == 'bye':
break
ret = sk.recv(1024)
ret = ret.decode('utf-8')
print(ret)
if ret == 'bye':
break
# sk.close() client端代码

3.UDP协议下的socket

老样子!先上图!

基于UDP的socket通讯流程:

Python 网络通信协议 tcp udp区别

总结一下UDP下的socket通讯流程

  先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),recvform接收消息,这个消息有两项,消息内容和对方客户端的地址,然后回复消息时也要带着你收到的这个客户端的地址,发送回去,最后关闭连接,一次交互结束

Python 网络通信协议 tcp udp区别的更多相关文章

  1. 网络通信协议tcp,udp区别

    1 网络通信协议 Tcp udp的区别 重点(*****) Tcp三次握手四次挥手(******) udp客户端多人聊天 import socket udp_client = socket.socke ...

  2. day27 网络通信协议 tcp/udp区别

    今日主要内容: 一.网络通信协议 二.tcp udp协议下的socket 一.网络通信协议 1.1互联网的本质就是一系列的网络协议 本机IP地址('127.0.0.1',xxxx) 互联网连接的电脑互 ...

  3. 分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击

    SOA(面向服务的架构):Service Oriented Architecture面向服务的架构.也就是把工程拆分成服务层.表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要 ...

  4. 第二十七天- 网络通信协议 TCP UDP 缓冲区

    1.网络通信协议 osi七层模型:按照分工不同把互联网协议从逻辑上划分了层级 socket层 2.理解socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计 ...

  5. python 网络编程-TCP/UDP

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

  6. 27 网络通信协议 tcp udp subprocess

    1.模块subprocess import subprocess cmd_str = input('请输入指令>>>') sub_obj = subprocess.Popen( cm ...

  7. iOS 网络编程 TCP/UDP HTTP

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

  8. Java网络通信协议、UDP、TCP类加载整理

    网络通信协议 网络通信协议 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互 ...

  9. python 网络编程 tcp和udp 协议

    1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...

随机推荐

  1. ldap + kerberos 整合

    第一部分:ldap1. 安装ldap yum install -y openldap openldap-clients openldap-servers openldap-devel 2. 配置lda ...

  2. java 多线程(synchronized)

    package com.example; public class App { public static void main(String[] args) { doRunable dr = new ...

  3. CentOS 6.5 3.0.4安装agentd

    更改主机名为test3 [root@localhost ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=test3 关闭selinux [ ...

  4. linux之i2c子系统架构---总线驱动

    编写i2c设备驱动(从设备)一般有两种方式: 1.用户自己编写独立的从设备驱动,应用程序直接使用即可. 2.linux内核内部已经实现了一个通用的设备驱动,利用通用设备驱动编写一个应用程序(用户态驱动 ...

  5. 浅谈Spark(1) - Overview

    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是 ...

  6. APP中数据加载的6种方式-b

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  7. JavaScript进阶篇 - -第1章 系好安全带

    第1章 系好安全带 html,body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", ...

  8. efwplus框架

    此框架得到博客园大神@张善友的关注,建议我写一篇此框架的最新介绍,好在@dotNet跨平台公众号上推荐给大家,得到大神的指示当然激动,马不停蹄的赶出此文,供大家参考!   一.使用efwplus框架的 ...

  9. LeetCode---------Add Two Numbers 解法

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  10. Django导入外部js、css、图片等巨大的坑

    初学Django,踩过最大的坑只有之一.至今任然不是很明白. 通常我们导入外部js等文件都是 <script src="myScript.js"></script ...