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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论