Python网络 udp

网络通信概念

⽹络就是⼀种辅助双⽅或者多⽅能够连接在⼀起的⼯具

让不同电脑上运行的软件之间,可以相互传递数据,就需要借助网络功能。
网络能够把多方链接在一起,然后可以进行数据传递

ip地址

ip地址用来在网络中标记一台电脑
ip地址包括两部分网络地址主机地址

查看本机ip地址
windows cmd
ipconfig
Linux 终端
ifconfig

Ubuntu网卡
打开 ifconfig eth0 up
关闭 ifconfig eth0 down

ip地址分类
ipv4
IPv4中规定IP地址长度为32,即有2^32-1个地址

  • A类IP地址由1字节的⽹络地址和3字节主机地址组成,⽹络地址的最⾼位必须是“0”,
    地址范围1.0.0.1-126.255.255.254
  • B类IP地址由2个字节的⽹络地址和2个字节的主机地址组成,⽹络地址的最⾼位必须 是“10”,地址范围128.1.0.1-191.255.255.254
  • 个C类IP地址由3字节的⽹络地址和1字节的主机地址组成,⽹络地址的最⾼位必须 是“110”
    范围192.0.1.1-223.255.255.254
  • D类地址⽤于多点⼴播
    D类IP地址第⼀个字节以“1110”开始,它是⼀个专⻔保留的地址。
    它并不指向特定的⽹络,⽬前这⼀类地址被⽤在多点 ⼴播(Multicast)
    多点⼴播地址⽤来⼀次寻址⼀组计算机 s 地址范围224.0.0.1-239.255.255.254
  • 以“1111”开始,为将来使⽤保留
    E类地址保留,仅作实验和开发⽤
  • 私有ip 在这么多⽹络IP中,国际规定有⼀部分IP地址是⽤于我们的局域⽹使⽤,也就
    是属于私⽹IP,不在公⽹中使⽤的,它们的范围是:
    10.0.0.0~10.255.255.255
    172.16.0.0~172.31.255.255
    192.168.0.0~192.168.255.255

ipv6
IPv6的地址空间更大
IPv6中IP地址的长度为128,即有2^128-1个地址

端口

端⼝是通过端⼝号来标记的,端⼝号只有整数,范围是从0到65535
端口就好像一个房子的门,是出入这间房子的必经之路。

如果一个程序需要收发网络数据那么就需要端口

知名端口

知名端口是周所周知的默认端口:范围从0到1023
如:
80端口用于http服务
21端口用于FTP服务

动态端口

动态端口1024到65535
不固定分配某种服务,而是动态分配
动态分配是指当⼀个系统程序或应⽤程序程序需要⽹络通信时,它向主机申请⼀个端⼝, 主机从可⽤的端⼝号中分配⼀个供它使⽤。
当这个程序关闭时,同时也就释放了所占⽤的端⼝号

怎么查看端口?

⽤“netstat -an”查看端⼝状态
lsof -i [tcp/udp]:2425

套接字

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,socket属于全双工。
不同电脑上的进程之间如何通信
ip地址 + 协议 + 端口
参数一,参数二
ipv4 , udp/tcp

在1台电脑上可以通过进程号(PID)来唯⼀标识⼀个进程,但是在⽹络中这是⾏不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,⽹络层的“ip地址”可以唯⼀标识⽹络中的 主机,⽽传输层的“协议+端⼝”可以唯⼀标识主机中的应⽤进程(进程)。
这样利⽤ip地址,协议,端⼝就可以标识⽹络的进程了,⽹络中的进程通信就可以利⽤这 个标志与其它进程进⾏交互

创建socket

在 Python 中 使⽤socket 模块的函数 socket 就可以完成:
import socket
socket.socket(AddressFamily, Type)

使用 udp⽹络程序-发送数据

创建⼀个基于udp的⽹络程序流程很简单,具体步骤如下:

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字

网络UDP

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议。一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。类似于日常生活中写信的场景,不需要建立链接,不关心发送结果。

网络udp通信实现步骤

# 1、创建套接字
Udp_socket = Socket.socket(socket. AF_INET, socket.SOCK_DGRAM)

# 2、绑定端口 作为客户端udp一般不绑定端口号
Udp_socket.bind((“”, 7788))  # ip地址不写,默认本机任何一个ip

# 3、发送数据
Socket.sendto(‘hello python’.encode(‘utf-8), (192.168.21.66, 7788))

#4、接收数据
Recv_data = Socket.recvfrom(1024)  # 返回元组信息包含数据和发送方的ip以及端口

# 5、关闭套接字
Socket.close()

Encode()和decode()函数的用法
  • Str.Encode(‘utf-8’),把字符串编码成字节码,utf-8代表的是国际码,gbk代表的是汉字码

  • Bytes.decode(‘utf-8’),把字节码解码成字符串。

>>>	text	=	'我是⽂本' 
>>>	text '我是⽂本' 
>>>	print(text) 我是⽂本 
>>>	bytesText	=	text.encode() 
>>>	bytesText b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac' 
>>>	print(bytesText) b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac' 
>>>	type(text) <class	'str'> 
>>>	type(bytesText) <class	'bytes'> 
>>>	textDecode	=	bytesText.decode() 
>>>	textDecode '我是⽂本' 
>>>	print(textDecode) 我是⽂本

udp聊天程序demo

import socket

def send(udp_socket):
    # 发送的功能
    data = input("请输入要发送的内容:")
    ip = input("请输入IP:")
    udp_socket.sendto(data.encode('utf-8'),(ip,8080))
    return


def recv(udp_socket):
    # 接收的功能
    recv_data = udp_socket.recvfrom(1024)
    recv_addr = recv_data[1]
    recv_msg = recv_data[0]
    print("%s %s" % (str(recv_addr), recv_msg.decode('gbk')))
    return


def main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 绑定地址
    localaddr = ("",8080)
    udp_socket.bind(localaddr)

    # 进入while循环
    while True:
        menu = input("1.发送 2.接收 其他退出:")

        if menu == "1":
            send(udp_socket)
        elif menu == "2":
            recv(udp_socket)
        else:
            break

    # 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

exit(?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值