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()