端口的问题以及绑定端口
- 使用udp发送
- udp绑定信息
- python3编码问题及解决
- 网络通信过程
- 测试
- udp应用:echo服务器
使用udp发送
使用udp发送数据时,在每一次都需要写上接受方的ip和端口号(port)
每次使用的端口号都是不一样的,哪怕使用的是相同的程序,每次使用套接字都是使用的不同的端口,
在同一个OS里面不能重复使用统一的端口,在端口被释放前,不能使用这个端口,因为端口在一个ip下代表一个进程,两个进程使用同一个端口,会导致数据接受失败。或者两个进程分不同时间接受到数据。
当在登陆QQ或者别的软件时候,会自动发送广播,通知上线消息,但是是在底层里实现的。
udp绑定信息
为了让软件使用固定的端口,为了方便访问。
from socket import *
upScoket = socket(AF_INET, SOCK_DGRAM)
# 这里创建了一个套接字。
upAddr = ('192.168.0.100', 8080)
# 这里是想要对话的ip外加端口
information = input("你说句话啊!")
information = information.encode()
bindAddr = ('', 7788) # 这里是绑定的端口,前面不写是指的是使用默认的ip,但是端口是绑定的。
upScoket.bind(bindAddr) # 这里将套接字绑定在设置的端口上
upScoket.sendto(information, upAddr)
# upScoket.sendto(information,upAddr)
这里可以看见端口是不变的,发送方其实可以不绑定,但是接受数据的一方必须绑定,此时使用的是软件自动绑定固定端口,接受数据绑定:
from socket import *
upScoket = socket(AF_INET, SOCK_DGRAM)
# 这里创建了一个套接字。
upAddr = ('192.168.0.100', 8080)
# 这里是想要对话的ip外加端口
# information = input("你说句话啊!")
# information = information.encode()
bindAddr = ('', 7788) # 这里是绑定的端口,前面不写是指的是使用默认的ip,但是端口是绑定的。
upScoket.bind(bindAddr) # 这里将套接字绑定在设置的端口上
# upScoket.sendto(information, upAddr)
# upScoket.sendto(information,upAddr)
#接受数据
receive_data=upScoket.recvfrom(1024)#这里写的是一次只能收1024个字节
print(receive_data)
这里将从App发送数据到电脑上:
这里可见当绑定固定的ip和端口后,数据可以被接受到。
这里是接受的过程,而且是可以是同时进行的。
这里的scoket是全双工,在接受的时候可以发送,不绑定端口的话,肯定收不到的。
python3编码问题及解决
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
desip = input("输入目的ip")
desport = int(input("请输入目的端口:"))
sendData = input("请输入发送的数据:")
s.sendto(sendData.encode("utf-8"), (desip, desport))
这里的encode设置的解码方式是utf-8。
from socket import *
udpaocket=socket(AF_INET,SOCK_DGRAM)
recaddr=('',7788)
udpaocket.bind(recaddr)
upAddr = ('192.168.0.100', 8080)
recfrom=udpaocket.recvfrom(1024)
content,distinfo=recfrom
print(content.decode("gb2312")+"第一个")
print(distinfo)
**接收之后,将接受的消息解包,分开存放。 **
网络通信过程
同快递一样
这里面的消息会将端口号和消息视为一个东西。
之后到硬件层次会再加一个mac地址
之后在另一个的接收端接受消息先解开mac地址,当目的地址和目标硬件相同时,进行ip地址解包,之后判断ip是否和目的ip相同,最后解包端口号到本机的对应软件。
测试
from socket import *
def main():
udpsocket = socket(AF_INET, SOCK_DGRAM)
recAddr = ('', 8877)
udpsocket.bind(recAddr)
while (True):
information = udpsocket.recvfrom(1024)
information1, information2 = information
print(information1.decode('gb2312'))
# print(information2.decode("gb2312"))
if __name__ == '__main__':
main()
pass
注意将设计的东西进行封装,而且注意每个端口只能绑定一次,注意将文件封装,做成函数。
udp应用:echo服务器
1、运行现象
** 测试端:**
from socket import *
def main():
udpsocket = socket(AF_INET, SOCK_DGRAM)
recAddr = ('', 8877)
udpsocket.bind(recAddr)
while (True):
information = udpsocket.recvfrom(1024)
information1, information2 = information
print(information1.decode('gb2312'))
udpsocket.sendto(information1, information2)
# 这里的information1是地址,information2是发送的东西,此时每次收到消息都会将消息返回
# print(information2.decode("gb2312"))
if __name__ == '__main__':
main()
pass
这里每次收到消息,都会返回接受的消息。