基于python的socket通信

2023-10-31

准备阶段:

        需要导入socket库和threading库,如没有请自行安装,本次任务是在python3.9的编译器下运行(版本可自己选择,并不需要相同)


关于socket

        socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的URL,向服务器发起请求,服务器分析接收到的URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

        socket也分为阻塞式和非阻塞式:

  • 阻塞式的socket的recv服从这样的规则:当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,阻塞直到缓冲区中有数据。
  • 非阻塞式的socket的recv服从的规则是:当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,产生EAGAIN的错误并返回(在Python中会抛出一个异常)。

 正常情况下,socket默认的是阻塞式的,接下来我们看看服务端和客户端的构建。   

服务端与客户端

        服务端创建可供连接的IP地址,accept会一直阻塞,直到有客户端连接才会处理客户端的请求,服务端与客户端的通信流程如下图所示:

 项目代码

服务端:

import socket
import sys
import threading


def server_bind(socket_dict):
    sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建 Socket 连接(TCP)
    print('Socket Created')
    try:
        sock1.bind(('127.0.0.1', 8001))  # 配置 Socket,绑定 IP 地址和端口号 127.0.0.1是本地ip
    except socket.error as e:
        print('Bind Failed...', e)
        sys.exit(0)
    sock1.listen(5)  # 设置最大允许连接数,各连接和 Server 的通信遵循 FIFO 原则
    while True:
        sock, addr = sock1.accept()  # 获得一个客户端的连接(阻塞式,只有客户端连接后,下面才执行)
        print(f'新线程开始处理客户端 {addr} 的请求数据')
        port = addr[1]
        # 存入socket_dict
        socket_dict[port] = sock
        # 新建子线程
        client_linten = threading.Thread(target=deal, args=(sock, addr))
        client_linten.start()  # 启动一个线程


def deal(sock,addr):  # 传入外部(sock,addr)
    while True:  # while循环是为了让对话持续
        data = sock.recv(4096).decode('utf-8')  # 接收客户端数据并且解码, 一次获取 1024b数据(1k)
        # print(data)
        if data in ('exit', ' '):
            print('客户端发送完毕,已断开连接..')
            sock.close()
            break
        else:
            print(f'接收到客户端{addr}发送的信息:%s' % data)
            # print(result)
            # conn.sendall(b'OK')


if __name__ == '__main__':
    socket_dict = {}
    # 新建子线程
    thread_server = threading.Thread(target=server_bind, args=(socket_dict,))
    thread_server.start()
    while True:
        str_input = input("请输入 (端口号,消息) : ")
        segments = str_input.split(',')
        # 判断输入格式是否合法
        if len(segments) == 2:
            if segments[0].isnumeric():
                port = int(segments[0])
                msg = segments[1]
                # 判断套接字是否在于字典里
                if port in socket_dict.keys():
                    sock = socket_dict[port]
                    sock.send(msg.encode("utf-8"))

客户端:

import socket
import threading

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建 Socket 连接
sock.connect(('127.0.0.1', 8001))  # 连接服务器 127.0.0.1是本地ip


def listen_server_txt():
    while True:  # while循环是为了让对话持续
        data = sock.recv(4096).decode('utf-8')  # 接收客户端数据并且解码, 一次获取 1024b数据(1k)
        print('接收到服务端发送的信息:%s' % data)


if __name__ == '__main__':
    listen_server = threading.Thread(target=listen_server_txt, )            #创建一个进程专门监听来自于服务端的信息
    listen_server.start()
    while True:
        input_str = input('请输入发送的内容:')
        if input_str == 'exit':     #判断退出
            sock.send(input_str.encode("utf-8"))
            sock.close()
            break
        if not input_str:       #判断文本为空时,跳出本次循环并重新开始循环
            print("发送内容不得为空")
            continue
        sock.send(input_str.encode("utf-8"))

        本次任务实现了服务端与客户端的双向通信,在连接了三个客户端的同时,服务端也能向指定服务端发送消息,代码量不大,只要认识了通信的规则,就能轻松掌握。

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

基于python的socket通信 的相关文章

