python web开发 网络编程 TCP/IP UDP协议

文章目录

    • 1. TCP/IP协议
      • 1.1 IP协议
      • 1.2 TCP协议
    • 2. UDP协议
    • 3. Socket
    • 4. TCP编程
      • 4.1 创建TCP服务器
      • 4.2 创建TCP客户端
      • 4.3 简易聊天工具
    • 5. UDP编程
      • 5.1 创建UDP服务器
      • 5.2 创建UDP客户端

learning from 《python web开发从入门到精通》

1. TCP/IP协议

大家都用同样的协议 protocol(沟通语言)才能对话

TCP/IP协议:

  • 应用层FTP文件传输,Telnet远程登录,DNS域名系统,SMTP电子邮件传输…(为用户提供服务)
  • 传输层TCP传输控制,UDP用户数据报(端到端通信,保证顺序传输数据和完整性)
  • 网络层IP网际协议,IGMP互联网组管理,ICMP互联网控制报文(主机到主机通信)
  • 链路层:(监视数据在主机和网络之间的交换)

1.1 IP协议

  • 数据被分成小包裹通过 IP包发出,不保证到达,不保证顺序

1.2 TCP协议

  • 建立在 IP 协议之上,3次握手,建立可靠连接,保证数据顺序到达
  • 丢失,自动重发
  • TCP 报文 包含数据,源IP,目标IP,源端口,目标端口

2. UDP协议

  • 面向无连接的协议,不需建立连接,只需知道对方 IP 和端口
  • 不保证一定到达,但是速度比 TCP 快

3. Socket

  • 两个程序要网络通信,都需要使用 Socket 套接字(孔,插座的意思)
  • 用于描述 IP 地址 和 端口
  • 服务打开一个 Socket,并绑定到一个端口上,不同的端口对应不同的服务

python中的套接字:

s = socket.socket(AddressFamily, Type)
  • AddressFamily,填socket.AF_INET (用于 Internet 进程间通信),填socket.AF_UNIX(用于同一台机器进程间通信)
  • Type 套接字类型,socket.SOCK_STREAM 流式套接字(主要用于 TCP),socket.SOCK_DGRAM 数据包套接字(主要用于 UDP)

常用函数:https://www.runoob.com/python/python-socket.html

函数描述
服务器端套接字
s.bind()绑定地址(host,port)到套接字, 在 AF_INET下,以元组(host,port)的形式表示地址。
s.listen()开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以了。
s.accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来
客户端套接字
s.connect()主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv()接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。
s.send()发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。
s.sendall()完整发送 TCP 数据。将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回 None,失败则抛出异常。
s.recvfrom()接收 UDP 数据,与 recv() 类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。
s.sendto()发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
s.makefile()创建一个与该套接字相关连的文件

4. TCP编程

主动发起连接的是:客户端
被动响应连接的是:服务器

4.1 创建TCP服务器

  1. 创建套接字
  2. bind 绑定 IP 和 端口
  3. listen socket 可以被动连接
  4. accept 等待客户端连接
  5. recv / send 接收发送数据

例子:使用 socket 模块,通过客户端浏览器 向 本地服务器(127.0.0.1) 发起请求;服务器接到请求,向浏览器发送 hello world

import sockethost = "127.0.0.1"  # IP
port = 8080  # 端口
web = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
web.bind((host, port))  # 绑定端口
web.listen(5)  # 监听,最多5个连接
print("服务器启动成功, 等待客户端连接...")
while True:conn, addr = web.accept()  # 建立客户端连接print("客户端连接成功, 地址:", addr)data = conn.recv(1024)  # 获取客户端发送的数据print("接收到客户端发送的数据:", data.decode())conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World, Michael!')  # 发送数据给客户端conn.close()  # 关闭连接print("客户端连接关闭")

在这里插入图片描述

服务器启动成功, 等待客户端连接...
客户端连接成功, 地址: ('127.0.0.1', 7631)
接收到客户端发送的数据: GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6客户端连接关闭
客户端连接成功, 地址: ('127.0.0.1', 7632)
接收到客户端发送的数据: GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
sec-ch-ua-platform: "Windows"
Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6客户端连接关闭

4.2 创建TCP客户端

客户端比较简单一点

import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 8080
s.connect((host, port))
while True:send_data = input("请输入要发送的数据:")if send_data == "exit":breaks.send(send_data.encode("utf-8"))recvData = s.recv(1024).decode("utf-8")  # 最大接收1024字节print("接收到的数据:", recvData)
s.close()

在这里插入图片描述

4.3 简易聊天工具

服务端

