python学习笔记—— socket编程

2023-11-10

上篇:https://blog.csdn.net/qq_42489308/article/details/89388112

socket编程

什么是socket?

简称套接字,是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机

间的进程间通信,我们网络上各种各样的服务大多数是基于socket来完成通信的。

socket是基于C/S架构的,也就是说socket网络编程,通常需要写两个文件,一个服务端,一个客户端

Python中的socket通信逻辑如下图所示

 

在python中,用socket.socket()方法来创建套接字

s = socket.socket([family[, type[, proto]]])

参数说明:

family:套接字家族,可以使用AF_UNIX或者AF_INET

type:套接字类型,分为SOCK_STREAM或者SOCK_DGRAM,分别代表TCP和UDP

protocol: 一般不填默认为0

注意

1.python3以后,socket传递的都是bytes类型的数据,字符串需要先转换一下,string.encode()即可;另一端在接收数据的时候需要bytes转换成字符串,只要bytes.decode()一下就可以

2.在正常通信时,accept()和recv()方法都是阻塞的。所谓的阻塞,指的是程序会暂停在哪,一直等数据过来

socket编程思路

服务端 TCP

1 创建套接字,绑定套接字到本地IP与端口:socket.socket(scoket.AF_INET,socket.SOCK_STREAM), s.bind()

2 开始监听链接:s.listen()

3 进入循环,不断接受客户端的链接请求:s.accept()

4 接收传来的数据,或者发送数据给对方:s.recv() , s.sendall()

5 传输完毕后,关闭套接字:s.close()

客户端

1 创建套接字,连接服务器地址:socket.socket(scoket.AF_INET,socket.SCOK_STREAM),s.connect()

2 连接后发送数据和接收数据: s.sendall(),s.recv()

3 传输完毕后,关闭套接字:s.close()

python的socket编程,通常可以分为TCP和UDP编程两种,前者是连接的可靠传输服务,每次通信都要握手,结束传输也要挥手,数据会被检验,是使用最广的通用模式;后者是不带连接的传输服务,简单粗暴

TCP编程

服务器端:

import socketip_port = ('127.0.0.1', 9999)

sk = socket.socket()            # 创建套接字

sk.bind(ip_port)                # 绑定服务地址

sk.listen(5)                    # 监听连接请求

print('启动socket服务,等待客户端连接...')

conn, address = sk.accept()    # 等待连接,此处自动阻塞

while True:    # 一个死循环,直到客户端发送‘exit’的信号,才关闭连接

    client_data = conn.recv(1024).decode()      # 接收信息

    if client_data == "exit":      # 判断是否退出连接

        exit("通信结束")

    print("来自%s的客户端向你发来信息:%s" % (address, client_data))

    conn.sendall('服务器已经收到你的信息'.encode())    # 回馈信息给客户端

conn.close()    # 关闭连接

客户端:

import socket

ip_port = ('127.0.0.1', 9999)

s = socket.socket()    # 创建套接字

s.connect(ip_port)      # 连接服务器

while True:    # 通过一个死循环不断接收用户输入,并发送给服务器

    inp = input("请输入要发送的信息: ").strip()

    if not inp:    # 防止输入空信息,导致异常退出

        continue

    s.sendall(inp.encode())

    if inp == "exit":  # 如果输入的是‘exit’,表示断开连接

        print("结束通信!")

        break

    server_reply = s.recv(1024).decode()

    print(server_reply)

s.close()      # 关闭连接

虽然服务器和客户端在一对一的情况下,工作良好,但是,如果有多个客户端同时连接同一个服务器呢?结果可能不太令人满意,因为服务器无法同时对多个客户端提供服务。为什么会这样呢?因为Python的socket模块,默认情况下创建的是单进程单线程,同时只能处理一个连接请求,如果要实现多用户服务,那么需要使用多线程机制

import socket

import threading

def link_handler(link,clinet):

    print("服务器开始接收来自%s:%s的请求" %(clinet[0],clinet[1]))

