Python 网络编程2:UDP-发送、接收数据

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

一、UDP 网络程序 - 发送数据

  • 1.1、发送数据的流程

    • 创建套接字
    • 发送数据
    • 关闭套接字
  • 1.2、创建udp的套接字

      udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
  • 1.3、输入套接字发送的内容

    send_data = input("请输入发送的内容:")
    
  • 1.4、发送套接字内容

    • 第一个参数是:发送的内容; 内容要是byte类型,用utf-8转一下

    • 第二个参数是元组类型,元组内两个参数,第一个是:对方的ip地址,第二个是对方的port(端口)

      udp_socket.sendto(send_data.encode('utf-8'),("192.168.3.6",8080))
      
  • 1.5、发送完内容关闭套接字

    udp_socket.close()
    
  • 1.6、完整的udp套接字发送代码(可以把 2 的内容放到while True:循环里面,一直发送数据)

    import socket
    
    def main():
    
          # 1、创建一个udp的套接字
          udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
          # 2、使用udp的socket发送数据
          # 2.1、用键盘输入发送的内容
          send_data = input("请输入发送的内容:")
          # 2.2、使用套接字发送内容
          # 第一个参数是:发送的内容;
          # 第二个参数是元组类型,元组内两个参数,第一个是:对方的ip地址,第二个是对方的port(端口)
          udp_socket.sendto(send_data.encode('utf-8'),("192.168.3.6",8080))
    
          # 3、关闭套接字
          udp_socket.close()
    
    if __name__ == "__main__":
    
            main()
    

    提示:同一台电脑不允许有两个相同的端口,发送端如果不设置端口,电脑就会随机分配端口

二、UDP 网络程序 - 接收数据

  • 2.1、接收数据的流程

    • 创建套接字
    • 绑定本地自己的信息(ip和自己设置的port)
    • 接收数据
    • 关闭套接字
  • 2.2、创建套接字

    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
  • 2.3、绑定本地自己的信息(ip和自己设置的port)

    localaddr = ("",6688) # ip一般不用写,表示本机的任何一个ip,"192.168.3.6"
    udp_socket.bind(localaddr) # 必须绑定自己电脑的ip和port,其他的电脑不行
    
  • 2.4、接收数据(Windows解码是用 dbk,想要一直接收数据,可以把内容放到while True:循环里面,一直接收数据)

    # 3.1、接收内容(参数是允许接收的最大内容)
    receive_data = udp_socket.recvfrom(1024)
    # 3.2、接收的内容分为两部分:一部分是 存储的时候接收的数据,另一部分是发送方的ip和port
    receive_message = receive_data[0] # 存储接收的数据
    receive_addr = receive_data[1] # 存储发送方的地址信息
    print("内容=%s : 对方的信息=%s"%(str(receive_addr),receive_message.decode("utf-8")))
    
  • 2.5、关闭套接字

    udp_socket.close()
    

    提示:同一台电脑不允许有两个相同的端口,接收方必须设置端口,

    • 网络通信过程中,之所需要ip、port等,就是为了能够将一个复杂的通信过程进行任务划分,从而保证数据准确无误的传递

三、一个简单的UDP聊天器

  • 3.1、需求:在一个电脑中编写1个程序,有2个功能

    • 1、获取键盘数据,并将其发送给对方
    • 2、接收数据并显示,并且功能数据进行选择以上的2个功能调用
  • 3.2、代码实现

    import socket
    
    
    def sent_message(udp_socket):
          """发送消息"""
    
          # 2、让用户输入对方的IP和端口号
          dest_ip = input("请输入对方的ip:")
    
          try:
             dest_port = input("请输入对方的port:")
          except:
             print("请输入正确的端口号")
    
          # 3、从键盘获取要发送的数据
          send_data = input("请输入要发送的内容:")
    
         # 4、用套接字发送内容
         udp_socket.sendto(send_data.encode('utf-8'),(dest_ip,dest_port))
    
    
    def receive_message(udp_socket):
             """接收消息"""
    
             # 2、使用 udp_socket 套接字就接收数据,接收内容(参数是允许接收的最大内容)
             receive_data = udp_socket.recvfrom(1024)
             # 3、接收的内容分为两个部分:
             # 一部分是:对方发送的内容
             # 另一部分是:对方的本地信息
             receive_content = receive_data[0].decode('utf-8') # 存储接收的数据
             receive_localAddr = receive_data[1] # 对方的本地信息
    
             print("%s:%s"%(receive_content,receive_localAddr))
    
    
    def main():
           """主函数:聊天神器"""
    
           # 1、创建udp套接字
           udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
           # 2、绑定一个本地的信息
           local_addr = ("",7777)
           udp_socket.bind(local_addr) # 必须绑定自己电脑的ip和port,其他的电脑不行
    
           # 3、功能选择
           print("欢迎使用UDP聊天神器")
    
           # 用循环来处理事情
           while True:
    
               print("1:发送消息\n2:接收消息")
               input_str = input("请输入选择的功能:")
    
               if input_str == "1":
                     # 发送数据
                     sent_message(udp_socket)
               elif input_str == "2":
                     # 接收数据
                     receive_message(udp_socket)
               elif input_str == "0":
                     # 退出程序
                     break
               else:
                   print("请输入正确的功能")
    
           # 4、关闭套接字
           udp_socket.close()
    
    
    if __name__ == "__main__":
    
            main()
    

    提示:以上的程序如果选择了接收数据功能,并且此时没有数据,程序会堵塞在这,那么怎样才能让这个程序收发数据一起进行呢?后面多任务知识之后就解决

四、拓展:通信中的:单工、半工、全双工

单工:表面意思就是单项的操作,其实就是通信的单项传输,如收音机,你只能接收数据
半双工:是既可以发送数据,也可以接收数据,但是二者不能同时进行,如:对讲机,对方说完话,你才可以听到,他说的内容
全双工:发送内容与接收内容是可以同步进行的,如:电话,我们可以听着别人的话,也可以说出话,同时进行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 1,891评论 0 6
  • 代码不好排版,可以到微信订阅号(xuanhun521)查看原文。 Python黑帽编程2.8套接字编程 套接字编程...
    玄魂阅读 601评论 1 2
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,168评论 0 10
  • 网络 理论模型,分为七层物理层数据链路层传输层会话层表示层应用层 实际应用,分为四层链路层网络层传输层应用层 IP...
    FlyingLittlePG阅读 708评论 0 0
  • 赠卫八处士 唐代:杜甫 人生不相见,动如参与商。 今夕复何夕,共此灯烛光。 少壮能几时,鬓发各已苍。 访旧半为鬼,...
    小学生学古诗阅读 692评论 0 0