Python中UDP协议的理解

Num01-->Socket简介

Test01-->网络中进程之间如何通信

1,在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。
2,TCP/IP协议族已经帮我们解决了这个问题,即:网络层的ip地址可以唯一标识网络中的主机;而传输层的:协议+端口,可以唯一标识主机中的应用程序(进程)。
3,利用ip地址,协议,端口,就可以标识网络的进程了,网络中的进程通信就可以利用这个标识与其他进程进行交互。

Test02-->什么是Socket?

socket,简称:套接字,是进程间通信的一种方式。socket与其他进程间的通信方式不同在于:它能实现不同主机间的进程间通信。例如:QQ聊天、浏览网页、收发Email等等。

Test03-->创建Socket

在Python中socket模块的函数socket:

socket.socket(AddressFamily,Type)

加以说明:
函数socket.socket创建一个socket,返回一个socket。

AddressFamily:选择AF_INET用于网络中进程间通信或者AF_UNIX用于同一台机器进程间通信,实际工作中常用AF_INET。

Type:套接字类型,可以是SOCK_STREAM,流失套接字,主要用于tcp协议或者SOCK_DGRAM,数据报套接字,主要用于udp协议。

#import socket

# udp:sock_dgram:数据报套接字
# udpSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)
#
#
# tcp:sock_stream:流式套接字
# tcpSocket = socket(AF_INET, SOCK_STREAM)

Num02-->UDP特点

UDP : 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP:是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。

UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

UDP一般用于多点通信和实时的数据业务。例如:语音广播、QQ、视频会议系统等。

Num03-->UDP中客户端和服务器端交互

这里写图片描述

服务器端具体实现代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket


# 服务端
def main():
    # 1,创建数据报套接字
    udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2,绑定本地地址,核心是为绑定并公布端口
    # ''表示指定任意ip:0.0.0.0,系统中任意ip的数据都可以接收
    myAddr = ('', 8080)
    udpSocket.bind(myAddr)
    # 3,接收客户端数据,获得客户端的地址(ip和端口号)
    recData, clientAddr = udpSocket.recvfrom(1024)
    print(clientAddr)
    print(recData.decode())
    # 4,回复客户端消息
    udpSocket.sendto(recData, clientAddr)
    # 5,关闭socket
    udpSocket.close()


if __name__ == '__main__':
    main()

echo服务器端具体实现代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket


# echo服务端,回射服务器,发过来,弹回去
# 单进程单线程,无连接
def main():
    # 1,创建数据报套接字
    udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2,服务端需要绑定:目的是把端口号和ip地址暴露给别人,让别人调用
    # 表示指定任意ip:0.0.0.0,系统中任意ip的数据都可以接收
    myAddr = ('', 8080)
    udpSocket.bind(myAddr)
    while True:
        # 3,接收客户端数据,获得客户端的地址(ip和端口号)
        recData, clientAddr = udpSocket.recvfrom(1024)
        # print(clientAddr)
        print(recData.decode())
        # 4,回复客户端消息
        # udpSocket.sendto(recData, clientAddr)
        sendData = input("服务器!请输入提供的数据:")
        udpSocket.sendto(sendData.encode(), clientAddr)
    # 5,关闭socket
    udpSocket.close()


if __name__ == '__main__':
    main()

客户端具体实现代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket


# 客户端
def main():
    # 1,创建udp类型的socket
    udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2,指定目的地址(ip和端口号
    serverAddr = ('192.168.105.125', 8080)
    while True:
        # 3,发送数据
        sendData = input("客户端!请输入请求数据:")
        udpSocket.sendto(sendData.encode(), serverAddr)

        # 4,接收数据是一个元组,本次接收数据的最大长度,建议是2^xxx次方
        receData, peerAddr = udpSocket.recvfrom(1024)

        print(receData.decode())
        # print(peerAddr)

    # 5,关闭socket
    udpSocket.close()


if __name__ == '__main__':
    main()

绑定端口的说明:

1,一般情况下,在电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定。但是如果需要做成一个服务器端的程序的话,是需要绑定的。

2,一个udp网络程序,可以不绑定端口,此时操作系统会随机进行分配一个端口,如果重新运行此程序,端口可能会发生变化。

3,一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区分收到的网络数据是否是此进程的。

Num04-->UDP网络通信过程

这里写图片描述

Num05-->多线程聊天室服务器端的实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke

import socket
from threading import Thread


def task_recv(s):
    while True:
        recvData, peerAddr = s.recvfrom(1024)
        print('子线程接收:ip地址 %s :  消息 %s' % (str(peerAddr), recvData.decode()))


def task_send(s, addr):
    while True:
        sendData = input('亲!请提供返回的数据:')

        s.sendto(sendData.encode(), addr)


def main():
    # 1.创建udp数据报套接字
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2.绑定本地地址,核心是为绑定并公布端口
    myAddr = ('', 8080)  # ''表示指定任意ip 0.0.0.0 系统中任意ip的数据都可以接收
    serverSocket.bind(myAddr)

    # 3.主线程收到消息,获得对方的ip,port
    recvData, peerAddr = serverSocket.recvfrom(1024)

    print('主线程接收:ip地址 %s :  消息 %s' % (str(peerAddr), recvData.decode()))

    # 4.启动接收消息线程
    thread_recv = Thread(target=task_recv, args=(serverSocket,))
    thread_recv.start()

    # 5.再启动发送消息的线程,传递对方的ip port
    thread_send = Thread(target=task_send, args=(serverSocket, peerAddr))
    thread_send.start()

    # 6,等待子线程结束
    thread_recv.join()
    thread_send.join()


if __name__ == "__main__":
    main()

Num06-->UDP中广播

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
from socket import *


def main():
    # 1,创建socket,数据报套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    # 2,设置允许广播
    # 设置socket属性,是否允许广播,1就是允许
    udp_socket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
    # 3,指定广播地址(“broadcast”,2425)
    broadcast_addr = ('<broadcast>', 8080)

    # 4,发送消息,以下以飞秋软件演示
    send_data = b'1:100:will:will-pc:32:will broadcast'
    udp_socket.sendto(send_data, broadcast_addr)
    udp_socket.close()


if __name__ == '__main__':
    main()

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

推荐阅读更多精彩内容

  • 11.1 引言 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一...
    张芳涛阅读 2,762评论 1 6
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,028评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,042评论 0 8
  • 网络概念第一天 两台电脑怎么通过网络传输数据?怎样才能知道传输的是数据?谁摸过网线? 看电影,怎么看的?通过电流,...
    小吖朱阅读 1,517评论 0 1
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,568评论 2 57