程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

python散装笔记——124: Python 网络编程

balukai 2025-03-05 13:19:33 文章精选 18 ℃

1: 创建一个简单的 HTTP 服务器

为了在本地网络中共享文件或托管简单的网站(HTML 和 JavaScript),你可以使用 Python 内置的 SimpleHTTPServer 模块。Python 应该在你的环境变量 Path 中。进入存放文件的文件夹并输入以下命令:

 $ python3 -m http.server 

如果未指定端口号,默认端口为 8000。因此,输出将是:

 Serving HTTP on 0.0.0.0 port 8000 ...

你可以通过在本地网络中连接的任何设备上输入以下地址来访问你的文件:

 http://主机IP地址:8000/

主机IP地址 是你的本地 IP 地址,通常以 192.168.x.x 开头。

要结束模块,只需按下 Ctrl+C

2 节:创建一个 TCP 服务器

你可以使用 socketserver 库来创建一个 TCP 服务器。以下是一个简单的回声服务器。

服务器端

 from socketserver import BaseRequestHandler, TCPServer
 
 class EchoHandler(BaseRequestHandler):
   def handle(self):
     print('connection from:', self.client_address)
     while True:
       msg = self.request.recv(8192)
       if not msg:
         break
       self.request.send(msg)
 
 if __name__ == '__main__':
   server = TCPServer(('', 5000), EchoHandler)
   server.serve_forever()

客户端

 from socket import socket, AF_INET, SOCK_STREAM
 sock = socket(AF_INET, SOCK_STREAM)
 sock.connect(('localhost', 5000))
 sock.send(b'Monty Python')
 sock.recv(8192) # returns b'Monty Python'

socketserver 使得创建简单的 TCP 服务器相对容易。然而,你应该注意,默认情况下,服务器是单线程的,一次只能为一个客户端服务。如果你想要处理多个客户端,可以使用 ThreadingTCPServer

 from socketserver import ThreadingTCPServer
 ...
 if __name__ == '__main__':
   server = ThreadingTCPServer(('', 5000), EchoHandler)
   server.serve_forever()

3: 创建一个 UDP 服务器

使用 socketserver 库可以轻松创建一个 UDP 服务器。

以下是一个简单的时钟服务器:

 import time
 from socketserver import BaseRequestHandler, UDPServer
 
 class CtimeHandler(BaseRequestHandler):
   def handle(self):
     print('connection from: ', self.client_address)
     # 获取消息和客户端套接字
     msg, sock = self.request
     resp = time.ctime()
     sock.sendto(resp.encode('ascii'), self.client_address)
 
 if __name__ == '__main__':
   server = UDPServer(('', 5000), CtimeHandler)
   server.serve_forever()

测试:

 >>> from socket import socket, AF_INET, SOCK_DGRAM
 >>> sock = socket(AF_INET, SOCK_DGRAM)
 >>> sick.sendto(b'', ('localhost', 5000))
 0
 >>> sock.recvfrom(8192)
 (b'Wed Aug 15 20:35:08 2012', ('127.0.0.1', 5000))

4: 在一个线程中启动简单的 HTTP 服务器并打开浏览器

如果你的程序在运行过程中输出网页,这将非常有用。

 from http.server import HTTPServer, CGIHTTPRequestHandler
 import webbrowser
 import threading
 
 def start_server(path, port=8000):
   '''在指定端口上启动一个简单的 Web 服务器,提供指定路径的内容'''
   os.chdir(path)
   httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
   httpd.serve_forever()
 
 # 在新线程中启动服务器
 port = 8000
 daemon = threading.Thread(name='daemon_server',
                           target=start_server,
                           args=('.', port))
 daemon.setDaemon(True) # 设置为守护线程,主线程结束后将被杀死
 daemon.start()
 
 # 打开 Web 浏览器
 webbrowser.open('http://localhost:{}'.format(port))

5: 最简单的 Python 套接字客户端-服务器

示例

服务器端:

 import socket
 
 serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 serversocket.bind(('localhost', 8089))
 serversocket.listen(5) # become a server socket, maximum 5 connections
 
 while True:
   connection, address = serversocket.accept()
   buf = connection.recv(64)
   if len(buf) > 0:
     print(buf)
   break

客户端:

 import socket
 
 clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 clientsocket.connect(('localhost', 8089))
 clientsocket.send('hello'.encode(''))

运行步骤:

首先运行服务器端代码(SocketServer.py),确保服务器已准备好监听/接收数据。

然后客户端发送信息到服务器。

服务器接收到数据后,程序终止。

Tags:

最近发表
标签列表