import sockethost = socket.gethostname()
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
sock, addr = s.accept()
print('建立连接:', addr)
info = sock.recv(1024).decode()
while info != "byebye":if info:print("收到信息:", info)send_data = input("请输入发送的信息:")sock.send(send_data.encode())if send_data == "byebye":breakinfo = sock.recv(1024).decode()
sock.close()
s.close()

客户端

import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
s.connect((host, port))
print("已经连接到服务器")
info = ''
while info != 'byebye':send_data = input("请输入要发送的数据:")s.send(send_data.encode())if send_data == 'byebye':breakinfo = s.recv(1024).decode()print("收到服务器的数据:", info)
s.close()

在这里插入图片描述

5. UDP编程

UDP 面向消息的协议,无需建立连接,传输是不可靠的,一般用于:

  • 语音广播,视频,聊天软件,TFTP(简单文件传送),SNMP(简单网络管理协议),RIP(路由信息协议),DNS(域名解释)

5.1 创建UDP服务器

例子:在客户端输入摄氏温度,发送给服务器,转换为华氏温度,发送给客户端显示

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # UDP套接字
s.bind(('127.0.0.1', 1314))
print('绑定 UDP服务 到 1314 端口')
data, addr = s.recvfrom(1024) # 收到的数据是 byte 类型
data = float(data) * 1.8 + 32
send_data = "转换后的温度(华氏温度):" + str(data)
print("从%s:%s收到请求数据" % addr)
s.sendto(send_data.encode('utf-8'), addr) # 发送数据给客户端
s.close()

5.2 创建UDP客户端

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = input("请输入要转换的摄氏温度:")
s.sendto(data.encode(), ("127.0.0.1", 1314))
print(s.recv(1024).decode())
s.close()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle批量联机,Oracle 12.2 使用联机重定义对表进行多处改变

下面的例子将演示如何使用联机重定义操作来对表进行多处改变,原始表jy.original的创建语句如下:SQL> create table jy.original(2 col1 number primary key,3 col2 varchar2(10),4 col3 clob,5 col4 date)6 organization index;Table created.表jy.original将按以…

python web开发 网络编程 HTTP协议、Web服务器、WSGI接口

