【Python高阶技巧】Socket网络编程

2023-12-28 17:32:24

一、网络编程
二、Socket网络编程
三、服务端和客户端
四、Socket服务端编程
五、Socket客户端编程
点击跳转

Test

跳转到此处

一、网络编程

网络编程是指通过计算机网络进行数据交换和通信的程序开发过程。网络编程涉及到多种协议、技术和编程语言,旨在实现计算机之间的数据传输和通信。

以下是网络编程的一些基本概念和要点:

  1. 计算机网络: 计算机网络是指通过通信链路相互连接的计算机集合。它可以是局域网(LAN)、广域网(WAN)、互联网等。网络编程的目的是在这些网络上实现数据传输和通信。

  2. 协议: 在计算机网络中,通信需要遵循一定的规则和约定,这些规则和约定被称为协议。常见的网络协议包括TCP/IP、HTTP、FTP、SMTP等。

  3. TCP/IP模型: TCP/IP是一个网络协议族,它包括多个层次,每个层次负责不同的功能。TCP/IP模型的主要层次有物理层、数据链路层、网络层、传输层和应用层。

  4. 套接字(Socket): 套接字是实现网络通信的一种机制,它允许不同计算机上的进程通过网络进行数据交换。套接字可以用于实现不同的网络协议,如TCP和UDP。

  5. 服务端和客户端: 网络通信中通常涉及到服务端和客户端。服务端负责监听连接请求,处理客户端的请求;客户端则发起连接请求,并向服务端发送请求。

  6. HTTP协议: 超文本传输协议(HTTP)是一种用于传输超媒体文档(例如HTML)的协议。它是Web开发中最常用的协议之一,基于客户端-服务器模型。

  7. Socket编程: Socket编程是通过套接字实现网络通信的一种编程方式。它可以用于实现多种协议,包括TCP和UDP。Socket编程可以使用不同编程语言实现,如Python、Java、C等。

  8. 异步编程: 在网络编程中,为了提高效率和性能,常常使用异步编程模型。异步编程允许程序在等待某些操作完成的同时执行其他操作,以避免阻塞。

  9. 安全性: 网络编程中的安全性是一个重要的考虑因素。加密通信、身份验证、防火墙等机制用于保障网络通信的安全性。

网络编程在实际应用中涵盖广泛,包括Web开发、即时通讯、远程调用、文件传输等领域。不同的应用场景可能需要选择不同的网络协议和编程技术。

二、Socket网络编程

Socket是一种在计算机网络中实现通信的一种机制,它允许在网络上的两个不同设备之间进行数据交换。Socket编程是使用Socket接口进行网络通信的一种编程方式,它可以在不同的计算机之间实现进程间的通信。

以下是Socket网络编程的一些基本概念和步骤:

  1. Socket概念: Socket是一种通信机制,它提供了一种在网络上进行数据交换的方式。Socket可以用于同一台计算机上的进程间通信,也可以用于不同计算机之间的网络通信。

  2. Socket类型: Socket有两种基本类型,一种是流式套接字(Socket type SOCK_STREAM),用于建立可靠的、面向连接的通信;另一种是数据报套接字(Socket type SOCK_DGRAM),用于不可靠的、无连接的通信。

  3. 服务器端和客户端: 在Socket通信中,通常会有一个服务器端和一个或多个客户端。服务器端负责监听并接受客户端的连接请求,而客户端则发起连接请求。

  4. 套接字地址: 在Socket通信中,每个套接字都有一个地址,包括IP地址和端口号。服务器端需要绑定一个地址用于监听,而客户端在连接时需要指定连接的目标地址。

  5. 建立连接: 在流式套接字通信中,建立连接是一个重要的步骤。服务器端调用bind()绑定地址并调用listen()监听连接请求,客户端调用connect()发起连接请求。

  6. 数据传输: 连接建立后,服务器端和客户端可以通过套接字进行数据传输。在流式套接字中,可以使用send()recv()进行数据的发送和接收。

  7. 关闭连接: 连接建立后,当通信完成或发生错误时,需要调用close()关闭连接。

  8. 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):

  1. 定义: 服务端是提供网络服务或资源的计算机或程序。它通常持续运行,等待客户端的连接请求,并响应客户端的请求。

  2. 功能: 服务端负责监听端口,接受客户端的连接请求,处理客户端的请求,并向客户端提供相应的服务或资源。

  3. 特点:

    • 通常拥有固定的IP地址和域名。
    • 在服务端常驻的程序可以是Web服务器、数据库服务器、文件服务器等。
  4. 通信模型: 服务端通常采用并发模型,能够同时处理多个客户端的请求。常见的并发模型有多线程、多进程、事件驱动等。

  5. 例子: Web服务器(如Apache、Nginx)、数据库服务器(如MySQL、PostgreSQL)等。

客户端(Client):

  1. 定义: 客户端是请求服务或资源的计算机或程序。它通过网络连接到服务端,并发送请求,等待服务端的响应。

  2. 功能: 客户端发起连接请求,向服务端发送请求数据,并接收服务端的响应数据。它的主要任务是与服务端进行通信。

  3. 特点:

    • 可以是用户操作的应用程序,也可以是其他服务或设备的请求发起者。
    • 通常拥有动态分配的IP地址。
  4. 通信模型: 客户端通常采用阻塞或非阻塞模型,等待服务端的响应或继续执行其他任务。

  5. 例子: Web浏览器、FTP客户端、数据库客户端等。

通信流程:

  1. 连接建立: 客户端发起连接请求,服务端监听端口并接受连接。
  2. 请求-响应: 客户端向服务端发送请求,服务端处理请求并返回响应。
  3. 连接关闭: 通信结束后,客户端或服务端关闭连接。

服务端和客户端的配合使得网络通信成为可能,允许在分布式环境中进行数据交换和协同工作。常见的网络应用都涉及服务端和客户端之间的交互,如网页浏览、电子邮件、即时通讯等。
在这里插入图片描述

四、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()

服务端客户端相互通讯

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_62140641/article/details/135136160
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。