python的网络通讯 :UDP以及TCP
一般的网络t通讯就是,让在网络中不同的电脑上的软件能够进行数据传递,即网络中不同主机进程之间的通信!
而python里实现网络通讯是有UDP和TCP两种实现方式!
UDP 协议:是一种无状态的连接方式,它是一种报文型的连接,也就是它只会把数据发送过去,但是对于数据是否正确发送到达,并且对于在发送过程中出现的各种问题,它都不会关心!它的特点就是快!
udp传输代码实现的流程图
以下实现udp的代码段,udp没有服务器与浏览器之分,是根据指定的ip与端口之分,
import socket
def main():
# . 创建udp socket套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
send_data = input("请输入要发送的数据:")
dest_addr = ("ip地址", 6666)
udp_socket.sendto(send_data.encode("utf-8"), dest_addr)
recv_data = udp_socket.recvfrom(1024)
recv_info = recv_data[0] # bytes-->string :解码
recv_ip = str(recv_data[1])
print("接收到的信息是%s, 来自>>>%s" % (recv_info, recv_ip))
# 关闭socket
udp_socket.close()
if __name__ == '__main__':
main()
TCP协议:也叫传输控制协议,它是一种面向连接的字节流传输协议!它有几大特性:
1.在建立连接之前会有三次握手,结束连接时有四次挥手!三次握手即:浏览器会先发送一个数据包请求给服务器,然后服务器接到数据包后会根据预定的算法做一定的处理,然后把数据包发送回浏览器,并且同时也发送一个请求连接的数据包,浏览器接收到数据包后会先对上一次发送的请求数据包进行效验,当确认无误后在对服务器发送的请求数据包进行处理然后返回给服务器,最后服务器接受到数据包并效验无误后就会正式建立连接进行正式数据的传输!这个过程的目的其实是为了确认浏览器与服务器双方是否都能正确无误的收发数据!
四次挥手:即在当Tcp连接的双方任何一方想要结束连接时都会有一个确认关闭连接的过程,(关闭连接请求浏览器与服务器都可以发送!)即想要关闭连接的一方向另一方发送一个连接请求,如果说另一方正在给这边发送数据的话,它会等到所有要发送的数据完整的发送完,在给这边发送给一个可以关闭连接的应答,而想要中断连接的那一边发送结束连接后在进入一个w'ait的等待状态,知道另一方给这边发送可以结束连接的响应后它会再给被动结束的那一方再发一个得到响应的应答,而被动结束连接的那一边接受到主动连接的应答后,才会给一个应答后率先关闭连接,最后请求关闭连接那一端才会关闭连接!这次四次握手的那么墨迹的过程,只要作用时为了确保中断的时候的正在发送的数据能正常到达,避免造成数据的损失,我觉得是对传输过程发送数据的完整型的一种负责体现吧!
2.Tcp协议还有其他可靠传输的机制:
(1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
(2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
(3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
(4) 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
以下时tcp的代码实现流程图
实现tcp的代码段,TCP有服务端与客户端之分,在服务端上必须绑定ip以及端口,并且进行监听:
#以下为python实现tcp协议服务端的代码段
import socket
def tcp_server():
# 1. 创建服务端的socket对象,用来监听客户端的请求
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定ip端口
tcp_server_socket.bind(("这里是ip地址", 6666))
# 3. server_socket 开启监听,由主动模式变为被动监听模式
tcp_server_socket.listen()
print("服务端已经监听客户端的请求")
# 4. 等待接收客户端的请求
# new_client_sock: 为请求的客户端单独创建一个socket对象,实现与客户端的通信
# client_addr :客户端的地址
new_client_sock, client_addr = tcp_server_socket.accept()
print("接收到来自%s 的请求" % str(client_addr))
# 5. 接收由客户端发送过来的数据
recv_data = new_client_sock.recv(1024)
print("接收到客户端的数据:", recv_data)
# 6. 发送数据给客户端
new_client_sock.send("啦啦啦,我是可爱的服务端!".encode("utf-8"))
# 7. 关闭与客户端对接的socket对象,不再与当前客户端通信
new_client_sock.close()
# 8. 关闭server_socket, 不再接收新的客户端请求
tcp_server_socket.close()
#--------------------------------------------------------------------------
#这是一个实现tcp客户端的简单的代码段
def tcp_cli():
# 1. 创建tcp socket对象
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 客户端需要指定端口地址,就像我们浏览器访问网页需要输入一个域名
server_ip = input("服务端的ip:")
server_port = input("服务端的端口号:")
tcp_client_socket.connect((server_ip, int(server_port)))
# 3. 发送数据给服务端
send_data = input("啦啦啦!我是威猛的客户端!:")
tcp_client_socket.send(send_data.encode("utf-8"))
# 4. 等待接收 服务端回传的数据
# recv_data=tcp_client_socket.recvfrom(1024)
recv_data = tcp_client_socket.recv(1024)
print("收到的数据:",recv_data)
# 5. 关闭连接,关闭socket
tcp_client_socket.close()