【Python基础】基于UPD协议实现简易聊天室(Socket编程)

news2024/11/28 5:32:56

UDP通信

  • 1.什么是 socket
  • 2. 创建 socket
  • 3.udp 网络程序-发送、接收数据(User Datagram Protocol)
    • udp 网络程序-发送、接收数据(客户端)
    • udp 绑定信息
    • udp 绑定信息---服务器端
    • 总结
  • 4.udp 聊天器

1.什么是 socket

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于
Socket 来完成通信的

例如我们每天浏览网页、QQ 聊天、收发 email 等等
在这里插入图片描述

2. 创建 socket

在 Python 中 使用 socket 模块的函数 socket 就可以完成:

import socket socket.socket(AddressFamily, Type)

说明:

函数 socket.socket 创建一个 socket,该函数带有两个参数:

· Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者
AF_UNIX(用于同一台机器进程间通信),实际工作中常用 AF_INET
· Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)创建一个 tcp socket(tcp 套接字)

import socket
 

 
# 创建 tcp 的套接字
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字s.close()



创建一个 udp socket(udp 套接字)

import socket
 

 
# 创建 udp 的套接字
 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字s.close()

  • 说明
    · 套接字使用流程 与 文件的使用流程很类似
    a. 创建套接字
    b. 使用套接字收/发数据
    c. 关闭套接字

3.udp 网络程序-发送、接收数据(User Datagram Protocol)

  1. udp 网络程序-发送数据

创建一个基于 udp 的网络程序流程很简单,具体步骤如下:

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字
    02

udp 网络程序-发送、接收数据(客户端)

import socket


client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) dest_addr=('192.168.5.7',2000) #client.sendto(b'hello',dest_addr)
client.sendto('howare'.encode('utf8'),dest_addr) #放汉字还是不放都行
data,_=client.recvfrom(100) print(data.decode('utf8')) client.close() #关闭时端口会释放

出错信息:
bind 使用,如果端口被占用
OSError: [Errno 98] Address already in use

当 UDP recvfrom 内部要接的大小,少于发送的字节数,windows 报错,Linux 是不会报错,没有拿的数据直接丢弃。
sendto 和 recvfrom,次数完全对等

udp 绑定信息

  1. udp 网络程序-端口问题
    · 会变的端口号
    重新运行多次脚本,会发现客户端端口改变了

说明:

· 每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,这个数
字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
· 记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如
果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字
(即端口)标识的程序发送即可

udp 绑定信息—服务器端

<1>. 绑定信息

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用
同一个端口号,往往在编程中,udp 的端口号一般不绑定

但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么
呢?

如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要
一个固定的端口号,这就是所谓的端口绑定

  • 实例
#coding=utf-8

from socket import *

# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) # ip 地址和端口号,ip 一般不用写,表示本机的任何一个 ip
udp_socket.bind(local_addr)

# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024 表示本次接收的最大字节数

# 4. 显示接收到的数据print(recv_data[0].decode('utf8'))

# 5. 关闭套接字udp_socket.close()



运行:

howare

(‘192.168.3.28’, 51404)

总结

· 一个 udp 网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行此程序端口可能会发生变化· 一个 udp 网络程序,也可以绑定信息(ip 地址,端口号),如果绑定功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的端口占用怎么办?
这里讲解 kill 命令

ps -elf 查看进程

kill -9 进程 id

4.udp 聊天器

def main():
        #创建套接字
        udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        udp_socket.bind(("0.0.0.0",8082 ))
        while True:
            # 3. 选择功能print("="*30) print("1:发送消息") print("2:接收消息") print("="*30)
            op_num = input("请输入要操作的功能序号:")

            # 4. 根据选择调用相应的函数
            if op_num == "1":
                send_msg(udp_socket)
            elif op_num == "2":
                recv_msg(udp_socket)
            else:
                print("输入有误,请重新输入...")

