您对计算机网络感兴趣,想要编写 Python 本地主机服务器/客户端程序,实现两个数字的加减乘除运算。您阅读了"Python 网络编程基础"一书,并基于书中的示例程序写出了一段代码:
#!/usr/bin/env python
import socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = '127.0.0.1'
PORT = 1060
if sys.argv[1] == 'server':
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)
while True:
print 'Now listening at: ', s.getsockname()
sc, sockname = s.accept()
print 'We have accepted a connection from', sockname
print sc.getsockname(), 'is now connected to', sc.getpeername()
message = sc.recv(1024)
print 'The client wants to perform the operation: ' + message
message = message.split()
if message[1] == '+':
result = float(message[0]) + float(message[2])
elif message[1] == '-':
result = float(message[0]) - float(message[2])
elif message[1] == '*':
result = round(float(message[0]) * float(message[2]), 3)
elif message [1] == '/':
result = round(float(message[0]) / float(message[2]), 3)
sc.sendall('The result is ' + str(result))
sc.close()
print 'Reply sent as ' + str(result) + '.'
print
elif len(sys.argv) == 5 and sys.argv[1] == 'client':
s.connect((HOST, PORT))
print 'You are now connected to: ', s.getsockname()
s.sendall(sys.argv[2] + ' ' + sys.argv[3] + ' ' + sys.argv[4])
reply = s.recv(1024)
print 'The return value is', repr(reply)
s.close()
else:
print >>sys.stderr, 'usage: addStream.py server or addStream.py client num1 +/-/*// num2'
您的问题是,是否还有更好的方法来实现这个程序。
2、解决方案
- 使用 Twisted 库 Twisted 是一个强大且灵活的 Python 网络引擎,它可以轻松地实现各种网络应用。Twisted 提供了多种高级别 API,可以帮助您快速开发网络应用,而无需关心底层网络细节。 Twisted 的优势:
- 高性能
- 可扩展性强
- 跨平台
- 支持多种协议
- 拥有庞大的社区和丰富的文档
使用 Twisted 库来实现您的程序,代码示例如下:
from twisted.internet import reactor, protocol
class EchoProtocol(protocol.Protocol):
def dataReceived(self, data):
self.transport.write(data)
class EchoFactory(protocol.Factory):
def buildProtocol(self, addr):
return EchoProtocol()
reactor.listenTCP(1060, EchoFactory())
reactor.run()
- 使用 asyncio 库 asyncio 是 Python 3.4 中引入的一个库,它可以编写异步网络应用。asyncio 的优势:
- 高性能
- 可扩展性强
- 跨平台
- 支持多种协议
- 拥有庞大的社区和丰富的文档
使用 asyncio 库来实现您的程序,代码示例如下:
import asyncio
async def echo_server(reader, writer):
data = await reader.read(1024)
writer.write(data)
await writer.drain()
async def main():
server = await asyncio.start_server(echo_server, '127.0.0.1', 1060)
await server.serve_forever()
asyncio.run(main())