TCP 和 UDP
tcp: 面向连接的,双方必须先建立连接,才能进行数据传输
迅雷采用tcp下载文件
UDP: 当应用程序希望通过udp与一个应用程序通信时,传输数据之前源端和终端不建立连接
1. tcp 面向连接;udp是无连接的,也就是发送数据之前不需要建立连接。
2.tcp 提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,
且按序到达;udp 尽最大努力交付,即不保证可靠交付
3.udp 具有较好的实时性,工作效率不TCP高,适用于对高速传输和实时性有较高的通信或广播通信
4. 每一条TCP只能是点到点的;udp支付一对一,一对多和多对一和多对多的交互通信,
5.TCP对系统资源要求较多,udp对系统资源要求较少
6.全双工:双方都可以接受到信息
简单的例子:
import socket
def main():
# 1.创建socket
tcp_client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 2.链接服务器
serve_ip = input("serve ip:")
serve_port = int(input("serve port:"))
tcp_client.connect((serve_ip,serve_port))
# 3.发送数据
send_data = input("发送的数据:")
tcp_client.send(send_data.encode())
# 4.接收服务端发来的数据 阻塞 等待服务器发送数据
recv_data = tcp_client.recv(1024) # 最大接收1024字节
print(recv_data.decode('gbk')) # windows环境下 gbk
# 关闭套接字
tcp_client.close()
if __name__ == '__main__':
main()
"""
tcp 服务端
1.创建socket 买手机
2. bind绑定ip和port 插上手机卡
3.listen使套接字变为可以被动连接 允许别人打电话给你
4. accept等待客户端的连接 等待别人打电话
5.recv/send 接收发送数据 聊聊天
"""
import socket
def main():
# 1.创建socket
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. bind绑定ip和port
tcp_server.bind(('192.168.75.1',8080))
# 3.listen使套接字变为可以被动连接 别人可以连接服务器
# bakclog = 1 这是代表着服务器最大接收1个客户端连接吗? 不是
# bakclog 表示的是 服务器 拒绝连接之前 操作系统可以挂起的最大连接数据
# 类似于排队等待的数量
tcp_server.listen(1)
# 4. accept等待客户端的连接 阻塞 等待客户端连接 如果服务端与客户端连接,则解阻塞
# tcp_server.accept()
new_client_socket,client_addr = tcp_server.accept()
# print(client_addr)
# 5. 接收数据
# 注意:之前连接的socket已经断开了,现在使用的都是new_client_socket
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 6.发送数据
send_data = input("请输入你发送给client的信息:")
new_client_socket.send(send_data.encode("gbk"))
if __name__ == '__main__':
main()
"""
实现TCP服务端为多个客户端服务
循环
此程序需要注意的是:当一个客户端的服务结束之后就会自动断开,为
等待的一个客户端服务,只能服务一次,无法多次为一个客户服务
"""
import socket
def main():
tcp_serve = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_serve.bind(("192.168.75.1",7980))
while True:
tcp_serve.listen(128)
new_socket,client_addr = tcp_serve.accept()
print(client_addr)
"""
1. 允许多个客户端 连接
2. 允许为客户端多次服务
3. 但是 当前 只允许 为一个客户端 进行多次服务(多线程)
"""
while True:
recv_data = new_socket.recv(1024)
print(recv_data.decode("gbk"))
"""
解阻塞
1. 客户端发送过来的数据,就会解阻塞
2.自动断开链接 报错
加以判断
1. 有数据 则回复消息
2. 无数据 主动关闭连接(new_socket)跳出循环
"""
if recv_data.decode("gbk"):
send_data = "hello"
new_socket.send(send_data.encode("gbk"))
else:
break # 跳出循环
# 关闭连接
new_socket.close()
tcp_serve.close()
if __name__ == '__main__':
main()