18. python从入门到精通——网络编程

news2024/11/22 10:36:07

Socket:提供给程序可以对外进程连接的接口,是对底层协议的封装。根据不同的的底层协议,Socket的实现是多样化的。每个socket都要绑定端口号和IP

优势:在用python进行编程的时候不用考虑三次握手等网络协议的具体实现,可以直接通过Socket对象实现

创建Socket

语法:

        s = socket.socket(AddressFamily, Type)

                #Address Family:可以选择AF_INET(用于 Internet 进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET。

                #Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)

Socket通信流程

基于TCP协议为例:首先客户端与服务端都需要创建Socket

        服务器:

                Socket() :创建Socket

                Bind():绑定IP和端口号

                Listen():监听端口

                Accept():等待接收

                Receive():接收数据

                Send():函数发送数据

                Close(): 关闭Socket

        客户端:

                Socket() :创建Socket

                Connet(): 连接服务器对应服务器的Accept()函数,三次握手就是在这个过程中完成的

                Send():函数发送数据

                Receive():接收数据

                Close(): 关闭Socket

Socket对象常用方法

方法名

描述

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.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()

关闭套接字

TCP编程

实例:使用服务器向浏览器发送: Hellow Word

创建TCP服务器

# -*- coding:utf-8 -*-
import socket               #导入socket模块
host = '127.0.0.1'          #主机IP
port = 8080                     #端口号
web = socket.socket()           #创建 socket 对象
web.bind((host,port))       #绑定端口
web.listen(5)               #设置最多连接数
print ('服务器等待客户端连接...') 
#开启死循环
while True:
    conn,addr = web.accept()    #建立客户端连接:conn是一个新的Socket对象,addr是连接客户端的IP地址
    data = conn.recv(1024).decode()      #获取客户端请求数据,decode()指定解码格式
    print(data)             #打印接受数据
    conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World')     #向客户端发送数据
    conn.close()            #关闭链接 
#############
##服务器等待客户端连接...
##hi

验证:

        命令行启动此程序

        浏览器访问:127.0.0.1:8080

创建TCP客户端

import socket       # 导入socket模块
s= socket.socket()  # 创建TCP/IP套接字
host = '127.0.0.1'  # 获取主机地址
port = 8081        # 设置端口号
s.connect((host,port)) # 主动初始化TCP服务器连接

send_data = input("请输入要发送的数据:") # 提示用户输入数据
s.send(send_data.encode()) # 发送TCP数据,encode():指定编码格式

# 接收对方发送过来的数据,最大接收1024个字节
recvData = s.recv(1024).decode() #encode():指定解码格式
print('接收到的数据为:',recvData)

# 关闭套接字
s.close()
##############################
##请输入要发送的数据:hi
##接收到的数据为: HTTP/1.1 200 OK

##Hello World

验证:命令行先执行服务器程序在执行客户端程序

服务器与客户端交互

实例:制作简易聊天窗口

实现:客户端发送的内容在服务端打印,服务端发送的内容在客户端打印。在输入baibai时终端连接

服务端代码:

import socket               # 导入socket模块
host = socket.gethostname() # 获取主机地址
port = 12345                # 设置端口号   
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建TCP/IP套接字
s.bind((host,port)) # 绑定地址(host,port)到套接字
s.listen(1) # 设置最多连接数量
sock,addr = s.accept() # 被动接受TCP客户端连接
print('连接已经建立') 
info = sock.recv(1024).decode() # 接收客户端数据
while info != 'byebye':  # 判断是否退出
  if info : #判断是否有内容
    print('接收到的内容:'+info)
  send_data = input('输入发送内容:')   # 发送消息
  sock.send(send_data.encode()) # 发送TCP数据
  if send_data =='byebye':  # 如果发送exit,则退出
    break
  info = sock.recv(1024).decode() # 接收客户端数据
sock.close() # 关闭客户端套接字
s.close()    # 关闭服务器端套接字

客户端代码:

import socket       # 导入socket模块
s= socket.socket()  # 创建TCP/IP套接字
host = socket.gethostname() # 获取主机地址
port = 12345        # 设置端口号     
s.connect((host,port)) # 主动初始化TCP服务器连接
print('已连接')
info = ''           
while info != 'byebye':  # 判断是否退出
  send_data=input('输入发送内容:')    # 输入内容
  s.send(send_data.encode()) # 发送TCP数据
  if send_data =='byebye': # 判断是否退出
    break
  info = s.recv(1024).decode() # 接收服务器端数据
  print('接收到的内容:'+info)
s.close() # 关闭套接字

验证:

 

UDP编程

应用场景

