利用 Python 本地主机服务器/客户端网络代码实现加减乘除运算

32 阅读2分钟

您对计算机网络感兴趣,想要编写 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、解决方案

  1. 使用 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()
  1. 使用 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())