【Python高阶技巧】Socket网络编程
一、网络编程
二、Socket网络编程
三、服务端和客户端
四、Socket服务端编程
五、Socket客户端编程
点击跳转
Test
跳转到此处
一、网络编程
网络编程是指通过计算机网络进行数据交换和通信的程序开发过程。网络编程涉及到多种协议、技术和编程语言,旨在实现计算机之间的数据传输和通信。
以下是网络编程的一些基本概念和要点:
-
计算机网络: 计算机网络是指通过通信链路相互连接的计算机集合。它可以是局域网(LAN)、广域网(WAN)、互联网等。网络编程的目的是在这些网络上实现数据传输和通信。
-
协议: 在计算机网络中,通信需要遵循一定的规则和约定,这些规则和约定被称为协议。常见的网络协议包括TCP/IP、HTTP、FTP、SMTP等。
-
TCP/IP模型: TCP/IP是一个网络协议族,它包括多个层次,每个层次负责不同的功能。TCP/IP模型的主要层次有物理层、数据链路层、网络层、传输层和应用层。
-
套接字(Socket): 套接字是实现网络通信的一种机制,它允许不同计算机上的进程通过网络进行数据交换。套接字可以用于实现不同的网络协议,如TCP和UDP。
-
服务端和客户端: 网络通信中通常涉及到服务端和客户端。服务端负责监听连接请求,处理客户端的请求;客户端则发起连接请求,并向服务端发送请求。
-
HTTP协议: 超文本传输协议(HTTP)是一种用于传输超媒体文档(例如HTML)的协议。它是Web开发中最常用的协议之一,基于客户端-服务器模型。
-
Socket编程: Socket编程是通过套接字实现网络通信的一种编程方式。它可以用于实现多种协议,包括TCP和UDP。Socket编程可以使用不同编程语言实现,如Python、Java、C等。
-
异步编程: 在网络编程中,为了提高效率和性能,常常使用异步编程模型。异步编程允许程序在等待某些操作完成的同时执行其他操作,以避免阻塞。
-
安全性: 网络编程中的安全性是一个重要的考虑因素。加密通信、身份验证、防火墙等机制用于保障网络通信的安全性。
网络编程在实际应用中涵盖广泛,包括Web开发、即时通讯、远程调用、文件传输等领域。不同的应用场景可能需要选择不同的网络协议和编程技术。
二、Socket网络编程
Socket是一种在计算机网络中实现通信的一种机制,它允许在网络上的两个不同设备之间进行数据交换。Socket编程是使用Socket接口进行网络通信的一种编程方式,它可以在不同的计算机之间实现进程间的通信。
以下是Socket网络编程的一些基本概念和步骤:
-
Socket概念: Socket是一种通信机制,它提供了一种在网络上进行数据交换的方式。Socket可以用于同一台计算机上的进程间通信,也可以用于不同计算机之间的网络通信。
-
Socket类型: Socket有两种基本类型,一种是流式套接字(Socket type SOCK_STREAM),用于建立可靠的、面向连接的通信;另一种是数据报套接字(Socket type SOCK_DGRAM),用于不可靠的、无连接的通信。
-
服务器端和客户端: 在Socket通信中,通常会有一个服务器端和一个或多个客户端。服务器端负责监听并接受客户端的连接请求,而客户端则发起连接请求。
-
套接字地址: 在Socket通信中,每个套接字都有一个地址,包括IP地址和端口号。服务器端需要绑定一个地址用于监听,而客户端在连接时需要指定连接的目标地址。
-
建立连接: 在流式套接字通信中,建立连接是一个重要的步骤。服务器端调用
bind()
绑定地址并调用listen()
监听连接请求,客户端调用connect()
发起连接请求。 -
数据传输: 连接建立后,服务器端和客户端可以通过套接字进行数据传输。在流式套接字中,可以使用
send()
和recv()
进行数据的发送和接收。 -
关闭连接: 连接建立后,当通信完成或发生错误时,需要调用
close()
关闭连接。 -
UDP通信: 在数据报套接字通信中,通信是无连接的,每个数据包都是独立的。服务器端使用
recvfrom()
接收数据,客户端使用sendto()
发送数据。
以下是一个简单的Python示例,演示了一个简单的TCP服务器和客户端:
服务器端:
import socket
# 创建一个TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('localhost', 8080)
server_socket.bind(server_address)
# 监听连接
server_socket.listen(1)
while True:
print("等待连接...")
connection, client_address = server_socket.accept()
print("接收到连接,客户端地址:", client_address)
try:
data = connection.recv(1024)
print("接收到数据:", data.decode('utf-8'))
finally:
connection.close()
客户端:
import socket
# 创建一个TCP/IP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 8080)
client_socket.connect(server_address)
try:
message = "Hello, server!"
client_socket.sendall(message.encode('utf-8'))
finally:
client_socket.close()
这只是一个简单的示例,实际的Socket编程涉及到更多的细节和异常处理。
三、服务端和客户端
服务端和客户端是计算机网络中两个基本角色,它们通过网络进行通信,实现数据的传输和交互。以下是服务端和客户端的概述:
服务端(Server):
-
定义: 服务端是提供网络服务或资源的计算机或程序。它通常持续运行,等待客户端的连接请求,并响应客户端的请求。
-
功能: 服务端负责监听端口,接受客户端的连接请求,处理客户端的请求,并向客户端提供相应的服务或资源。
-
特点:
- 通常拥有固定的IP地址和域名。
- 在服务端常驻的程序可以是Web服务器、数据库服务器、文件服务器等。
-
通信模型: 服务端通常采用并发模型,能够同时处理多个客户端的请求。常见的并发模型有多线程、多进程、事件驱动等。
-
例子: Web服务器(如Apache、Nginx)、数据库服务器(如MySQL、PostgreSQL)等。
客户端(Client):
-
定义: 客户端是请求服务或资源的计算机或程序。它通过网络连接到服务端,并发送请求,等待服务端的响应。
-
功能: 客户端发起连接请求,向服务端发送请求数据,并接收服务端的响应数据。它的主要任务是与服务端进行通信。
-
特点:
- 可以是用户操作的应用程序,也可以是其他服务或设备的请求发起者。
- 通常拥有动态分配的IP地址。
-
通信模型: 客户端通常采用阻塞或非阻塞模型,等待服务端的响应或继续执行其他任务。
-
例子: Web浏览器、FTP客户端、数据库客户端等。
通信流程:
- 连接建立: 客户端发起连接请求,服务端监听端口并接受连接。
- 请求-响应: 客户端向服务端发送请求,服务端处理请求并返回响应。
- 连接关闭: 通信结束后,客户端或服务端关闭连接。
服务端和客户端的配合使得网络通信成为可能,允许在分布式环境中进行数据交换和协同工作。常见的网络应用都涉及服务端和客户端之间的交互,如网页浏览、电子邮件、即时通讯等。
四、Socket服务端编程
服务端代码
"""
演示Socket服务端开发
"""
import socket
# 创建Socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口
socket_server.listen(1)
# listen方法内接受一个整数传参数,表示接受的链接数量
# 等待客户端链接
# result: tuple = socket_server.accept()
# conn = result[0] # 客户端和服务端的链接对象
# address = result[1] # 客户端的地址信息
conn, address = socket_server.accept()
# accept方法返回的是二元元组(链接对象, 客户端地址信息)
# 可以通过 变量1, 变量2 = socket_server.accept()的形式,直接接受二元元组内的两个元素
# accept()方法,是阻塞的方法,等待客户端的链接,如果没有链接,就卡在这一行不向下执行了
print(f"接收到了客户端的链接,客户端的信息是:{address}")
while True:
# 接受客户端信息,要使用客户端和服务端的本次链接对象,而非socket_server对象
data: str = conn.recv(1024).decode("UTF-8")
# recv接受的参数是缓冲区大小,一般给1024即可
# recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
print(f"客户端发来的消息是:{data}")
# 发送回复消息
msg = input("请输入你要和客户端回复的消息:")
if msg == 'exit':
break
conn.send(msg.encode("UTF-8"))
# 关闭链接
conn.close()
socket_server.close()
实现服务端并结合客户端进行测试
下载网络调试助手作为客户端
https://github.com/nicedayzhu/netAssist/releases
五、Socket客户端编程
客户端代码
"""
演示Socket客户端开发
"""
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务端
socket_client.connect(("localhost", 8888))
while True:
# 发送消息
msg = input("请输入要给服务端发送的消息:")
if msg == 'exit':
break
socket_client.send(msg.encode("UTF-8"))
# 接收返回消息
recv_data = socket_client.recv(1024) # 1024是缓冲区的大小,一般1024即可。 同样recv方法是阻塞的
print(f"服务端回复的消息是:{recv_data.decode('UTF-8')}")
# 关闭链接
socket_client.close()
服务端客户端相互通讯
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!