Bootstrap

python网络编程tcp客户端及服务端

Python 的 socket 模块是用于网络编程的标准库,提供了低级别的网络接口,允许程序通过网络进行通信。以下是对 Python socket 模块的简要介绍,包括其基本概念、常用功能和示例。

基本概念

  1. Socket:Socket 是网络通信的端点。它可以是一个客户端或服务器,允许在网络上发送和接收数据。

  2. 协议socket 模块支持多种网络协议,最常用的是 TCP(传输控制协议)和 UDP(用户数据报协议)。

    • TCP:面向连接的协议,提供可靠的数据传输。
    • UDP:无连接的协议,传输速度快,但不保证数据的可靠性。
  3. IP 地址和端口:每个 socket 都与一个 IP 地址和一个端口号相关联。IP 地址标识网络上的设备,端口号标识设备上的特定服务。

常用功能

  1. 创建 Socket

    • 使用 socket.socket() 创建一个新的 socket 对象。
    • 需要指定地址族(如 socket.AF_INET 表示 IPv4)和套接字类型(如 socket.SOCK_STREAM 表示 TCP)。
  2. 绑定(Bind)

    • 使用 bind() 方法将 socket 绑定到特定的 IP 地址和端口号。
  3. 监听(Listen)

    • 服务器使用 listen() 方法开始监听传入的连接请求。
  4. 接受连接(Accept)

    • 使用 accept() 方法接受客户端的连接请求,返回一个新的 socket 对象和客户端的地址。
  5. 连接(Connect)

    • 客户端使用 connect() 方法连接到服务器。
  6. 发送和接收数据

    • 使用 send() 和 sendall() 方法发送数据。
    • 使用 recv() 方法接收数据。
  7. 关闭 Socket

    • 使用 close() 方法关闭 socket 连接。


tcp客户端

import socket
target_host = "127.0.0.1"
target_port = 65423
# 创建客户端套接字
# socket.AF_INET:表示选择IPv4的地址,socket.SOCK_STREAM:表示TCP传输协议类型
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接客户端 connect the client
client.connect((target_host,target_port))
#使用GET方法发送数据
message = "hello,socker"
client.sendall(message.encode())

#返回数据最大字符为4096
response = client.recv(4096)

#打印返回数据
print(response.decode())

#关闭连接

client.close()


tcp服务端

import socket
import threading

IP = "0.0.0.0"
PORT = 65423

def main():
    # 创建客户端套接字对象
    # socket.AF_INET:表示选择IPv4的地址,socket.SOCK_STREAM:表示TCP传输协议类型
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定PORT和IP
    server.bind((IP, PORT))
    # 设置客户端最大连接数量5
    server.listen(5)
    # 打印开启监听IP和PORT
    print(f" [*] Listening on {IP}:{PORT}")

    # 建立连接
    # 让服务器进入主循环中,并在该循环中等待外来连接
    while True:
        client, address = server.accept()
        # 打印已接受的客户端连接的ip和端口
        print(f"[*] Accepted connection from {address[0]}:{address[1]}")
        # 创建一个新的线程client_handler,用于处理与该客户端的通信
        client_handler = threading.Thread(target=handle_client, args=(client,))
        # 启动线程开始处理客户端请求
        client_handler.start()

# 定义处理客户端请求的函数handle_client,接受一个客户端套接字作为参数
def handle_client(client_socket):
    # 使用with语句确保在处理完客户端请求后自动关闭套接字
    with client_socket as sock:
    # 从客户端最多接受1024字节的数据
        request = sock.recv(1024)
    # 打印接收到的请求内容,使用decode("utf-8")将字节数据解码为字符串
        print(f"[*] Received: {request.decode('utf-8')}")  # 修正引号问题
    # 向客户端发送确认消息ACK,表示已经接收到请求
        sock.send(b"ACK")

if __name__ == "__main__":
    main()

使用编写的tcp客户端给服务发送几个测试的数据包,应该会看到以下输出

[*] Listening on 0.0.0.0:65423
[*] Accepted connection from 127.0.0.1:63382
[*] Received: hello,socker

;