Python之socket-UDP协议通信

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


socket创建:可以使用socket模块下的socket方法来创建。

        参数:AF_INET 用于Internet进程间通信

                  AF_UNIX用于一台机器进程间通信

                  SOCK_DRGAM数据报套接字,主要用于UDP协议

                  SOCK_STREAM流式套接字,主要用于TCP协议通信

        常用指令:

                 sendto :发送数据。sendto("data",("IP",Port))

                bind: 绑定IP及端口。 bind(('IP',Port)) 其中通常情况下IP不写,系统会默认分配。

                recvfrom: 用于接收数据,recvfrom(1024)

   创建socket:

from socket import *
UdpSocket = socket(AF_INET,SOCK_DGRAM)
TcpSocket = socket(AF_INET,SOCK_STREAM)

import  socket
UdpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
TcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

以上两种方式均可以创建DUP、TCP套接字


UDP协议数据发送:

from socket import *
UdpSocket = socket(AF_INET,SOCK_DGRAM)
TcpSocket = socket(AF_INET,SOCK_STREAM)


SendAddr = ('192.168.5.1',8080)
#sendData = input("请输入发送内容")
sendData = "测试UDP套接字"
UdpSocket.sendto(sendData.encode("gb2312"),SendAddr)
使用网络调试助手接收UDP协议数据


    代码讲解:UdpSocket创建一个UDP的socket套接字,SendAddr为目标地址,以元组的形式保留("IP",Prot);sendData为需要发送的数据以字符串形式保存。encode("gb2312")指使用gb2312对内容进行编码;在socket中有一个sendto方法,用于发送UDP数据, 其格式为:sendto(Data,Addr);

    注意:发现在网络助手中发现端口为63218, 在UDP发送中,通常不定义本机端口,系统会随机分配端口。


    UDP协议数据接收:

from socket import *
UdpSocket = socket(AF_INET,SOCK_DGRAM)
TcpSocket = socket(AF_INET,SOCK_STREAM)


AddrBind = ("",8893)
UdpSocket.bind(AddrBind)
TempData = UdpSocket.recvfrom(1024)
print(TempData)

    代码讲解: 创建UDP-socket套接字,使用bind绑定IP及端口,使用recvfrom接收信息,并赋值给TempData,并打印出来。


 例:UDP协议全双工,模式聊天室

from socket import *
from threading import  Thread
UdpSocket = None
AddrIP = ''
AddrPort = 0 

def SendData():
    while True:
        #print(AddrIP,AddrPort)
        Data = input("请输入要发送的信息:")
        UdpSocket.sendto(Data.encode('gb2312'),(AddrIP,AddrPort))
        
def RecvfromData():
    while True:
        TempData = UdpSocket.recvfrom(1024)
        print(">>%s:%s"%(str(TempData[1]),TempData[0]))
        
def main():
    global UdpSocket
    global AddrIP
    global AddrPort
    UdpSocket = socket(AF_INET, SOCK_DGRAM)
    AddrIP = input("请输入目标地址:").strip()
    AddrPort = int(input("请输入目标端口:").strip())
    UdpSocket.bind(('',8893))
    ts = Thread(target=SendData)
    tr = Thread(target=RecvfromData)
    ts.start()
    tr.start()
    ts.join()
    tr.join()

if __name__ == "__main__":
    main()

    代码讲解:通过创建子线程的形式,来分别运行接发函数,从而实现聊天室

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值