python socket_python—socket单工、半双工模式浅析

概述:通信数据交换方式分为几种模式:全双工、半双工和单工数据传输;

问题:什么是全双工、半双工和单工?

解释: 全双工(Full Duplex)是通讯传输的一个术语。

通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的,四线制。

单工就是在只允许甲方向乙方传送信息,而乙方不能向甲方传送 。

半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。例如,在一个局域网上使用具有半双工传输的技术,一个工作站可以在线上发送数据,然后立即在线上接收数据,这些数据来自数据刚刚传输的方向。像全双工传输一样,半双工包含一个双向线路,两线制。

网络编程:对于python而言,同样支持udp和tcp协议完成全双工、半双工和单工的网络通信,本篇文章浅析python的udp协议实现单工、半双工,全双工后面文章分析;

python在网络编程方面提供了socket标准库用以开发实现单工、半双工的网络编程;

具体有以下几个关键方法:

socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 创建udp协议的套接字

socket.bind(loc_addres) # 绑定地址和端口,注意一个参数,元祖类型;

socket.sendto(b"发送内容byte类型",(send_ip,send_port)) # sendto方法两个参数,发送内容和发送目的机器ip地址和端口,机器ip和端口是元祖类型;

socket.recvfrom(1024) # 接受内容,一个参数单次接受字节数大小;

socket.close() # 关闭套接字

单工实现如下:

发送部分代码实现:

import 

接收部分代码实现:

import socket


def main():
    """实现简单的udp协议单工调试工具"""

    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 绑定程序端口,如不绑定运行后系统随机分配
    loc_addres = ("",7788)
    udp_socket.bind(loc_addres)
    while True:
        # 接收其他机器发送的数据
        udp_data = udp_socket.recvfrom(1024)
        if str(udp_data[1]) == "exit":
            break
        else:
            # 打印接收到的内容
            print("%s,%s" %(str(udp_data[1]),udp_data[0].decode("gbk")))
    #关闭套接字
    udp_socket.close()


if __name__ =="__main__":
    main()

运行如下,一方只发送消息,一方只接收数据;

v2-170f2cf11305cafdc83ad8217194d856_b.jpg

半双弓实现如下:简单的信息交互一个频道;

代码如下:

import socket



def send_msg(udp_socket):
    """发送数据部分"""
    # 发送数据的ip和端口
    send_ip = input("请输入目的机器的ip:")
    send_port = int(input("请输入目的机器的端口:"))
    # 发送内容,不同机器有不同编码格式,在发送时候需要关注转码
    send_data = input("请输入你需要发送的内容:")
    # 发送数据
    udp_socket.sendto(send_data.encode("utf-8"),(send_ip,send_port))  # 发送目的内容和目的机器ip和端口,元祖类型


def recv_msg(udp_socket):
    """接收数据部分"""
    udp_data = udp_socket.recvfrom(1024)  # 接收目的机器的发送内容
    print("%s,%s" %(str(udp_data[1]),udp_data[0].decode("gbk")))


def main():
    """实现简单的udp协议的聊天工具"""

    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 绑定程序端口,如不绑定运行后系统随机分配
    loc_addres = ("",7788)
    udp_socket.bind(loc_addres)
    while True:
        print("-------*****聊天工具v-0.1-----------")
        print("输入0发送数据")
        print("输入1接受数据")
        print("输入2退出")
        req = input("请输入你需要的功能:")
        if req == "0":
            send_msg(udp_socket)
        elif req == "1":
            recv_msg(udp_socket)
        elif req == "2":
            break
        else:
            print("输入有误请重新输入:")
    #关闭套接字
    udp_socket.close()


if __name__ =="__main__":
    main()

接收调试代码如下:因为是本机调试,所以使用了不同的端口,其他部分代码基本相同:

# 绑定程序端口,如不绑定运行后系统随机分配
loc_addres = ("",7799)
udp_socket.bind(loc_addres)

本地调试结果如下:

v2-83938f236ddf9e95fd9f0571221278b0_b.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值