文章目录1. HTTP协议2. Web服务器3. 静态服务器创建 web_server.py4. WSGI 接口4.1 CGI 通用网关接口4.2 WSGI4.3 定义 WSGI 接口4.4 运行 WSGI 服务learning from 《python web开发从入门到精通》 1. HTTP协议 应用层最主要的协议:HTTP协议(HyperText…

php实现文字向左跑马灯,js实现文字跑马灯效果

js实现文字超过显示宽度每间隔1s自动向左滚动显示*{ margin:0; padding:0;}body{font:12px/1 微软雅黑;}.wrapper{font-size: 0.85rem; color: #333; padding-top: 0.75rem; margin: 0 0.75rem; white-space: nowrap; overflow: hidden;width: 300px;}.inner{ width:1000px;ove…

android 75 新闻列表页面

new.xml <?xml version"1.0" encoding"UTF-8" ?> <newslist><news><title>黑马52期就业快报</title><detail>热烈祝贺黑马52期平均薪水突破13k</detail><comment>15687</comment><image>ht…

python web开发 MySQL数据库基础

文章目录1. 简介2. 下载安装3. 操作 MysQL 数据库3.1 创建数据库3.2 选择数据库3.3 查看数据库3.4 删除数据库4. 数据类型5. 操作 MysQL 数据表5.1 创建数据表5.2 查看表的结构5.3 修改表的结构5.4 删除数据表6. 操作 MySQL 数据表记录6.1 添加数据6.2 查询、修改、删除learnin…

oracle计算每月最小工作日,Oracle计算指定日期内的工作日(不包含周末)

1、获取当天是礼拜几&#xff1a;select to_char(sysdate,d) from dual; --礼拜天为1&#xff0c;礼拜一为2&#xff0c;类推2、获取 两个时间段间的 工作日&#xff1a;select (trunc(&end_dt - &start_dt) -((caseWHEN (8 - to_number(to_char(&start_dt,D))) &g…

简单几何(极角排序) POJ 2007 Scrambled Polygon

题目传送门 题意&#xff1a;裸的对原点的极角排序&#xff0c;凸包貌似不行。 /************************************************ * Author :Running_Time * Created Time :2015/11/3 星期二 14:46:47 * File Name :POJ_2007.cpp******************************…

python 操作MySQL数据库

文章目录1. 安装 PyMySQL2. 连接对象3. 游标对象4. 增删改操作cursor.execute(sql)cursor.executemany(sql, seq_of_params)5. 查询操作6. ORM编程常用 python ORM 库learning from 《python web开发从入门到精通》 1. 安装 PyMySQL conda 虚拟环境下安装 pip install pymysq…

go oracle编程,go基础编程(一):第一个go程序-hello word

环境搭建环境搭建是在deepin操作系统上进行1. 下载go安装程序wget https://golang.org/dl/go1.16.linux-amd64.tar.gz以上是下载go1.16的版本&#xff0c;如需其他版本&#xff0c;请移步官网下载。2. 解压程序包到指定目录tar-C/usr/local-xzf go1.16.linux-amd64.tar.gz3. 添…

反射,System.Type类

http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子&#xff1a;1、B超&#xff1a;大家体检的时候大概都做过B超吧&#xff0c;B超可以透过肚皮探测到你内脏的生理情况。这是如何做到的呢&#xff1f;B超是B型超声波&#xff0c;它可以透过肚皮通过向你体内发射B型…

python web框架基础

文章目录1. Web框架简介1.1 MVC1.2 模板引擎2. 常用 Python Web 框架3. 虚拟环境4. 部署方式learning from 《python web开发从入门到精通》 1. Web框架简介 简化 web 开发的软件框架 一般都支持&#xff1a;管理路由&#xff0c;支持数据库&#xff0c;MVC&#xff0c;ORM&…

导Excel数据到Oracle的脚本,Oracle使用TOAD实现导入导出Excel数据

在Oracle应用程序的开发过程中&#xff0c;访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作&#xff0c;对数据库进行日常管理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工具-Toad。在Toad的新版本中&#xff0c;还加入了DBA模块&a…

Chapter 14 Exercises Problems

转载于:https://www.cnblogs.com/momoko/p/4937730.html

FastAPI 结合 SQLAlchemy 操作 MySQL 数据库

文章目录1. 安装 SQLAlchemy2. 创建数据库3. SQLAlchemy 连接 MySQL4. 创建数据模型5. 创建 Pydantic 模型6. crud 工具7. main函数learning from 《python web开发从入门到精通》 1. 安装 SQLAlchemy pip install sqlalchemy 2. 创建数据库 mysql -u root -p 命令行登录 M…

oracle 打开 ctl,Oracle 19c 随系统systemctl启动数据库

Oracle 19c 随系统systemctl启动数据库一、 修改oratab文件[rootadg19c ~]# grep woo /etc/oratabwoo:/DBSoft/oracle/product/19.3/dbhome_1:N[rootadg19c ~]# sed -i s/:N/:Y/ /etc/oratab[rootadg19c ~]# grep woo /etc/oratabwoo:/DBSoft/oracle/product/19.3/dbhome_1:Y二…

调用exe文件(一般处理登陆安全窗口)+睡眠等待(--------------------)

在测试basic认证的时候&#xff0c;处理windows弹窗的问题时&#xff0c;是用autoit进行处理的&#xff0c;最终转成一个.exe文件&#xff0c;然后再用java调用该exe文件。 1、调用自己打包的exe文件&#xff08;如下下例子&#xff09; package com.gmsd.gommon; import java.…

LeetCode 2094. 找出 3 位偶数

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 digits &#xff0c;其中每个元素是一个数字&#xff08;0 - 9&#xff09;。数组中可能存在重复元素。 你需要找出 所有 满足下述条件且 互不相同 的整数&#xff1a; 该整数由 digits 中的三个元素按 任意 顺序 依次连接 …

oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?

从Oracle8i开始&#xff0c;Oracle引入了特殊的触发器&#xff0c;这些触发器并不是和特殊的DML事件相关联的(DML事件&#xff0c;如&#xff0c;INSERT,UPDATE和DELETE)。这些系统级别的触发器包括数据库启动触发器&#xff0c;DDL触发器和最终用户登陆/注销触发器。当Oracle提…

TotoiseSVN 使用参考文章

SVN使用教程总结 http://www.cnblogs.com/armyfai/p/3985660.html TotoiseSVN的基本使用方法 http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html windows svn server and client and plugin的下载地址 https://www.visualsvn.com/downloads/ VisualSVN Server |…

oracle oci.dll的作用,ASP.NET bin目录中的Oracle oci.dll无法删除/不起作用

我按照这里的指示&#xff1a;http://splinter.com.au/blog/?p156尝试使用较新版本的ODP.NET而不安装Oracle 11g客户端.到目前为止,除了重启IIS之外,我都遵循了一切.然而,这引起了一些问题,我真的很好奇为什么.如果我尝试使用ODP.NET,我遇到了Oracle连接尝试连接时抛出的空白异…