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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

遍历List集合和Map进行修改和删除报java.util.ConcurrentModificationException错误详解

一、异常产生 当我们使用foreach迭代一个ArrayList或者HashMap时&#xff0c;如果尝试对集合做一些修改操作&#xff08;例如删除元素或新增&#xff09;&#xff0c;可能会抛出java.util.ConcurrentModificationException的异常。 javapublic static void main(String[] args)…

ChatGPT显现“ Something went wrong. If this issue persists ...”什么原因?如何解决?

一、报错提示 Something went wrong. If this issue persists please contact us through our help center at help.openai.com. 二、解决方案 一般是代理节点出现问题 ChatGPT退出登录 关闭代理并重新启动代理 切换其他节点 清除浏览器缓存 重新登录ChatGPT 三、其它思路…

C# TabControl实现为每一个TabPage添加关闭按钮

默认情况下TabControl是无法通过界面关闭TabPage的 有些情况下我们需要手动关闭任意一个TabPage&#xff0c;如下图所示 TabControl控件自带属性是无法满足以上需求&#xff0c;下面简单介绍实现过程 1、首先需要对TabPage进行重绘&#xff0c;其目的是为了在TabPage上画出…

Linux学习第38天:Linux I2C 驱动实验(二):哥俩好

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记主要学习I2C设备驱动编写及硬件原理图分析。 先把整个本节的思维导图贴出来&#xff1a; 二、I.MX6U的I2C适配器驱动分析 适配器驱动一般都是由SOC厂商提…

乌镇峰会十年之约,为什么IBM是那颗最亮的星?

&#xff08;IBM董事长兼首席执行官Arvind Krishna&#xff09; 2023年处于世界互联网下一个50年开端的头五年。54年前的1969年&#xff0c;世界互联网诞生&#xff1b;同年&#xff0c;IBM助力“阿波罗”号登月成功、首次将人类宇航员送上了月球&#xff1b;当时&#xff0c;…

React Native适配Xcode 15 iOS 17.0+

iOS 17.0 Simulator(21A328)下载失败 App Store 更新到 Xcode15 后&#xff0c;无法运行模拟器和真机。需要下载iOS 17对应的模拟器。Xcode中更新非常容易中断失败&#xff0c;可以在官网单独下载iOS 17模拟器文件&#xff0c;例如&#xff1a;iOS_17.0.1_Simulator_Runtime.d…

WPS表格无法粘贴信息,原因是复制区域与粘贴区域形状不同

WPS表格无法粘贴信息&#xff0c;原因是复制区域与粘贴区域形状不同 问题描述 我是选中了一整列&#xff0c;复制&#xff0c;但是无法粘贴到另一个EXCEL表格中 原因 首先我的数据量很大&#xff0c;有20万行&#xff0c;然后需要复制的EXCEL是.xls格式的&#xff0c;.xls格…

ros1 基础学习07 - 模拟客户端生成小乌龟服务请求生成小乌龟

模拟客户端生成小乌龟服务请求生成小乌龟 一、话题模型二、创建功能包三 创建客户端Client代码四 配置CMakeLists.txt编译规则&#xff1a;五 测试启动ros 主服务启动小乌龟的服务启动模型客户端服务 一、话题模型 Sever端是海龟仿真器/turtlesim&#xff0c;Client端是待实现…

leetcode:2485. 找出中枢整数(python3解法)

难度&#xff1a;简单 给你一个正整数 n &#xff0c;找出满足下述条件的 中枢整数 x &#xff1a; 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数&#xff0c;则返回 -1 。题目保证对于给定的输入&#xff0c;至多存在一个中…

ChatGPT和API发生重大中断!

11月9日凌晨&#xff0c;OpenAI在官网发布&#xff0c;ChatGPT和API发生重大中断&#xff0c;导致全球所有用户无法正常使用&#xff0c;宕机时间超过2小时。 目前&#xff0c;OpenAI已经找到问题所在并进行了修复&#xff0c;但仍然不稳定&#xff0c;会继续进行安全监控。 …

