网络编程
网络的链接使用:我们学习编程就是为了可以进行相互间的数据信息交流,而要进行远距离的交流这就需要链接网络
链接网络的话我们要知道什么是互联网?
其实互联网就是一堆协议来规范标准,从而达到相互间的交流
1.物理层 发送二进制格式(电信号的高低电压)
2.数据链路层
a.给二进制信号赋予意义
b.以太网协议(ethernet) : 数据包或数据帧(head:18字节) 和data:46-1500字节) c. mac(计算机)唯一标识
3.网络层
a. ip协议:网络部分是找到目标局域网 和 主机部分找到目标计算机
4.传输层 TCP/UDP port端口号 用于识别应用程序
5.会话层
6.表达层
7.应用层
通常我们把会话层,表达层和应用层合并. 在传输层和应用层之间我们有一个套接字即socket来编程
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
TCP服务端
import socket
server=socket.socket()
server.bind(('127.0.0.1',9333))
server.listen(10)
while True:
c,addr=server.accept()
while True:
data=c.recv(1024).decode('utf-8')
print(data)
if not data:
c.close()
break
c.send(data.upper().encode('utf-8'))
server.close()
TCP客服端
import socket
c=socket.socket()
c.connect(('127.0.0.1',9333))
while True:
msg=input('>>>: ')
if not msg:
break
c.send(msg.encode('utf-8'))
data = c.recv(1024).decode('utf-8')
print(data)
c.close()
什么是粘包?
指接收数据是不知道要从哪开始到哪结束.
粘包发生的情况?
发送端需要等缓冲区满才发送出去,造成粘包
接收端不及时接收缓冲区的包,造成粘包
解决粘包?
使用报头即先把要接收的长度告知对方(可用struct模块 )