在学习网络编程之前,先要了解一些基础知识。
OSI七层模型
OSI(Open System Interconnect),即开放式系统互联。OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图。
- 应用层
OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。 - 表示层
表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。 - 会话层
会话层就是负责建立、管理和终止表示层实体之间的通信会话。 - 传输层
建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务。 - 网络层
本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。 - 数据链路层
将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。 - 物理层
实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。
TCP/IP五层模型
TCP/IP五层协议与OSI七层模型对应关系如下 每一层主要的协议如下图 tcp是可靠的传输,面向连接,传输效率低,一般用来做web浏览器、文件传输; udp是不可靠的传输,无连接的服务,传输效率高无拥塞机制。
基础
服务端server.py
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.bind((host, port))
s.listen(5)
c, addr = s.accept()
print("对方连接地址是", addr)
c.send('welcome'.encode('utf-8'))
print(c.recv(1024).decode('utf-8'))
c.close()
客户端client.py
import socket
s = socket.socket()
host = '192.168.1.6'
port = 12345
s.connect((host, port))
msg = input('要发送的信息:')
s.send(msg.encode('utf-8'))
print(s.recv(1024).decode('utf-8'))
s.close()
循环通信
上面的那个代码,客户端只能往服务端发一句话,这里使用while循环,可以实现持续发送的额功能 server.py
import socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.bind(("", 12345))
tcp_server_socket.listen(128)
while True:
new_client_socket, client_addr = tcp_server_socket.accept()
print("the %s connecting" % str(client_addr))
new_client_socket.send('welcome'.encode('utf-8'))
while True:
try:
recv_data = new_client_socket.recv(1024)
print(recv_data.decode('utf-8'))
except:
print("断开连接")
break
new_client_socket.close()
tcp_server_socket.close()
client.py
import socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = "192.168.1.6"
server_port = 12345
server_add = (server_ip, server_port)
tcp_socket.connect(server_add)
first_data = tcp_socket.recv(1024)
print(first_data.decode('utf-8'))
while True:
send_data = input('sned-->')
tcp_socket.send(send_data.encode('utf-8'))
tcp_socket.close()
|