语音广播
视频
聊天软件
TFTP(简单文件传送)
SNMP(简单网络管理协议)
RIP(路由信息协议,如报告股票市场、航空信息)
DNS(域名解释

实例:将摄氏温度转化为华氏温度

创建UDP服务器

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建UDP套接字
s.bind(('127.0.0.1', 8888)) # 绑定地址(host,port)到套接字
print('绑定UDP到8888端口')
# 接收数据:最大接受1024字节
data, addr = s.recvfrom(1024) 
data = float(data)*1.8 + 32 # 转化公式
send_data = '转换后的温度(单位:华氏温度):'+str(data)
print('Received from %s:%s.' % addr)
s.sendto(send_data.encode(), addr) # 发送给客户端
s.close()    # 关闭服务器端套接字

验证结果

 

UDP通信的基本模型

 

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

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

相关文章

【Redis】内存数据库Redis进阶(Redis分片集群)

目录 分布式缓存 Redis 四大问题搭建Redis分片集群分片原理散列插槽(插槽原理)集群伸缩需求设定配置集群伸缩 故障转移自动故障转移手动故障转移 RedisTemplate访问分片集群 分布式缓存 Redis 四大问题 基于 Redis 集群解决单机 Redis 存在的四大问题&a…

如何在CSDN上转发别人的文章

很多小伙伴可能跟我一样,看到一些优秀发文章或内容,想转发到自己的CSDN账号上,但是在CSDN上找了半天没找到CSDN转发的功能。鉴于我成功转发文章到CSDN上后,网上关于转发文章到CSDN的教程写的比较简单,我整理了一份比较…

HTTP——五、与HTTP协作的Web服务器

HTTP 一、用单台虚拟主机实现多个域名二、通信数据转发程序 :代理、网关、隧道1、代理2、网关3、隧道 三、保存资源的缓存1、缓存的有效期限2、客户端的缓存 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。…

如何制作Windows10安装U盘

如何制作Windows10安装U盘 有新电脑的时候,我们会用安装U盘装系统,可是要怎么制作? 工具/原料 一台可以使用并且能上网的电脑 一个至少4.7GB的U盘 方法/步骤 1 2 选择官网 3 点击“立即下载工具”下载制作工具 4 插入U盘&#xff…

Linux常用命令——dpkg-divert命令

在线Linux命令查询工具 dpkg-divert Debian Linux中创建并管理一个转向列表 补充说明 dpkg-divert命令是Debian Linux中创建并管理一个转向(diversion)列表,其使得安装文件的默认位置失效的工具。 语法 dpkg-divert(选项)(参数)选项 -…

C#使用libmodbus库与工业设备进行读写测试

一.编译libmodbus库供C#使用 如何编译?请移步:https://blog.csdn.net/weixin_42205408/article/details/119530811 上面博主的文章除了所写的modbus.cs内的代码有点问题外(可能上面博主和我的Win 10 64位 Visual Studio 2019平台不一样吧&a…

IDEA社区版插件汇总

1. Smart Tomcat 顾名思义就是配置tomcat的,跟专业版配置小猫类似。 2. Database Navigator 类似专业版的数据库管理工具。 3. Spring Boot Assistant SpringBoot开发插件。(可以识别springboot主配置文件,以及代码提示,我这个版本…

深度学习与计算机相结合:直播实时美颜SDK的创新之路

时下,实时美颜技术就成为了直播主们的得力工具,它可以在直播过程中即时处理视频画面。而支持实时美颜功能的SDK更是推动了这项技术的发展,让直播主和普通用户都能轻松使用美颜功能。 一、美颜技术的演进 早期的美颜技术主要依赖于简单的图…

TPC-DS 标准介绍、工具下载地址

目录 一、TPC-DS标准介绍 1. DMS介绍 2. TCP-DS概念 二、数据库模型 1. 数据库模型介绍 2. 数据库模型包含内容 三、数据生成器 1. 数据生成器介绍 2. 数据生成器包含内容 四、查询集合 1. 查询集合介绍 2. 查询集合包含的88个标准化查询和17个基准统计函数 五、性…

外卖多门店小程序开源版开发

外卖多门店小程序开源版开发 外卖多门店小程序开源版的开发可以按照以下步骤进行: 确定需求:明确外卖多门店小程序的功能和特点,包括用户注册登录、浏览菜单、下单支付、订单管理等。技术选型:选择适合开发小程序的技术框架&…

Red Hat 安装MySQL 8.0与 Navicat

目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL,输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…

Django笔记之使用原生SQL查询数据库

Django 提供了两种方式来执行原生 SQL 代码。 一种是使用 raw() 函数,一种是 使用 connection.cursor()。 但是官方还是推荐在使用原生 SQL 之前,尽量的先去探索一下 QuerySet 提供的各种 API。 目前而言,官方文档提供的各种 API 是能够满…

修改cuda软链接(实操演示)

文章目录 1 找到已存在的CUDA软链接2 确认当前软链接真实路径3 删除现有软链接4 创建新的软链接5 验证新的软链接 要修改CUDA的软链接,需要找到已经存在的软链接并重新创建它指向新的目录。 1 找到已存在的CUDA软链接 首先,需要找到之前创建的CUDA软链…

编程:必备技能还是浪费时间?

当下,学习编程正变得越来越受欢迎,许多人都在探讨这个话题,但仍有很多人产生疑问:学习编程是否有必要?我们可以从学习编程的好处和应用领域来进行分析。好处方面,乔布斯曾说:“人人都应该学习编…

安装企业级高负载web服务器tomcat,并部署应用

web服务器Tocamt 1.Tocmat简介2.Tocmat安装1.安装jdk2.部署Tomcat1.配置环境变量2.启动tocmat3.Tomcat web管理功能 3.部署jpress应用 1.Tocmat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由…

【小白篇】Vscode配置Python和C++环境

文章目录 一、配置python环境二、配置C环境2.1 安装MinGW编译器2.2 安装C/C扩展2.3 配置C/C环境(1)配置编译器(2)配置构建任务(3)配置调试设置 2.4 测试例子2.5 注意事项 三、插件Reference 一、配置python…

MongoDB文档--基本概念

阿丹: 不断拓展自己的技术栈,不断学习新技术。 基本概念 MongoDB中文手册|官方文档中文版 - MongoDB-CN-Manual mongdb是文档数据库 MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包…

网络安全【黑客技术】自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成…

windows mysql5.7 开启binlog

查看binlog是否开启 show variables like %log_bin%; 找到安装目录的mysql配置文件 my.ini 编辑 my.ini文件 log-bin D:\Program Files\mysql\logs\log-bin binlog_format ROW server_id 2 按照 log-bin D:\Program Files\mysql\logs\log-bin 创建文件 重启mysql服务 重启…