python实现网络通信

一、两种网络连接的实现

不管是哪种方式实现网络连接,都需要使用socket,在使用前都需要创建socket对象。

#1、创建socket对象
A_socket = socket.socket(socket.AF_INET,socket.SOCKET_STREAM)
#使用ipv4的第一个参数都选择socket.AF_INE
#第二参数是选择通信模式,使用udp通信选择socket.SOCK_DGRAM
                        #使用tcp通信选择so`在这里插入代码片`cket.SOCK_STREAM

1、udp

udp是不可靠方式,无需建立连接,直接发送,不管是否能够接收。

#udp直接使用sendto方法来进行发送
udp_socket,sendto(send_data.encode("utf-8"),("192.168.49.130",8088))  
#传入的参数有发送的数据和(目的地址和目的端口号)

#接收数据时要先绑定端口号后,调用recvfrom方法接收数据
recv_data = udp_recv_socket.recvfrom(1024) #1024代表最大接收数据为1023字节
#返回的是一个元祖
#recv[0]存放的时接收到的数据
#recv[1]存放的是发送端的IP地址和端口号

2.Tcp

tcp相较与udp稳定得多,在两端通信之前都要先经过三次握手建立连接后才可以相互发送消息,并且在收到对端的消息时,有收到应答。

2.1 tcp客服端

# 1.首先调用connect方法与服务端建立连接
tcp_socket.connect(("10.1.30.12", 8088))
# 2.调用send方法来发送数据,只需传入发送的数据
tcp_socket.send(send_msg.encode('utf-8'))
# 3.调用recv方法可以用来接收数据,在没有收到数据时回阻塞在这个地方
recv_data = tcpSend_socket.recv(1024)

2.2 tcp服务端

# 1.绑定地址和端口
tcp_socket.bind(('', 8088))
# 2.设置套接字为被动连接
tcp_socket.listen(128)

while True:
    # 3.使用accept()方法监听客户端连接,没有客户端连接时处于阻塞状态,
    #   返回值的是一个元组,new_socket是新收到的这个连接的socket对象
    #   client_addr 是一个元组,包含客户端的ip和端口号
    new_socket, client_addr = tcp_socket.accept()
    
    while True:
        try:
            recv_data = new_socket.recv(1024) 
        except ConnectionResetError as e:
            print("连接意外中断:", e)
            break
        if len(recv_data) == 0: #recv()的返回值为空时,代表对端主动关闭连接
            print("客户端请求中断")
            break
   new_socket.close()
tcp_socket.close()

2.3 长连接与短连接

tcp通信可分为两类:长连接与短连接。顾名思义,短连接就是在每次通信前都先建立连接,完成数据发送后,就断开连接。长连接就是一直连接着,有数据通信时直接发送数据,无需再次建立连接。

当有一端调用close()方法断开连接时,另一端的recv方法会解堵塞,不过收到的数据为空,可通过判断收到的数据为空判别另一端调用close方法断开了连接。在遇到异常情况,如网络异常断开时,调用recv()和send()方法都会报错,可通过错误处理来判别网络异常断开。

2.4 使用urllib.request下载文件

import urllib.request

 """有两种方法可实现文件下载""
 #1 直接使用urlretrieve方法
 urllib.request.urlretrieve(file_url, filename=file_name) #传入文件url地址和下载后的文件名字
 
 #2 使用urlopen方法读取后,再写到文件中
 req = urllib.request.urlopen(file_url)
 file_content = req.read()
 with open(file_name, "wb") as f:
     f.write(file_content)

你可能感兴趣的:(python实现网络通信)