UDP介绍
每个Ip地址包括两部分:网络地址和主机地址
知名端口号:0 - 1023。不能随便用,有特殊用途。
1024到65535,随便用。
udp实现发送数据
import socket def main(): # 创建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 发送的数据 content = input("请输入你要发送的内容:") # 目标地址 desk_addr = ("127.0.0.1", 8080) # 发数据 udp_socket.sendto(content.encode("utf-8"), desk_addr) # 关闭套接字 udp_socket.close() if __name__ == "__main__": main()
udp实现接收数据
import socket def main(): # 创建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 本地端口 local_addr = ("", 7788) # ip地址不写表示本机任意一个ip # 绑定本地端口 udp_socket.bind(local_addr) # 接收数据 rev_data = udp_socket.recvfrom(1024) # 1024表示本次接受的最大字节数 # 打印数据.(接受到的是一个元组) rev_msg = rev_data[0] # 接收到的数据 send_addr = rev_data[1] # 发送方的地址 print("%s: %s" % (str(send_addr), rev_msg.decode("gbk"))) # windows的编码方式是gbk udp_socket.close() if __name__ == "__main__": main()
单工:类似于收音机
半双工:类似于对讲机
全双工:类似于手机
socket属于全双工
TCP介绍
udp和tcp的区别:udp类似写信模型,每次通信都要带上ip地址和端口等。有可能丢数据,不安全。
tcp类似于打电话,建立连接过程比udp复杂,但是安全。
# tcp-client import socket def main(): tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_ip = "" server_port = 8080 # 连接服务器 tcp_socket.connect((server_ip, server_port)) send_data = input("请输入你要发送的数据") # 发送数据 tcp_socket.send(send_data.encode("utf-8")) # 接受数据 rev_data = tcp_socket.recv(1024) print(rev_data.decode("gdb")) tcp_socket.close() if __name__ == "__main__": main()
# tcp_server import socket def main(): tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server.bind("", 7788) # 监听套接字,负责 等待有新的客户端进行连接 tcp_server.listen(128) # 让默认的套接字由主动变为被动 # client_addr为连接的客户端地址 # accept产生的新的套接字用来为客户端服务 new_client_socket, client_addr = tcp_server.accept() # 接收数据 recv_data = new_client_socket.recv(1024) print(recv_data) # 发送数据 new_client_socket.send("hahaha".encode("utf-8")) new_client_socket.close() tcp_server.close() if __name__ == "__main__": main()
跟udp的区别就是多了监听listen,而且用accept接受连接,产生新的套接字用来为客户端服务
同时为多个客户端服务
# tcp-server import socket def main(): tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server.bind("", 7788) # 监听套接字,负责 等待有新的客户端进行连接 tcp_server.listen(128) # 让默认的套接字由主动变为被动 # client_addr为连接的客户端地址 # accept产生的新的套接字用来为客户端服务 while True: new_client_socket, client_addr = tcp_server.accept() while True: # 接收数据 recv_data = new_client_socket.recv(1024) print(recv_data) # 如果recv解堵塞,那么有2种方式: # 1、客户端发送过来数据 # 2、客户端调用close()导致了这里recv解堵塞 if recv_data: # 发送数据 new_client_socket.send("hahaha".encode("utf-8")) else: break new_client_socket.close() tcp_server.close() if __name__ == "__main__": main()
客户端解堵塞的情况:1、接收到数据;2、调用close()关闭连接。
可以通过数据是否为空判断是哪种类型
udp: tcp(client) tcp(server) socket socket socket bind conect bind sendto/recvfrom send/recv listen close close accept recv/send close