3.前端调式

1. Elements 先来看这张图最上头的一行是一个功能菜单&#xff0c;每一个菜单都有它相应的功能和使用方法&#xff0c;依次从左往右来看 箭头按钮 用于在页面选择一个元素来审查和查看它的相关信息&#xff0c;当我们在Elements这个按钮页面下点击某个Dom元素时&#xff0c;箭…

[量化投资-学习笔记008]Python+TDengine从零开始搭建量化分析平台-CCI和ATR

目录 1. 指标简介CCIATR 2. 程序编写题外话 1. 指标简介 将这两个指标放在一起&#xff0c;一方面是因为这两个指标都属于摆动指数&#xff0c;可以反应市场的活跃度。 另一方面是因为CCI和ATR与之前提到的EMA,MACD,布林带的三个指标的计算基础不同。之前的三个指标都是以收盘…

Oracle迁移(RAC变单机模式)

1.升级内核 systemctl stop firewalld systemctl disable firewalldrpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm yum --enablerepo"elrepo-kernel" list --showduplic…

【MySQL】手把手教你centos7下载MySQL

centos7下载MySQL 前言正式开始卸载不需要的环境&#xff08;如果你之前没有安装过数据库相关的东西可以跳过&#xff09;下载mysql登录mysql登陆⽅法⼀【不⾏就下⼀个】登陆⽅法⼆【不⾏就下⼀个】登录方式三 前言 安装和卸载MySQL都用系统的root权限&#xff0c;更方便一点&…

SQL优化之MySQL执行计划(Explain)及索引失效详解

1、执行计划基础 1.1、执行计划&#xff08;Explain&#xff09;定义 在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语句&#xff0c;从而解析MySQL 是如何处理 SQL 语句的。 1.2、MySQL查询过程 客户端向 MySQL 服务器发送一条查询请求服务器首先检查查询缓存&am…

SecoClient接收返回码超时解决

第一步&#xff0c;Windows键进入"设置" 第二步&#xff0c;进入"更新与安全" 第三步&#xff0c;找到恢复&#xff0c;点击“高级启动”下的“立即重新启动”&#xff0c;重启电脑&#xff1a;(此时要记住以下步骤) 第四步&#xff0c;重启后选择“疑难解…

下定决心做增长了吗 ——《增长黑客》读后感1

关注我的公众号&#xff0c;并回复【增长黑客】可以获取我整理的《增长黑客》书籍大纲 前言 年中就看完《增长黑客》这本书了&#xff0c;收获还是蛮多的&#xff0c;但因为各种原因&#xff0c;导致我都没有好好做下总结。 前阵子做完总结之后&#xff0c;我就第一时间给组员…

真是性价比之王,腾讯云这款88元云服务器已经圈粉无数!

你是否曾经想过拥有一台属于自己的云服务器&#xff0c;但是却被高昂的价格和复杂的配置吓到了&#xff1f;现在&#xff0c;腾讯云推出了一款价格亲民、简单易用的88元云服务器&#xff0c;让你的梦想成为现实。腾讯云88元/年云服务器配置见下图&#xff1a; 腾讯云88元服务器…

第十六章 反射与注解

通过java的反射机制&#xff0c;程序员可以更深入的控制程序的运行过程。例如&#xff0c;可在程序运行时对象用户输入的信息进行验证&#xff0c;还可以逆向控制程序的执行过程&#xff0c;讲解了反射&#xff0c;另外java还提供了Annotation注解功能&#xff0c;该功能建立在…

Unreal Engine 学习笔记 (3)—— 导入资源

1.导入FBX文件 打开系统文件管理器按下鼠标左键拖动fbx文件到UE编辑器中松开鼠标左键在弹出对话框FBX导入选项页面中&#xff0c;选择对应的骨骼 重定向骨骼 拖动UE4的walk_strafe_back.fbx文件到UE5编辑器中 在弹出的FBX导入选项对话框中选择UE4对应的骨骼 使用重定向资产…