随机推荐

  • pandas绘图方法

    一 最简单的方法 df get price 002340 XSHE start date 2017 1 1 end date 2017 10 11 frequency daily fields None skip paused False
  • 909422229_Jeesite 列表数据自定义排序规则

    技术交流群 958923746 有学习视频 文档等 1 列表排序 假排序哦 非数据库排序 page是查询到的列表数据 Collections sort page getList new Comparator
  • 【日志首次上报积分最多】

    题目描述 日志首次上报最多积分 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁 会对服务端造成压力 如果上报太晚 会降低用户的体验 如果一次上报的条数太多 会导致超时失败 为此 项目组设计了
  • windows能访问外网但无法访问虚拟机

    最近一直遇到个头疼的问题 Windows本机上搭了几个Linux虚拟机 不知怎么的 使用Linux虚拟机两两互相访问是可以互相ping通的 但是用Windows主机去访问内部的虚拟机老是提示 无法访问目标主机 第一步 确定虚拟机和Windo
  • Android之RecyclerView线性列表、网格列表实现滑动到指定位置并置顶

    文章目录 前言 一 使用步骤 1 LinearLayoutManager 2 GridLayoutManager 3 LinearSmoothScroller 4 使用 总结 前言 在日常开发中 我们经常会遇到选择事物的需求 例如单选多选
  • Alibaba开源框架COLA的个人心得--COLA框架各层职责

    COLA框架各层职责 1 官网定义 1 适配层 Adapter Layer 负责对前端展示 web wireless wap 的路由和适配 对于传统B S系统而言 adapter就相当于MVC中的controller 2 应用层 Appli
  • 快速排序,快速选择排序,选择排序的区别

    选择排序是对整体序列进行排序 快速排序也是对整体序列进行排序 快速选择算法是快速在未排序的数组中寻找第k小 大的元素 快速选择算法和快速排序的思想是找基准点 在基准点左边的都比他小 然后在基准点右边的都比大这样 但是这两个算法的目的不同 所
  • 硬币系列二

    最近搞了一些稀奇硬币 老潘把他们都用手机拍了下来 但是由于手机镜头焦距所限 并不能让硬币充满整个画面 所以很自然的想法就是 把硬币从图片中裁剪出来 一个正常人的做法是 把需要拍摄特写的物品放在纯净颜色的背景上 这种做法其实也有利于后期的抠图
  • STM32--CAN ID过滤器分析

    1 前言 在CAN协议里 报文的标识符不代表节点的地址 而是跟报文的内容相关的 因此 发送者以广播的形式把报文发送给所有的接收者 节点在接收报文时 根据标识符 CAN ID 的值决定软件是否需要该报文 如果需要 就拷贝到SRAM里 如果不需
  • 配合插件flatten-maven-plugin及${revision}属性在maven多模块项目中可进行全局版本号管理

    父pom
  • 【原创】基于FPGA的数码管按键显示(two_key)

    文档说明 一 背景介绍 心理一直有个疙瘩 总感觉不把数码管玩的溜些 觉得少了些什么东西 念头不通畅 说什么也要拿下 于是 有了这篇文档的产生 二 项目需求 选用开发板上的2个按键 当s1按下后 key cnt计数加2 当s2按下后 key
  • 函数printf()的格式转换

    知识点自用 c语言程序设计p43
  • C# 简介(详细)

    C 是一个现代的 通用的 面向对象的编程语言 它是由微软 Microsoft 开发的 由 Ecma 和 ISO 核准认可的 C 是由 Anders Hejlsberg 和他的团队在 Net 框架开发期间开发的 C 是专为公共语言基础结构 C
  • Android Framework学习(七)之Thread类以及常用同步类

    前言 Thread类是Android为线程操作而做的一个封装 代码在Thread cpp中 其中还封装了一些与线程同步相关的类 本篇博客 我们一起学习Thread类以及常用同步类 Thread类 Thread类的构造函数中的有一个canCa
  • 漫画:什么是服务熔断?

    点击上方 程序员小灰 选择 置顶公众号 有趣有内涵的文章第一时间送达 小灰的答题策略 是遇到难题不断思考 不断思考 一直到考试结束为止 可以用下面这张图流程图来表示 大黄的答题策略 是遇到难题先尝试几次思考 如果尝试一定次数不成功 则果断放
  • vcruntime140_1.dll文件下载及安装方法,详细修复方案

    最近在玩游戏跟打开ps的时候 电脑莫名出现上出现了一个名为vcruntime140 1 dll的错误提示 这个错误提示让我无法正常运行一些软件和游戏 给我的电脑使用带来了很大的困扰 第一时间我就在网上翻阅各种关于vcruntime140 1
  • Python机器视觉--OpenCV进阶(核心)--滤波器之卷积介绍

    滤波器之卷积介绍 1 卷积 1 1 什么是图片卷积 图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程 1 2 卷积步长 步长就是卷积核在图像上移动的步幅 上面例子中卷积核每次移动一个像素步长的结果 如果将这个步长修改为2 结
  • 根据指定时间获取时间(日,周,月,季度,年)

    package Test import java text ParseException import java text SimpleDateFormat import java util TODO author biao date 20
  • linux下安装使用libuuid

    UUID简介 UUID含义是通用唯一识别码 Universally Unique Identifier 这 是一个软件建构的标准 也是被开源软件基金会 Open Software Foundation OSF 的组织应用在分布式计算环境 D
  • 基于python的socket通信

    准备阶段 需要导入socket库和threading库 如没有请自行安装 本次任务是在python3 9的编译器下运行 版本可自己选择 并不需要相同 关于socket socket 的典型应用就是 Web 服务器和浏览器 浏览器获取用户输入