if __name__ == '__main__':
    main()
~            

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

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

相关文章

如何快速编写测试用例?

当你学会了如何设计测试用例之后&#xff0c;接下来便是开始用例的编写。 在设计阶段&#xff0c;更准确的说应该是识别测试点的过程&#xff0c;而编写阶段则是将测试点细化成一条条测试用例的过程&#xff0c;有了比较全的用例场景后&#xff0c;如何让别人更舒服、更方便、…

Python + UnitTest 软件测试流程总结

以测试用户登录流程为例&#xff1a; TestCase&#xff1a; TestCase 主要用来编写测试用例&#xff0c;这里结合 断言&#xff08;assertEqual 和 assertIn&#xff09; 进行判断&#xff0c;避免了手动书写判断。 # tools.py # 登录验证方法 def login(username, password…

Android Studio导入,删除第三方库

Android项目经常用到无私的程序员们提供的第三方类库。本篇博客就是实现第三方库的导入和删除。 一、导入第三方库 1、将需要的库下载到本地&#xff1b; 2、新建Moudle (1)File --- New Moudle (2)选择Android Library --- Next (3)填写Moudle名 --- Finish。一个新的Mou…

【优选算法系列】【专题七分治】第一节.75. 颜色分类和912. 排序数组

文章目录 前言一、颜色分类 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、排序数组 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、颜色分类 1.1 题目描述 描述&…

QML9、输入元素

1、输入元素(Input Element) 我们已经使用过MouseArea(鼠标区域)作为鼠标输入元素。这里我们将更多的介绍关于键盘输入的一些东西。我们开始介绍文本编辑的元素:TextInput(文本输入)和TextEdit(文本编辑)。 2、文本输入(TextInput) 文本输入允许用户输入一行文本…

Redis之缓存

文章目录 前言一、缓存使用缓存的原因 二、使用缓存实现思路提出问题 三、三大缓存问题缓存穿透缓存雪崩缓存击穿互斥锁实现逻辑过期时间实现 总结 前言 本篇文章即将探索的问题&#xff08;以黑马点评为辅助讲解&#xff0c;大家主要体会实现逻辑&#xff09; 使用redis缓存的…

Nmap-NSE

一.Nmap的脚本引擎类别 参数说明ALL允许所有的脚本Auth认证Default默认的脚本引擎&#xff0c;-sC&#xff1a;equivalent to --script default 或 --script default &#xff0c;执行一些脚本的脚本扫描Discovery发现&#xff0c;获取目标的深度信息External扩展&#xff0c…

2023面试笔记四

1、gc导致的cpu冲高 排查是否为gc导致&#xff0c;看如下两点&#xff1a; gc频率和耗时 内存占用率 &#xff08;1&#xff09;gc频率和耗时有两种手段看&#xff1a; 第一种&#xff1a;根据gc日志的打印时间&#xff0c;可确定每次gc间隔的时间和耗时&#xff1a; 使用…

聚铭国产化日志合规版 → 中小企事业单位等保建设的最优解

聚铭网络最新发布聚铭综合日志分析系统国产化合规版本 &#xff0c;相较于同类型同档次非国产化设备性能无衰减、功能无裁减、成本不提高&#xff0c;适用于信创替换以及等保日志建设等应用场景。 面对日趋复杂的外部环境&#xff0c;近年来&#xff0c;国家越来越重视关键技术…

谭浩强【C语言程序设计】第一章习题详解

目录 1&#xff0c;什么是程序&#xff1f;什么是程序设计&#xff1f; 2&#xff0c;为什么需要计算机语言&#xff1f;高级语言有哪些特点&#xff1f; 3&#xff0c;正确理解以下名词及其含义&#xff1a; (1)源程序&#xff0c;目标程序&#xff0c;可执行程序。 (2)程…

免费小程序HTTPS证书

