python网络编程tcp客户端及服务端解读
作者:Bojaka
Python的socket模块提供了基本的网络通信功能,包括创建socket对象、绑定地址、监听连接、接受连接、发送和接收数据以及关闭连接等,TCP和UDP是常用的网络协议,IP地址和端口号用于标识通信端点,通过这些功能,可以实现客户端和服务器之间的网络通信
python网络编程tcp客户端及服务端
Python 的 socket
模块是用于网络编程的标准库,提供了低级别的网络接口,允许程序通过网络进行通信。
以下是对 Python socket
模块的简要介绍,包括其基本概念、常用功能和示例。
基本概念
Socket:Socket 是网络通信的端点。它可以是一个客户端或服务器,允许在网络上发送和接收数据。
协议:socket
模块支持多种网络协议,最常用的是 TCP(传输控制协议)和 UDP(用户数据报协议)。
- TCP:面向连接的协议,提供可靠的数据传输。
- UDP:无连接的协议,传输速度快,但不保证数据的可靠性。
IP 地址和端口:每个 socket 都与一个 IP 地址和一个端口号相关联。IP 地址标识网络上的设备,端口号标识设备上的特定服务。
常用功能
创建 Socket:
- 使用
socket.socket()
创建一个新的 socket 对象。 - 需要指定地址族(如
socket.AF_INET
表示 IPv4)和套接字类型(如socket.SOCK_STREAM
表示 TCP)。
绑定(Bind):
- 使用
bind()
方法将 socket 绑定到特定的 IP 地址和端口号。
监听(Listen):
- 服务器使用
listen()
方法开始监听传入的连接请求。
接受连接(Accept):
- 使用
accept()
方法接受客户端的连接请求,返回一个新的 socket 对象和客户端的地址。
连接(Connect):
- 客户端使用
connect()
方法连接到服务器。
发送和接收数据:
- 使用
send()
和sendall()
方法发送数据。 - 使用
recv()
方法接收数据。
关闭 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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。