udp
端口号
知名端口:系统使用的端口, 范围0-1023
动态端口:程序员给应用程序设置的端口,范围1024-65535,提示:如果程序员没有给程序设置端口号那么系统会自动在1024-65535找一个空闲端口号去设置
socket
翻译中文就是套接字,可以理解成数据的搬运工,负责把数据从一方传递给另外一方,不同电脑之间进程通信使用的工具就是socket,也称为插座,发送数据的时候需要准备一个插座,对方接收数据也要准备一个插座
创建socket:
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
绑定端口bind:绑定端口的时候不需要指定ip地址,因为需要兼容多个网卡的情况
udp_socket.bind(("", 9090))
发送数据格式:发送数据 window 网络调试助手使用gbk解码,乌班图网络调试助手使用utf-8解码
udp_socket.sendto(send_data, ('localhost', 端口号))
接收数据格式: 服务端和客户端必须在同一网段
recv_data, ip_port = udp_socket.recvfrom(1024)
关闭:
udp_socket..close()
发送广播消息
首先,创建socket
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
udp_socket.sendto("大家好,我叫小于同学,多多关照!".encode("gbk"), ("255.255.255.255", 9090))
tcp
客户端
创建:
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
和服务端建立连接:
tcp_client_socket.connect(("192.168.107.160", 9090))
发送数据
tcp_client_socket.send()
接收数据
recv_data = tcp_client_socket.recv(1024)
recv_content = recv_data.decode('utf-8')
关闭
tcp_client_socket.close()
服务端
创建socket(同上)
程序退出,立即释放端口:
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
绑定端口
tcp_client_socket.bind(('ip地址', 端口号))
设置监听——把主动套接字改成被动套接字, 被动套接字只能接收客户端的连接请求,不能收发消息;128: 最大等待连接数
tcp_server_socket.listen(128)
处理客户端的连接请求
service_client_socket, ip_port = tcp_server_socket.accept()
接收客户端信息——关闭socket,recv接收的数据长度为0
recv_data = service_client_socket.recv(1024)
发送数据(回复客户端)
service_client_socket.send('ok'.encode('utf-8'))
终止和客户端的服务(两个socket均需要关闭)
service_client_socket.close()
tcp_server_socket.close()