随着互联网的快速发展&#xff0c;小程序已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;在小程序的开发和使用过程中&#xff0c;安全问题一直是开发者们关注的重点。其中&#xff0c;HTTPS 证书是保障小程序安全的重要工具之一。在这方面&#xff0c;免费的小程序…

【机器学习】正则化到底是什么?

先说结论&#xff1a;机器学习中的正则化主要解决模型过拟合问题。 如果模型出现了过拟合&#xff0c;一般会从两个方面去改善&#xff0c;一方面是训练数据&#xff0c;比如说增加训练数据量&#xff0c;另一方面则是从模型角度入手&#xff0c;比如&#xff0c;降低模型复杂…

HDR 成像技术学习(四)

HDR(High Dynamic Range,高动态范围)仿佛是成像领域永恒的话题,动态范围越大,图像能清晰呈现的明暗差别也就越大。与传统的SDR(标准动态范围)相比,HDR图像能够以更高质量同时显示画面的亮部和暗部。 随这些年CMOS图像传感器工艺技术进步,以及后端数字信号处理算力的提升…

编译内核源码

本文将记录内核源码编译步骤&#xff0c;供有需要的人参考使用。 一、内核源码下载网址 内核源码网址&#xff1a;https://kernel.org/ 二、准备编译环境 这里需要注意区分x86架构和arm架构&#xff0c;需要不同的架构内核就准备对应的服务器即可&#xff0c;在服务器上安装…

arthas常用命令

arthas常用命令 IDEA插件 arthas idea退出arthasjad 反编译watch 方法执行数据观测tracemonitor https://arthas.aliyun.com/doc/ IDEA插件 arthas idea 退出arthas # quit或者exit命令,只是退出当前的连接, Attach到目标进程上的arthas还会继续运行&#xff0c;端口会保持开…

火力全开!腾讯云这次直接开卖5年

如果你是一名网站管理员&#xff0c;或者是一名创业公司的CEO&#xff0c;那么腾讯云这个词一定不会陌生。作为国内领先的云计算服务提供商&#xff0c;腾讯云一直以来都在为各行各业的用户提供着高效、稳定、安全的云计算服务。 而在今天&#xff0c;我们要给大家带来一个重磅…

2020年五一杯数学建模B题基于系统性风险角度的基金资产配置策略分析解题全过程文档及程序

2020年五一杯数学建模 B题 基于系统性风险角度的基金资产配置策略分析 原题再现 近年来&#xff0c;随着改革开放程度的不断提高&#xff0c;我国经济运行中的各种风险逐渐暴露并集中传导和体现于金融领域。党的“十九大”报告提出“守住不发生系统性金融风险的底线”要求&am…

官媒代运营:让大众倾听品牌的声音

在当今数字时代&#xff0c;媒体的影响力和多样性远远超出了以往的范畴。品牌和企业越来越依赖媒体来传播信息、建立声誉以及与大众互动。而媒体矩阵成为了现代品牌传播的关键策略&#xff0c;使大众能够倾听品牌的声音。媒体矩阵&#xff1a;多元化的传播渠道 媒体矩阵是指利…

使用双动态令牌混合器学习全局和局部动态以进行视觉识别

TransXNet: Learning Both Global and Local Dynamics with a Dual Dynamic Token Mixer for Visual Recognition 1、问题与解决2、引言3、方法3.1 双动态令牌混合器(D- Mixer)3.2 IDConv(Input-dependent Depthwise Convolution)3.3 Overlapping Spatial Reduction Attention …

玩具品牌的国际化之路:市场推广战略解析

玩具产业一直是全球市场中备受瞩目的领域之一。随着全球化的发展和互联网的普及&#xff0c;越来越多的玩具品牌开始进军国际市场。这既是机遇&#xff0c;也是挑战。在竞争激烈的全球市场中&#xff0c;如何成功推广玩具品牌是一个关键的问题。本文Nox聚星将和大家探讨玩具品牌…