TCP传输
(1)连接:必须先连接在传输数据
(2)可靠:提供可靠的传输
(3)麻烦:需要保证传输可靠性,编程繁琐,内部机制繁琐,效率没有UDP高
(4)重要概念:三次握手和四次挥手
服务端:socket->bind->listen->accept->recv/send->close
客户端:socket———————>connect->recv/send->close
注意事项:
recv:什么时候返回值为空
答:在客户端断开的时候回返回为空
服务端基础代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date : 2021/6/8
# @Name : ZhouZongXin
"""
TCP 服务端基础代码(循环模型)
"""
from socket import *
class TcpServer(object):
@staticmethod
def server():
# 创建套接字(AF=家族,INET=ipv4)
tcp_socket = socket(AF_INET, SOCK_STREAM)
# 绑定套接字
tcp_socket.bind(('0.0.0.0', 8888))
# 设置监听(设置队列最大连接数)
tcp_socket.listen(5)
# 循环处理客户端连接,如果当前有客户端断开连接,那么等待接受下一个客户端进行连接
while True:
# 等待客户端连接
print("waiting for connect")
# 等待处理客户端连接accept
connfd, addr = tcp_socket.accept() # connfd连接的监听套接字,用accept处理
print("connect from", addr) # 打印客户端地址
# 循环处理客户端发送消息
while True:
# 等待接收客户端消息
data = connfd.recv(1024)
# 客户端不存在了,recv会返回空字节
if not data:
break
print("recv", data.decode())
# 回发给客户端
connfd.send(f"服务端返回:{data}".encode())
connfd.close() # 关闭监听套接字 如果某个客户端退出连接下一个客户端连接
tcp_socket.close() # 关闭套接字
if __name__ == '__main__':
TcpServer.server()
客户端基础代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date : 2021/6/8
# @Name : ZhouZongXin
"""
TCP客户端基础代码
"""
from socket import *
class TcpClient(object):
@staticmethod
def client():
while True:
# 发送消息
msg = input(">>")
if not msg:
break
# 创建套接字
tcp_socket = socket()
# 发起连接 连接服务端
tcp_socket.connect(('127.0.0.1', 8888))
tcp_socket.send(msg.encode()) # 发送字节串
data = tcp_socket.recv(1024) # 接受1024字节
print(data.decode()) # 转换字节串,且输出
tcp_socket.close() # 关闭套接字
if __name__ == '__main__':
TcpClient.client()
UDP与TCP的区别
传输特性:
TCP提供可靠的数据传输,但是UDP则不保证传输的可靠性。
TCP传输数据处理为字节流,而UDP处理为数据包形式。
TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高。
套接字编程区别:
创建的套接字类型不同。
TCP套接字会有粘包,UDP套接字有消息边界不会粘包。
TCP套接字依赖listen accept建立连接才能收发消息,UDP套接字则不需要。
TCP套接字使用send,recv收到消息,UDP套接字使用sendto,recvfrom。
使用场景:
TCP更适合对准确性要求高,传输数据较大的场景。
文件传输:如下载电影,访问网页,上传照片。
邮件收发。
点对点数据传输:如点对点聊天,登陆请求,远程访问,发红包。
UDP更适合对可靠性要求没有那么高,传输方式比较自由的场景。
视频流传输:如直播,视频聊天。
广播:如网络广播,群发消息。
实时传输:如游戏画面。
在一个大型的项目中,可能既涉及到TCP网络又有UDP网络