TCP和UDP的区别:
TCP是面向连接的,UDP是无连接的,即发送数据之间不需要建立联系。TCP提供可靠的服务,也就是说TCP传输无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,但不保证可靠交付UDP具有较好的实时性,工作效率比TCP高,适用于高速传输或对实时性有较高要求的通信或广播通信TCP的传输是点到点,UDP支持一对多,多对多,多对一,一对一的交互通信TCP对系统资源要求较多,UDP对系统资源要求较少
TCP分为客户端和服务器端,下面例子是模拟客户端,利用调试助手模拟服务器端进行调试
import socket # 1.创建套接字 tcp_client = socket.socket(family = socket.AF_INET, type = socket.SOCK_STREAM) # 2.连接服务器 server_ip = "192.168.1.1" server_port = 8080 # 注意这里是int类型,不是字符串类型!! tcp_client.connect((server_ip, server_port)) # 3.发送数据给服务器 send_data = input("请输入要发送的数据") tcp_client.send(send_data.encode("gbk")) # 4.接收服务端发送过来的数据 recv_data = tcp_client.recv(1024) print(recv_data.decode("gbk")) # 5.关闭 tcp_client.close()模拟服务器端,然后利用调试助手模拟多个客户端访问
import socket # 1.创建套接字 tcp_server = socket.socket(family = socket.AF_INET, type = socket.SOCK_STREAM) # 绑定服务器端的Ip和端口 tcp_server.bind(("192.168.1.1", 8080)) # listen设置,等待连接服务器的最大值 tcp.listen(1) while True: new_client_socket, client_addr = tcp_server.accept() print(client_addr) # 连接 服务器的客户端的地址和端口号 recv_data = new_client_socket.recv(1024) print(recv_data.decode("gbk")) send_data = input("请输入发送给client的数据:") new_client_socket.send(send_data.encode("gbk")) tcp_server.close() listen:等待连接服务器的客户端数量(不包括已经连接在内)accept: 在客户端连接后,创建新的套接字来进行使用,其实就像是10086客服,当一个用户连接到10086的时候,会自动分配一个客服给他,其实就像是套接字。下一个客户连接后,再接着分配给他一个新的套接字。accept其实就像是这样。当listen中的backlog设置为2时,除了已经连接的客户端之外,等待连接的客户端数目为2,第三个就连接不上了
调试的时候会发现,当一个客户端结束,等待的客户端就可以依次连接上服务器端进行交互操作。
因为客户端发送完数据之后就直接断开,所以设置循环,如果接收到的数据 recv_data存在,那么就显示客户端发送过来的数据,如果不存在,也就是客户端点击断开连接,那么recv_data是不存在的,所以这里break退出。客户端和服务器之间的交互只能是一对一,一个客户端没有结束,那么等待的客户端就无法发送数据给服务端
import socket def main(): tcp_server = socket.socket(family=socket.AF_INET, type = socket.SOCK_STREAM) tcp_server.bind(("192.168.1.1", 7979)) while True: tcp_server.listen(128) new_socket, client_addr = tcp_server.accept() print(f"{client_addr}已连接") while True: recv_data = new_socket.recv(1024) if recv_data: print(recv_data.decode("gbk")) else: new_socket.close() print(f"{client_addr}已离开") break send_data = "hello" new_socket.send(send_data.encode("gbk")) tcp_server.close() if __name__ == '__main__': main()