Python 提供了两个级别访问的网络服务:
有些是我们后面需要学习的东西,首先我们来学习Socket模块
socket()
函数是Python中用于创建套接字对象的函数。它属于socket
模块,用于初始化套接字以进行网络通信。socket()
函数通常用于两种类型的套接字:流套接字(用于TCP通信)和数据报套接字(用于UDP通信)。以下是socket()
函数的一般语法:
socket.socket(family, type[, proto])
family
:指定地址族(地址簇),通常使用socket.AF_INET
表示IPv4,或者socket.AF_INET6
表示IPv6。type
:指定套接字类型,可以是socket.SOCK_STREAM
(用于TCP)或socket.SOCK_DGRAM
(用于UDP)等。proto
:(可选)指定协议号。通常不需要指定,如果省略,则根据family
和type
自动选择协议。以下是一些示例用法:
import socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
import socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket()
函数返回一个套接字对象,该对象可以用于与其他计算机建立连接、发送和接收数据等网络通信操作。在创建套接字后,您可以使用其他方法来设置套接字的属性、绑定地址和端口、连接到远程主机等,具体操作取决于您的网络通信需求。
内部方法
以下是一些常见的内部方法:
**bind(address)**
:将套接字绑定到指定的地址和端口,使其可以监听该地址上的连接请求或接收来自该地址的数据。**listen(backlog)**
:开始监听连接请求,其中backlog
指定了在拒绝新连接之前可以排队的最大连接数。**accept()**
:接受传入连接请求,返回一个新的套接字和客户端地址,用于与客户端通信。**connect(address)**
:与指定地址的服务器建立连接,用于客户端套接字。**send(data)**
:发送数据到已连接的套接字。对于TCP套接字,数据将以字节流形式发送。对于UDP套接字,数据将被封装在数据包中发送。**recv(bufsize)**
:接收从套接字接收的数据,最多接收bufsize
字节的数据。通常,这是一个阻塞操作,直到有数据可用。**sendto(data, address)**
:将数据发送到指定的地址,用于UDP套接字。**recvfrom(bufsize)**
:从UDP套接字接收数据,并返回数据和发送方的地址。**close()**
:关闭套接字连接。一旦关闭,套接字将无法再用于通信。**getsockopt(level, optname[, buflen])**
:获取套接字选项的值。**setsockopt(level, optname, value)**
:设置套接字选项的值。服务端
# ---encoding:utf-8---
# @Time : 2023/9/9 09:43
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : Socket 服务端
# @File : Server.py
import socket
# 0. 获取主机名和端口号
host = socket.gethostname()
port = 9999
# 1. 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定端口
server_socket.bind((host, port))
# 3. 设置监听
server_socket.listen(128)
if __name__ == '__main__':
while True:
# 4. 等待客户端连接
client_socket, client_addr = server_socket.accept()
# 5. 接收数据
recv_data = client_socket.recv(1024)
# 6. 打印接收到的数据
print(recv_data.decode("utf-8"))
# 7. 发送数据
client_socket.send("我收到了数据".encode("utf-8"))
# 8. 关闭套接字
client_socket.close()
客户端
# ---encoding:utf-8---
# @Time : 2023/9/9 09:44
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : Socket 客户端
# @File : Client.py
import socket
# 0. 获取主机名和端口号
host = socket.gethostname()
port = 9999
# 1. 创建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接服务器
client_socket.connect((host, port))
if __name__ == '__main__':
# 3. 发送数据
client_socket.send("hello".encode("utf-8"))
# 4. 接收数据
recv_data = client_socket.recv(1024)
# 5. 打印接收到的数据
print(recv_data.decode("utf-8"))
# 6. 关闭套接字
client_socket.close()
TCP(传输控制协议)和UDP(用户数据报协议)是两种不同的传输层协议,用于在计算机网络中传输数据。它们具有不同的特点和适用场景,下面是它们的主要区别和用途:
服务端:
import socket
# 创建TCP服务器套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('127.0.0.1', 8080)
server_socket.bind(server_address)
# 开始监听连接
server_socket.listen(5)
print("等待客户端连接...")
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f"接受来自 {client_address} 的连接")
# 与客户端通信
data = client_socket.recv(1024)
if not data:
break
print(f"接收到的数据: {data.decode()}")
# 向客户端发送响应
response = "Hello, client!"
client_socket.send(response.encode())
# 关闭客户端连接
client_socket.close()
# 关闭服务器套接字
server_socket.close()
客户端:
import socket
# 创建TCP客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
server_address = ('127.0.0.1', 8080)
client_socket.connect(server_address)
# 发送数据到服务器
message = "Hello, server!"
client_socket.send(message.encode())
# 接收服务器的响应
response = client_socket.recv(1024)
print(f"服务器响应: {response.decode()}")
# 关闭客户端套接字
client_socket.close()
服务端:
import socket
# 创建UDP服务器套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_address = ('127.0.0.1', 8080)
server_socket.bind(server_address)
print("等待客户端消息...")
while True:
# 接收来自客户端的消息和客户端地址
data, client_address = server_socket.recvfrom(1024)
print(f"接收来自 {client_address} 的消息: {data.decode()}")
# 向客户端发送响应
response = "Hello, client!"
server_socket.sendto(response.encode(), client_address)
客户端:
import socket
# 创建UDP客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址和端口
server_address = ('127.0.0.1', 8080)
# 发送数据到服务器
message = "Hello, server!"
client_socket.sendto(message.encode(), server_address)
# 接收服务器的响应
response, server_address = client_socket.recvfrom(1024)
print(f"服务器响应: {response.decode()}")
# 关闭客户端套接字
client_socket.close()
HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输超文本的协议。它是互联网上应用最广泛的协议之一,通常用于在客户端和服务器之间传输Web页面、图像、视频、音频和其他资源。
HTTP通常在TCP/IP协议栈的应用层上运行,并使用TCP作为传输层协议,但也可以通过TLS/SSL进行安全加密,形成HTTPS(HTTP Secure)以保护数据的传输安全。
# ---encoding:utf-8---
# @Time : 2023/9/9 10:10
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site :
# @File : Http.py
# 导入http.server模块
import http.server
import socketserver
# 定义要使用的端口号
port = 8080
# 创建一个简单的HTTP请求处理程序
handler = http.server.SimpleHTTPRequestHandler
# 启动HTTP服务器并监听指定端口
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"Serving on port {port}")
# 开始监听并处理HTTP请求
httpd.serve_forever()
# Compare this snippet from 进阶语法\socket\HTTPServer.py:
OSI(Open Systems Interconnection)模型是一种计算机网络协议的抽象架构,用于将网络通信的不同方面分层并描述其功能。它将网络通信划分为七个不同的层次,每个层次都有特定的功能和责任。以下是OSI模型的七个层次,从底层到顶层:
网络通信的原理:
"网络存在的意义就是可以跨地域传输信息>>>>称之为通信"
网络 = 物理链接介质+互联网协议
"互联网的本质其实就是一堆协议"
3、os七层协议
# 互联网协议按照功能不同分为OSI七层或者TCP/IP五层或者TCP/IP四层
七层协议:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
五层协议:# 五层协议是将应用层、表示层、会话层统称为应用层
应用层、传输层、网络层、数据结构层、物理层
四层协议:# 就是在五层协议的基础上将数据链路层跟物理层统称为网络接口层
应用层、传输层、网络层、网络接口层
协议是什么:
"协议就是规定数据的组织格式"
格式:头部+数据部分
封装过程:数据外部加头
拆封过程:拆掉加上的头部获取数据
五层协议:
计算机1 计算机2
应用层 应用层
传输层 段 传输层
网络层 包 网络层
数据链路层 帧 数据链路层
物理层<--------交换机------>物理层
TCP协议使用三次握手(Three-Way Handshake)来建立一个可靠的连接。三次握手的过程包括三个步骤,每个步骤都是一个TCP报文段(segment)的交换,以确保双方都能够正常通信。以下是三次握手的步骤:
以下是三次握手的示意图:
客户端 服务器
| |
| 第一次握手: |
| 发送请求(SYN) |
| -----------------> |
| |
| 第二次握手: |
| 确认请求(ACK) |
| <----------------- |
| |
| 第三次握手: |
| 确认响应(ACK) |
| -----------------> |
| |
| 连接建立 |
三次握手确保了双方都具备接收和发送数据的能力,并建立了一个可靠的连接。如果其中任何一方未能收到另一方的确认,或者出现其他问题,都会导致握手失败,连接不会建立。这有助于确保在数据传输开始之前,双方都已准备好进行通信。
TCP连接的四次挥手(Four-Way Handshake)是用于关闭一个已经建立的TCP连接的过程。它与三次握手不同,因为在关闭连接时,双方都可能还有未传输完的数据或未确认的数据,因此需要四个步骤来完成。以下是四次挥手的步骤:
以下是四次挥手的示意图:
客户端 服务器
| |
| 第一步: |
| 发送关闭请求(FIN)|
| -----------------> |
| |
| 第二步: |
| 确认关闭请求(ACK)|
| <----------------- |
| |
| 第三步: |
| 发送关闭请求(FIN)|
| -----------------> |
| |
| 第四步: |
| 确认关闭请求(ACK)|
| <----------------- |
| |
| 连接关闭 |
四次挥手确保了双方都能够完成数据传输,然后安全地关闭连接。在连接关闭之前,双方都有机会确认已经接收到的数据,并通知对方可以关闭连接。这有助于确保数据的完整性和可靠性。