python3的网络编程与socket编程示例

1 网络编程基础

当今网络基本上都是使用TCP/IP协议进行通讯的。任何应用,比如浏览网页,微信,支付宝,抖音等都是通过TCP/IP协议进行通讯的。

TCP/IP协议就是一种数据传输方案。

在基于Python 3的网络编程中,需要掌握一些基本概念和模块。以下是一些重要的内容:
在这里插入图片描述

1.1 Socket 编程

Python 3提供了多种库来帮助进行网络编程。最基本的库是socket,它提供了标准的BSD套接字接口,并且可以用来创建客户端和服务器。通过使用socket库,可以进行底层网络通信。涉及的核心概念包括:

套接字类型(TCP / IP 套接字、UDP 套接字等)
套接字函数(如socket(), connect(), bind(), listen(), accept(), send(), recv()等)
客户端和服务器建立连接的过程
网络地址和端口号
非阻塞套接字和超时设置
套接字选项
使用with上下文管理器自动关闭套接字

通过socket编程接口进行信息传输可以按照如下图:
在这里插入图片描述
我们通过requests库发送HTTP请求消息,其实resquests库底层也是使用socket编程接口。

1.2 TCP 和 UDP 的使用

了解TCP(面向连接的协议)和UDP(无连接的协议)之间的差异至关重要,并学习什么时候使用它们。

TCP常用于要求高可靠性的应用,如网页浏览、文件传输、电子邮件等。
UDP常用于要求高性能和实时通信的应用,如视频流、在线游戏等。

1.3 高级网络模块

除了底层的sockets之外,Python还提供了更高级别的网络相关的模块:

http.client:用于创建HTTP客户端。
http.server:包含一个简单的HTTP服务器类。
urllib.request:用于打开和读取URLs,常用于HTTP请求。
ftplib:用于FTP传输。
smtplib:用于发送电子邮件。
ssl:用于在套接字上提供TLS/SSL安全性。

1.4 并发编程

当您创建网络服务器时,您通常需要同时处理多个客户端。这涉及到并发编程的概念,可以使用多线程、多进程或异步IO(例如asyncio模块)来实现。

线程(threading模块):可以为每个客户端创建一个新线程。
进程(multiprocessing模块):可以为每个客户端创建一个新进程。
异步IO(asyncio模块):使用单线程通过协程处理多个客户端连接和任务。

2 TCP协议的通讯及其代码展示

tcp进行通讯的双方,分为服务端和客户端。
tcp协议进行通讯的双方,最需要先建立一个虚拟连接,然后双方程序才能发送业务数据信息。

下面我们通过一个客户端程序和服务器端程序来展示这个通讯过程

2.1 客户端程序

from socket import *

IP="127.0.0.1"
SERVER_PORT=50000
BUFLEN=1024

#实例化一个socket对象,指明协议
dataSocket=socket(AF_INET,SOCK_STREAM)
# 连接服务器端socket
dataSocket.connect((IP,SERVER_PORT))
while True:
    # 从终端读取用户输入的字符串
    toSend=input(">>> ")
    if toSend=="exit":
        break
    #发送消息,也要编码为bytes
    dataSocket.send(toSend.encode())
    # 等待接收服务端的消息
    recved=dataSocket.recv(BUFLEN)
    # 加入返回孔bytes,表示对方关闭了连接
    if not recved:
        break
    # 打印读取的信息
    print(recved.decode())

dataSocket.close()

2.2 服务器端代码

from socket import *

# 主机地址为0.0.0.0,表示绑定本机所有的网络接口IP地址。
# 等待客户端进行连接
IP="0.0.0.0"

# 端口号
PORT =50000
# 定义一次从socket缓冲区最多读取512个字节数据
BUFLEN=512
# AF_INET表示该socket网络层使用的IP协议
#参数SOCK_STREAM表示该socket传输层的tcp协议
listenSocket=socket(AF_INET,SOCK_STREAM)

# socket绑定地址和端口
listenSocket.bind((IP,PORT))

# 使socket处于监听状态,等待客户端的连接请求
# 参数5表示最多接收多少个等待连接的客户端
listenSocket.listen(5)
print(f"服务端启动通知,在{PORT}端口等待客户端连接...")

dataSocket,addr=listenSocket.accept()
print("接受一个客户端连接:",addr)

while True:
    # 尝试读取对方发送的消息
    # BUFLEN 指定从接受缓冲里最多读取多少字节
    recved=dataSocket.recv(BUFLEN)
    # 如果返回空bytes,表示对方关闭了连接
    # 退出循环,结束消息收发
    if not recved:
        break
    # 读取的字节数据是bytes类型,需要解码为字符串
    info=recved.decode()
    print(f"收到对方信息:{info}")
    # 发送的数据类型必须是bytes,所以要进行编码
    dataSocket.send(f"服务器接收到了信息{info}".encode())

# 服务端也调用close()关闭socket
dataSocket.close()
listenSocket.close()

2.3 结果展示

我们先运行服务器端程序,随后运动客户端程序,并在客户端代码的输入框中依次输入"hello world"、“next message”、“exit”
则在客户端运行结果展示如下:
在这里插入图片描述
在服务器端展示结果如下:
在这里插入图片描述

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的聊天室的 Python 代码示例,使用 socket 网络编程实现: server.py: ```python import socket import threading # 创建 socket 对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() port = 8000 # 绑定端口号 server_socket.bind((host, port)) # 设置最大连接数,超过后排队 server_socket.listen(5) # 客户端列表 clients = [] # 用于广播消息到所有客户端 def broadcast(message): for client in clients: client.send(message) # 处理客户端连接 def handle_client(client_socket, client_address): print(f"New connection from {client_address}") clients.append(client_socket) while True: # 接收客户端消息 message = client_socket.recv(1024) if not message: break # 广播消息到所有客户端 broadcast(message) # 关闭客户端连接 clients.remove(client_socket) client_socket.close() print(f"Connection from {client_address} closed") # 循环监听客户端连接 while True: # 等待客户端连接 client_socket, client_address = server_socket.accept() # 创建新线程处理客户端连接 client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_thread.start() ``` client.py: ```python import socket import threading # 创建 socket 对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() port = 8000 # 连接服务器 client_socket.connect((host, port)) # 接收服务器消息的线程函数 def receive(): while True: message = client_socket.recv(1024) print(message.decode()) # 创建新线程接收服务器消息 receive_thread = threading.Thread(target=receive) receive_thread.start() while True: # 发送消息给服务器 message = input() client_socket.send(message.encode()) ``` 在命令行中运行 server.py,然后在另一个命令行中运行 client.py,即可实现简单的聊天室功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_Bri

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值