while True:

        # 解码为bytes

        clinet_data= conn.recv(1024).decode()

if clinet_data== 'exit':

            print('通讯结束')

break

        print("来自%s的客户端向服务器发来信息: %s"%(clinet,clinet_data))

conn.sendall("服务器已经接收到你的信息了".encode())

IP_PORT= ('127.0.0.1',9999)

s= socket.socket()

s.bind(IP_PORT)

s.listen(5)

print('启迪socket服务,等待客户端连接...')

while True:

    conn,address= s.accept()

t= threading.Thread(target=link_handler,args=(conn,address))

t.start()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python学习笔记—— socket编程 的相关文章

  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 如何以“正确”的方式处理带有空字节的 Python unicode 字符串?

    Question PyWin32 似乎很乐意将 null 终止的 unicode 字符串作为返回值 我想以 正确 的方式处理这些字符串 假设我得到一个像这样的字符串 u C Users Guest MyFile asy x00 x00sy
  • opencv水印周围的轮廓

    我想在图像中的水印周围画一个框 我已经提取了水印并找到了轮廓 但是 不会在水印周围绘制轮廓 轮廓是在我的整个图像上绘制的 请帮我提供正确的代码 轮廓坐标的输出为 array 0 0 0 634 450 634 450 0 dtype int
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • Elasticsearch 通过搜索返回拼音标记

    我用语音分析插件 https www elastic co guide en elasticsearch plugins current analysis phonetic html由于语音转换 从弹性搜索中进行一些字符串匹配 我的问题是
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud

