一、网络编程概述
1.什么是计算机网络?
指分布在不同地域的计算机,通过外部设备连接起来,实现了资源共享(数据和设备的共享),实现数据传输的计算机系统。外部设备有:计算机、路由器、交换机等等。
2.什么是网络编程?
网络编程关注的是数据的传输,主要处理计算机与计算机之间的数据通信问题。
3.计算机网络的三要素:
IP地址、端口号、协议。一台计算机想要与另一台计算机进行数据的交换,需要三样东西:IP地址、端口号和协议。通过IP地址找具体的计算机,然后通过端口号找某个软件的专属通道,数据传输的格式按照一定的协议。
4.网络模型
七层协议:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
四层协议:应用层、传输层、网络层、网络接口层
5.TCP与UDP
UDP 和 TCP 协议都是传输层的协议。
1.UDP协议的特点:
概念:User Datagram Protocol 用户数据报协议,以包的方式在网上传送数据,每个包都有传送和接受地址的讯息。
不需创建连接,发送的数据限制大小、传输速度快
(1)客户端
#UDP协议socket对象,AF_INET用于网络进程间的通讯,AF_UNIX用于同一台机器进程间通讯,
#SOCK_DGRAM流式嵌套字用于UDP协议
import socket
client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 客户端
host=socket.gethostname()#获取主机ip
port=8888
address = (host, port)
# 连接服务端
client_socket.sendto("请求连接服务器".encode("utf-8"),address)
print("正在接收反馈信息")
data,addr=client_socket.recvfrom(1024)#1024表示接受数据的大小
print("接收反馈消息成功")
print(addr)
print("来自服务器的反馈",data.decode("utf-8"))
client_socket.close()
(2)服务器端
import socket
server_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 服务器
host=socket.gethostname()#获取主机ip
port=8888
address = (host, port)
server_socket.bind(address)
print("等待客户器发送消息")
data,addr=server_socket.recvfrom(1024)
print(addr)
print("接收客户端消息成功")
print(data.decode("utf-8"))
server_socket.sendto("服务器反馈信息".encode("utf-8"),addr)
print("服务器反馈信息完成")
server_socket.close()
2.TCP
1.TCP协议的特点:
需要创建连接、传输数据大小无限制、C/S(Client / Server)结构、传输速度慢。
(1)客户端
import socket
client_socket = socket.socket()
# 设置ip
host = socket.gethostname()#获取主机ip
port = 8888 #设置端口
address = (host, port)
# 连接服务端
client_socket.connect(address)#区别于UDP
print("连接成功")
# 接收信息recv
data = client_socket.recv(1024)
print(data)
(2)服务器端
import socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("TCP对象创建成功", tcp_socket)
# 绑定ip,要与客户端保持一致,不然连接不成功
host = socket.gethostname()
port = 8888
address = (host, port)
tcp_socket.bind(address)
# 监听客户端,设置连接客户端的最大数量
tcp_socket.listen(5)
print("服务端正在监听客户端...")
# 被动连接,服务端要先同意连接客户端才能连接,不然会报错
tcp_connect = tcp_socket.accept()
# tcp_connect为服务端连接客户端成功时返回的一个socket连接对象和客户端地址信息
print("连接成功,正在发送信息")
server_socket = tcp_connect[0]
address_socket = tcp_connect[1]
print("对象", server_socket)
print("地址信息", address_socket)
# send发送信息
# server_socket.send("welcome to the server...".encode("utf-8"))#字符串类型转化为bytes类型
server_socket.send(b"welcome to the server...") # 字符串类型转化为bytes类型,根据获取的连接的客户端地址信息发送
server_socket.close()