Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
Socket也是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。
UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
二、TCP协议下的Socket
TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
基础格式:
服务端
import socket sk = socket.socket() # 创建套接字 sk.bind(('127.0.0.1', 4444)) # 把地址绑定到套接字 sk.listen() # 监听链接 count, addr = sk.accept() # 接受客服端链接,count——client端与server端的链接信息,addr——client端IP地址 msg = count.recv(1024) # 接受客户端发送的信息,接受1024个字节 count.send(b'hi') # 像客户端发送信息(发送的信息必须是bytes数据类型) print(msg) # 打印接受信息 count.close() # 关闭客户端套接字 sk.close() # 关闭服务端套接字
客户端
import socket sk = socket.socket() # 创建套接字 sk.connect(('127.0.0.1', 4444)) # 尝试链接server端 sk.send(b'hello') # 发送信息 msg = sk.recv(1024) # 接受信息 print(msg) # 打印接受的信息 sk.close() # 关闭链接
sk——>是我自己的IP和端口
count——>是除了有我自己的IP和端口,还有连接我的客户端的IP和端口
自定义发送消息和同时连接多个客户端,并且和客户端多次交谈
服务端:
import socket sk = socket.socket() sk.bind(('127.0.0.1', 4444)) sk.listen() while True: # 为了能和多个客户端链接 count, addr = sk.accept() count.send('欢迎光临'.encode('utf-8')) # 先给客户端发送’欢迎光临‘ while True: # 为了能和一个客户端多交谈几次 msg1 = count.recv(1024).decode('utf-8') # 其次在接受客户端发送来的消息 if msg1.upper() == 'Q': break # 判断客户端是否要断开链接,结束循环就断开链接 print(msg1) # 不断开链接就打印消息 msg2 = input('>>') # 服务端输入要发送的消息 count.send(msg2.encode('utf-8')) # 发送消息 if msg2.upper() == 'Q': break # 服务端发送q就是结束循环,断开与客户端的链接 count.close() # 结束循环就会自动断开与客户端的链接