随机推荐

  • RT1配置文件

    RT1 sh run Building configuration Current configuration hostname RT1 ipv6 unicast routing syslog buffer 64 level DEBUG c
  • git基础语法(一)

    1 常用命令 git clone 克隆项目把远程仓库拉取到本地 git clone 地址 分支 默认master git clone git gitee com liuzhenyu666 test0130 git 默认拉取master分支代
  • 串行、并行、同步和异步:通信与数据传输的核心概念及应用举例

    当涉及到通信和数据传输时 串行 并行 同步和异步是一些重要的概念 下面我将为您编写一篇关于这些概念的详细博客文章 串行 并行 同步和异步 通信与数据传输的核心概念 1 串行与并行 串行 Serial 指的是逐个传输数据位 一次只传输一个位
  • 编写高质量代码:改善Java程序的151个建议(第1章建议1~5)

    本系类文章 用来记录 编写高质量代码 改善java程序的151个建议 这本书的读书笔记 方便自己查看 也方便大家查阅 在此感谢原书作者秦小波对java的独特见解 帮助java爱好者的成长 由于篇幅原因本人将读书笔记采取分批记忆的方式来进行记
  • CNN - 卷积神经网络输入层

    数据输入层 Input Layer 1 数据预处理 进行预处理的主要原因是 输入数据单位不一样 可能会导致神经网络收敛速度慢 训练时间长 数据范围大的输入在模式分类中的作用可能偏大 而数据范围小的作用就有可能偏小 由于神经网络中存在的激活函
  • 双向绑定鼠标移入移出事件解决左右拼接table鼠标移到目标表格样式同步展示问题

    问题 用两个表格tabale显示一组同源数据 两个table显示数组的需求不同 但是相关联 当鼠标移入移出相应 行 也就是 的时候 另一个table表格中相依 行 也要动态显示出来对应 css样式 思路 利用两个不同得table元素下的 添
  • 华为机试原题4.26

    1 报数游戏 输入一个整数m 有1 lt n lt 100个人参与报数游戏 从1 2 m报数 报m的人淘汰 下一轮接着从1开始报数到m 一直循环 直到剩下的人数小于m时停止 输入 m 输出 最终剩下的m 1个数 例 输入 3 输出 58 9
  • 解决eclipse安装了spring ide插件,但是在window-preferences里没有spring相关的选项的问题

    很多人的myeclipse eclipse装了spring插件后 出现了一些问题 大家装了spring插件之后 myeclipse eclipse就会显示如下图 我这里也没有spring的相关选项 但是 在项目里new右键菜单以及首首选项都
  • 容灾恢复

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 涉及 企业运维 网络安全 应用开发 物联网 人工智能 大数据 学习知识 花开堪折直须折 莫待无花空折枝 作者主
  • 响应式布局的实现方法和原理

    昨天我在马海祥博客上跟大家详细的介绍过 什么是响应式网页设计 我觉的响应式网页设计不仅仅是一种趋势 还更是一个新的设计解决方案 它有助于解决不同的分辨率和设备 台式电脑 笔记本电脑 平板 手机 相关的设计问题 既然是设计的问题 这里就会涉及
  • 怎样编写好的API?看完你就知道了!

    点击上方 编程技术圈 关注 星标或置顶一起成长 后台回复 大礼包 有惊喜礼包 每日英文 Do a plain and neat person looking to stay in the small and light things awa
  • Flutter 如何实现禁止手机横屏的功能

    来源 https sexywp com flutter disable landscape mode htm 在一些特定的 App 里 我们不希望手机横屏的时候 App 发生旋转 比如微信 企业微信都是这样的 代码可以这样设定 import
  • C 标准库 - 《stdlib.h》

    原文链接 https www runoob com cprogramming c standard library stdlib h html 简介 stdlib h 头文件定义了四个变量类型 一些宏和各种通用工具函数 库变量 下面是头文件
  • 基础知识:虚拟机的构成和cpu的虚拟化

    1 计算虚拟化包括了 一虚多 和 多虚一 现在阶段硬件能力过盛 一虚多 成为主流 2 裸金属架构更适合部署在资源池内如VMWARE CitrixXenServerv RHEV 适合企业使用 寄居架构适合单机 适合个人折腾 3 全虚拟化和半虚
  • vscode配置golang远程开发调试环境

    1 vscode配置golang远程开发调试环境 文章目录 1 vscode配置golang远程开发调试环境 1 1 golang远程开发应用场景 1 2 远程开发调试环境搭建 1 3 远程debug运行配置 1 1 golang远程开发应
  • [以太坊源代码分析] IV. 椭圆曲线密码学和以太坊中的椭圆曲线数字签名算法应用

    数字签名算法在Ethereum中的应用不少 目前已知至少有两处 一是在生成每个交易 Transaction tx 对象时 对整个tx对象进行数字签名 二是在共识算法的Clique算法实现中 在针对新区块进行授权 封印的Seal 函数里 对新
  • Vue-Cli的简单入门使用

    说明 这篇文章是为了让我和组里同学快速上手 学会使用Vue Cli的基本使用而写的 里面可能有许多错误 还请仔细识别 当然 欢迎指正 Vue Cli简单使用 说明 框架的创建 创建代码 安装时报错及解决办法 安装完毕后的构建操作 报错及解决
  • 必看五大安全趋势 Fortinet全球威胁态势报告发布

    全球领先的网络安全解决方案提供商Fortinet NASDAQ FTNT 于近日发布2021年下半年 全球威胁态势报告 据报告显示 当前全球网络攻击的自动化和攻击速度均显著提升 更具破坏性 不可预测性且更加持续的网络犯罪正快速演进 此外 伴
  • win10+使用cmake编译最新的ceres-solver库

    参考文献 点击这里访问 感谢大佬 说明 我这个只编译了release版本 如果还需要debug版本 cmake编译和vs编译都需要另外设置一些东西 我没有弄 文章目录 参考文献 说明 1 需要使用的库 2 需要的工具 3 准备工作 3 1
  • python学习笔记—— socket编程

    上篇 https blog csdn net qq 42489308 article details 89388112 socket编程 什么是socket 简称套接字 是进程间通信的一种方式 它与其他进程间通信的一个主要不同是 它能实现不