端口的问题以及绑定端口

  • 使用udp发送
  • udp绑定信息
  • python3编码问题及解决
  • 网络通信过程
  • 测试
  • udp应用:echo服务器


使用udp发送

使用udp发送数据时,在每一次都需要写上接受方的ip和端口号(port)

python 进程 nohup Python 进程绑定端口_python 进程 nohup

python 进程 nohup Python 进程绑定端口_端口号_02

python 进程 nohup Python 进程绑定端口_端口号_03

每次使用的端口号都是不一样的,哪怕使用的是相同的程序,每次使用套接字都是使用的不同的端口,

python 进程 nohup Python 进程绑定端口_数据_04

在同一个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)

python 进程 nohup Python 进程绑定端口_套接字_05

这里可以看见端口是不变的,发送方其实可以不绑定,但是接受数据的一方必须绑定,此时使用的是软件自动绑定固定端口,接受数据绑定:

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发送数据到电脑上:

python 进程 nohup Python 进程绑定端口_套接字_06

这里可见当绑定固定的ip和端口后,数据可以被接受到。

python 进程 nohup Python 进程绑定端口_套接字_07

这里是接受的过程,而且是可以是同时进行的。

这里的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)

python 进程 nohup Python 进程绑定端口_套接字_08

**接收之后,将接受的消息解包,分开存放。 **

网络通信过程

python 进程 nohup Python 进程绑定端口_端口号_09

同快递一样

python 进程 nohup Python 进程绑定端口_端口号_10

python 进程 nohup Python 进程绑定端口_端口号_11

这里面的消息会将端口号和消息视为一个东西。

python 进程 nohup Python 进程绑定端口_数据_12

之后到硬件层次会再加一个mac地址

python 进程 nohup Python 进程绑定端口_python_13

之后在另一个的接收端接受消息先解开mac地址,当目的地址和目标硬件相同时,进行ip地址解包,之后判断ip是否和目的ip相同,最后解包端口号到本机的对应软件。

python 进程 nohup Python 进程绑定端口_端口号_14

测试

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、运行现象

** 测试端:**

python 进程 nohup Python 进程绑定端口_python 进程 nohup_15

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

这里每次收到消息,都会返回接受的消息。