网络通信udp udp聊天器的python语法实现

IP

Linux

常用命令
查看网卡:ifconfig
关闭网卡:sudo ifconfig ens33 down
关闭网卡:sudo ifconfig ens33 up
重置IP地址:sudo dhclient
注:ens33 根据Ubuntu版本不同而不同,ifconfig查看
(桥接:同一个局域网时使用)

Windows

查看IP
1.cmd
2.网络适配器
3.shift+右键->powershell

IP地址的分类

IP种类
ipv4:四组0~255(不包含0及255)组成
示例:192.168.11.2
ipv6:新版ip,但尚未大量使用
示例:fe80::13d6:1520:a4a5:2aeb/64 Scope:Link
IP分类
在这里插入图片描述
D类:用于多点广播,多点⼴播地址⽤来⼀次寻址⼀组计算机
E类:仅作试验和开发用
私有类:局域网,私网IP
本地回环:自己电脑使用

注:
目的ip:dest ip
源ip:src ip

端口

端口即应用服务程序的路径

端口号

端⼝是通过端⼝号来标记的,端⼝号只有整数,范围是从0到65535

知名端口(Well Known Ports)
知名端⼝是众所周知的端⼝号,范围从0到1023。例如:80端⼝分配给HTTP服务;21端⼝分配给FTP服务。
动态端⼝(Dynamic Ports)
动态端⼝的范围是从1024到65535
动态端⼝不固定分配某种服务,⽽是动态分配。动态分配是指当⼀个系统程序或应⽤程序程序需要⽹络通信时,它向主机申请⼀个端⼝,主机从可⽤的端⼝号中分配⼀个供它使⽤。当这个程序关闭时,同时也就释放了所占⽤的端⼝号。

socket及udp

socket(简称 套接字 ) 是进程间通信的⼀种方式,能实现不同主机间的进程间通信。利⽤ip地址,协议,端⼝标识⽹络的进程,并交互。
注:udp、tcp都属于协议

udp通信

发信息

import socket

def main():
    # 创建一个套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # 绑定本地信息
    udp_socket.bind(("",7788))

    while True:
        # 从键盘获取数据
        send_data = input("请输入要发送的数据:")

        # 如果输入的数据是exit,那么就退出程序
        if send_data == "exit":
            break

        # 使用套接字收发数据
        # udp_socket.sendto(b"消息",对方的ip以及端口port)
        # udp_socket.sendto(b"hahaha",("192.168.11.96",8080))
        udp_socket.sendto(send_data.encode("utf-8"),("192.168.11.96",8080))
    
    # 关闭套接字
    udp_socket.close()

if __name__ == '__main__':
    main()         

注:
socket.AF_INET:ipv4
socket.SOCK_DGRAM:嵌套字类型udp
socket.SOCK_STREAM:嵌套字类型tcp

send_data.encode(“utf-8”)
encode编码(转成字节)
utf-8 Ubuntu发出信息时转码

收信息

import socket

def main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 绑定一个本地信息
    localaddr = ("",7788)
    udp_socket.bind(localaddr) # 绑定自己电脑的ip和port。

    while True:
        # 接收数据
        recv_data = udp_socket.recvfrom(1024)
        # recv_data这个变量中储存的是一个元组(接收到的数据,(发送方的ip,端口port))
        recv_msg = recv_data[0] # 储存接收到的数据
        send_addr = recv_data[1] # 储存发送方的地址信息

        # 打印接收到的数据
        # print(recv_data)
        print("%s:%s" % (str(send_addr),recv_msg.decode("gbk")))

    # 关闭套接字
    udp_socket.close()

if __name__ =="__main__":
    main()

注:
recv_data.decode(“gbk”)
decode解码(转成字符)
gbk Windows发出信息时转码

udp聊天器

import socket

def send_msg(udp_socket):
	"""获取键盘数据,并将其发送给对⽅"""
	# 1. 从键盘输⼊数据
	msg = input("\n请输⼊要发送的数据:")
	# 2. 输⼊对⽅的ip地址
	dest_ip = input("\n请输⼊对⽅的ip地址:")
	# 3. 输⼊对⽅的port
	dest_port = int(input("\n请输⼊对⽅的port:"))
	# 4. 发送数据
	udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
	
def recv_msg(udp_socket):
	"""接收数据并显示"""
	# 1. 接收数据
	recv_msg = udp_socket.recvfrom(1024)
	# 2. 解码
	recv_ip = recv_msg[1]
	recv_msg = recv_msg[0].decode("utf-8")
	# 3. 显示接收到的数据
	print(">>>%s:%s" % (str(recv_ip), recv_msg))
	
def main():
	# 1. 创建套接字
	udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
	# 2. 绑定本地信息
	udp_socket.bind(("", 7890))
	while True:
		# 3. 选择功能
		print("="*30)
		print("1:发送消息")
		print("2:接收消息")
		print("="*30)
		op_num = input("请输⼊要操作的功能序号:")
		
		# 4. 根据选择调⽤相应的函数
		if op_num == "1":
			send_msg(udp_socket)
		elif op_num == "2":
			recv_msg(udp_socket)
		else:
			print("输⼊有误,请重新输⼊...")
			
    # 关闭套接字
    udp_socket.close()

if __name__ == "__main__":
	main()

udp聊天器实现过程
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44850984/article/details/89062124