h5商城网站是什么意思,怎样做分类网站,教学类网站开发,广告营销包括哪些方面TCP 网络通信#xff08;发送端 接收端#xff09;实例 —— Python 1. 引言2. 创建 TCP 服务器#xff08;接收端#xff09;2.1 代码示例#xff1a;TCP 服务器2.2 代码解释#xff1a; 3. 创建 TCP 客户端#xff08;发送端#xff09;3.1 代码示例#xff1a;TCP… TCP 网络通信发送端 接收端实例 —— Python 1. 引言2. 创建 TCP 服务器接收端2.1 代码示例TCP 服务器2.2 代码解释 3. 创建 TCP 客户端发送端3.1 代码示例TCP 客户端3.2 代码解释 4. 运行示例5. 异步 TCP 通信5.1 异步 TCP 服务器5.2异步 TCP 客户端5.3 代码解释 6. 总结7. 常见问题解答8. 参考资料 1. 引言 TCPTransmission Control Protocol传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。它广泛应用于互联网和局域网中确保数据能够安全、有序地从一个设备传输到另一个设备。本文将通过具体的 Python 实例详细介绍如何实现 TCP 网络通信中的发送端和接收端。
NetAssist网络调试助手Python环境配置 准备工作 在开始编写代码之前确保您已经安装了 Python 环境。Python 内置的 socket 模块提供了对低级网络接口的访问因此不需要额外安装任何库。 2. 创建 TCP 服务器接收端
服务器端的主要任务是监听来自客户端的连接请求并与每个连接的客户端进行双向通信。我们将使用多线程来处理多个客户端的并发连接。
2.1 代码示例TCP 服务器 import socket
import threading
import queue
import time# 定义服务器地址和端口
HOST 192.168.1.111 # 本地回环地址
PORT 8080 # 非特权端口# 全局消息队列用于存储服务器要发送的消息
message_queue queue.Queue()# 线程安全的客户端列表存储所有已连接的客户端套接字
clients set()# 锁对象确保对 clients 集合的操作是线程安全的
lock threading.Lock()def handle_client(client_socket, client_address):print(fConnected by {client_address})try:while True:# 接收来自客户端的数据data client_socket.recv(1024)if not data:break # 如果没有收到数据退出循环print(fReceived from {client_address}: {data.decode()})# 发送响应给客户端response fServer received: {data.decode()}client_socket.sendall(response.encode())# 模拟服务器主动发送数据time.sleep(5) # 每隔5秒检查是否有新消息with lock:if not message_queue.empty():msg message_queue.get()print(fSending to {client_address}: {msg})client_socket.sendall(msg.encode())except Exception as e:print(fError handling client {client_address}: {e})finally:# 关闭客户端连接with lock:clients.discard(client_socket)client_socket.close()print(fConnection with {client_address} closed.)def broadcast_message(message):将消息发送给所有已连接的客户端with lock:for client in clients:try:client.sendall(message.encode())except Exception as e:print(fFailed to send message to client: {e})def start_server():with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:server_socket.bind((HOST, PORT))server_socket.listen()print(fServer listening on {HOST}:{PORT})# 启动一个后台线程定期检查消息队列并广播消息threading.Thread(targetcheck_and_broadcast_messages, daemonTrue).start()while True:client_socket, client_address server_socket.accept()with lock:clients.add(client_socket)# 为每个新连接启动一个新的线程来处理client_thread threading.Thread(targethandle_client, args(client_socket, client_address))client_thread.start()def check_and_broadcast_messages():定期检查消息队列并广播消息while True:if not message_queue.empty():msg message_queue.get()print(fBroadcasting message: {msg})broadcast_message(msg)time.sleep(1) # 每隔1秒检查一次if __name__ __main__:# 启动服务器threading.Thread(targetstart_server, daemonTrue).start()# 模拟服务器主动发送消息while True:msg input(Enter message to broadcast (or type exit to quit): )if msg.lower() exit:breakmessage_queue.put(msg)2.2 代码解释
server_socket.bind()绑定服务器到指定的 IP 地址和端口。server_socket.listen()使服务器进入监听状态等待客户端连接。server_socket.accept()接受一个客户端连接返回一个新的套接字对象和客户端地址。handle_client()处理客户端的通信接收数据并回显给客户端。threading.Thread()为每个新连接启动一个新的线程以便服务器可以同时处理多个客户端。 运行服务端
客户端响应发送body1,正常回传。
3. 创建 TCP 客户端发送端
客户端的主要任务是连接到服务器并与服务器进行双向通信。客户端可以发送消息给服务器并接收服务器的响应。
3.1 代码示例TCP 客户端
import socket
import threading# 定义服务器地址和端口
HOST 192.168.1.101 # 本地回环地址
PORT 8080 # 非特权端口client_socket Nonedef receive_messages():global client_socketwhile True:try:# 接收服务器的响应response client_socket.recv(1024).decode()if not response:breakprint(fReceived from server: {response})except Exception as e:print(fError receiving message: {e})breakdef start_client():global client_socketclient_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect((HOST, PORT))print(fConnected to server at {HOST}:{PORT})# 启动一个线程来接收消息receive_thread threading.Thread(targetreceive_messages)receive_thread.daemon True # 设置为守护线程主程序退出时自动结束receive_thread.start()while True:# 输入要发送的消息message input(Enter message to send (or type exit to quit): )if message.lower() exit:break# 发送消息给服务器client_socket.sendall(message.encode())client_socket.close()if __name__ __main__:start_client()3.2 代码解释
client_socket.connect()连接到指定的服务器地址和端口。client_socket.sendall()发送数据到服务器。client_socket.recv()接收来自服务器的数据。input()从用户输入获取要发送的消息用户可以输入 exit 来终止程序。 4. 运行示例 启动服务器 打开一个终端或命令提示符窗口导航到包含服务器代码的文件夹然后运行以下命令python tcp_server.py服务器将开始监听指定的端口并等待客户端连接。 启动客户端 打开另一个终端或命令提示符窗口导航到包含客户端代码的文件夹然后运行以下命令python tcp_client.py客户端将连接到服务器并允许用户输入消息发送给服务器。 测试通信 在客户端窗口中输入消息按回车键发送给服务器。服务器将接收消息并回显给客户端客户端会显示服务器的响应。用户可以继续发送消息或者输入 exit 来终止程序。
服务端接收
这个只能一发一收不能连续发或连续收接下来采用异步就可以实现这个缺陷而且响应更好 5. 异步 TCP 通信
为了提高性能和响应速度您可以使用 Python 的 asyncio 库来实现异步 TCP 通信。异步编程模型允许程序在等待 I/O 操作时执行其他任务从而提高效率。
5.1 异步 TCP 服务器
我们将创建一个异步 UDP 服务器它不仅可以接收来自客户端的数据包并回显还可以主动向客户端发送消息。服务器将维护一个客户端列表并定期检查是否有新消息需要发送给所有已连接的客户端。
import asyncio# 定义服务器地址和端口
HOST 192.168.1.111 # 本地回环地址
PORT 8080 # 非特权端口client_address Noneasync def handle_client(reader, writer):global client_addressdata await reader.read(1024)addr writer.get_extra_info(peername)client_address addr # 更新全局的 client_addressprint(fReceived from {addr}: {data.decode()})# 发送响应给客户端response fServer received: {data.decode()}writer.write(response.encode())await writer.drain()print(fSent to {addr}: {response})async def start_server():server await asyncio.start_server(handle_client, HOST, PORT)addr server.sockets[0].getsockname()print(fServer listening on {addr[0]}:{addr[1]})async with server:await server.serve_forever()async def broadcast_message():while True:msg await asyncio.to_thread(input, Enter message to broadcast (or type exit to quit): )if msg.lower() exit:breakif client_address is not None: # 确保 client_address 已经被设置try:_, writer await asyncio.open_connection(*client_address)writer.write(msg.encode())await writer.drain()writer.close()await writer.wait_closed()except ConnectionRefusedError:print(Client is not available.)else:print(No client connected yet.)async def main():# 启动服务器server_task asyncio.create_task(start_server())# 启动广播消息任务broadcast_task asyncio.create_task(broadcast_message())await asyncio.gather(server_task, broadcast_task)if __name__ __main__:asyncio.run(main())5.2异步 TCP 客户端
import asyncio# 定义服务器地址和端口
HOST 192.168.1.101 # 本地回环地址
PORT 8080 # 非特权端口async def receive_messages(reader):while True:try:# 接收服务器的响应response await reader.read(1024)if not response:breakprint(fReceived from server: {response.decode()})except Exception as e:print(fError receiving message: {e})breakasync def send_messages(writer):while True:# 输入要发送的消息message await asyncio.get_event_loop().run_in_executor(None, input, Enter message to send (or type exit to quit): )if message.lower() exit:break# 发送消息给服务器writer.write(message.encode())await writer.drain()async def start_client():reader, writer await asyncio.open_connection(HOST, PORT)print(fConnected to server at {HOST}:{PORT})# 启动两个任务一个用于接收消息一个用于发送消息receive_task asyncio.create_task(receive_messages(reader))send_task asyncio.create_task(send_messages(writer))# 等待任一任务完成即用户输入 exit 或连接断开done, pending await asyncio.wait([receive_task, send_task], return_whenasyncio.FIRST_COMPLETED)# 取消所有未完成的任务for task in pending:task.cancel()try:await taskexcept asyncio.CancelledError:passwriter.close()await writer.wait_closed()if __name__ __main__:asyncio.run(start_client())5.3 代码解释
asyncio.Protocol定义了一个异步协议类用于处理客户端连接。asyncio.open_connection()异步打开与服务器的连接。asyncio.run()启动异步事件循环并运行主函数。只能输入英文暂不支持中文 6. 总结
通过上述示例我们展示了如何使用 Python 实现 TCP 网络通信中的发送端和接收端。同步版本的代码简单易懂适合初学者而异步版本则提供了更高的性能和更好的并发处理能力适用于更复杂的应用场景。 7. 常见问题解答 Q: 如何处理多个客户端的并发连接 A: 使用多线程或多进程可以处理多个客户端的并发连接。对于更高效的方式建议使用 asyncio 库来实现异步编程。 Q: 如何确保数据传输的可靠性 A: TCP 协议本身就是一个面向连接的可靠协议它会自动处理数据包的丢失、重复和乱序问题。此外您可以在应用层添加更多的错误检测机制如校验和或消息确认。 Q: 如何处理大文件传输 A: 对于大文件传输建议将文件分块发送并在每次发送后等待服务器的确认。这样可以确保每一块数据都成功传输并且可以在出现问题时重新发送。 8. 参考资料
Python 官方文档 - socket 模块Python 官方文档 - asyncio 模块TCP/IP 协议详解 从而实现对外部世界进行感知充分认识这个有机与无机的环境科学地合理地进行创作和发挥效益然后为人类社会发展贡献一点微薄之力。 我会持续更新对应专栏博客非常期待你的三连如果鹏鹏有哪里说的不妥还请大佬多多评论指教下面有我的群推广欢迎志同道合的朋友们加入期待与你的思维碰撞