TCP 协议:可靠的,面向连接的协议 牺牲效率 确保安全 (支持全双工:双方都可以接收发送信号)
UDP 协议:不可靠的非连接协议 视频 音频 通话等
ARP协议:通过IP去获得Mac地址
通过IP+port(端口)就能确定唯一的pc和唯一的应用程序服务
套接字socket作用于应用层和传输层之间
****************************************************************************************
【应用层】应用软件的交互层
socket所在区域 两层之间
【传输层】TCP和UDP协议所在层
【网络层】IP协议作用范围 --------> 路由器
【数据链路层】Mac地址范围 -------->交换机 arp协议获取IP对应的Mac地址
【物理层】网线网卡 介质范围
****************************************************************************************
套接字的简单c/s 模拟代码:
server:
1 import socket 2 sk=socket.socket() #买一个手机 3 sk.bind(('127.0.0.1',8080)) #绑定一个电话卡 接收的参数为元组 4 sk.listen() #监听电话 5 6 conn,addres=sk.accept() #接听电话 来电显示地址 7 ret=conn.recv(1024) #听对方说话内容 1024字节 8 print(ret.decode('utf-8')) 9 conn.send(bytes('客户端连接成功了?'.encode('utf-8'))) #回答对方 10 11 conn.close() #断开连接 挂电话 12 sk.close() #关机
client:
1 import socket 2 sk=socket.socket() #买手机 3 sk.connect(('127.0.0.1',8080)) #拨号 接收的参数为元组 4 5 sk.send(bytes('我要连接你了,服务器'.encode('utf-8'))) #讲话 6 ret=sk.recv(1024) #收听对方讲话 7 print(ret.decode('utf-8')) 8 sk.close() #关机
需要注意:数据在网络传输必须为字节byte,中文传输前必须encode ,收到后必须decode解码 才能正确显示中文
必须先启动服务器,才能启动客户端去访问服务器,否则会报错
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
客户端与服务器的多次会话请求以及断开实现:
server:
1 import socket 2 sk=socket.socket() #买手机 3 sk.bind(('127.0.0.1',8080)) #绑卡 4 sk.listen() #监听 5 6 conn,address=sk.accept() #建立连接通道 7 while True: 8 ret=conn.recv(1024).decode('utf-8') 9 print(ret) 10 if ret=='bye': 11 conn.send(b'bye') 12 break 13 14 s_talk=input('请输入会话...') 15 conn.send(bytes(s_talk.encode('utf-8'))) 16 17 conn.close() 18 sk.close()
client:
1 import socket 2 sk=socket.socket() 3 sk.connect(('127.0.0.1',8080)) 4 5 while True: 6 c_talk = input('请输入会话内容') 7 sk.send(bytes(c_talk.encode('utf-8'))) 8 ret=sk.recv(1024).decode('utf-8') 9 print(ret) 10 if ret=='bye': 11 sk.send(b'bye') 12 break 13 14 sk.close()
**********************************UDP协议****************************************
server:
1 import socket 2 sk=socket.socket(type=socket.SOCK_DGRAM) #数据报文 3 sk.bind(('127.0.0.1',8080)) 4 5 msg,addr=sk.recvfrom(1024) #接收数据 6 print(msg.decode('utf-8')) 7 sk.sendto(b'hello',addr) #发送数据 8 9 sk.close() #关闭连接
client:
1 import socket 2 sk=socket.socket(type=socket.SOCK_DGRAM) 3 ip_port=('127.0.0.1',8080) 4 sk.sendto(b'hi server',ip_port) 5 ret,addr=sk.recvfrom(1024) 6 print(ret.decode('utf-8')) 7 8 sk.close()
UDP协议不需要连接 ,但是收发数据都需要带上地址