Python локальный сервер / клиент сетевой код для добавления / вычитания / умножения / деления двух чисел? - PullRequest
0 голосов
/ 19 февраля 2011

Недавно я читал «Основы сетевого программирования на Python», так как я интересуюсь компьютерными сетями и для практики составил код, основанный на первых нескольких примерах программ, которые я видел в книге… в данном случае я »написал "TCP-сервер, который связывается с локальным хостом и случайным портом и клиентом, который соединяется с локальным хостом.Клиент дает серверу строку, состоящую из 2 чисел и операции, разделенных пробелами (то есть '5 x 4'), и сервер оценивает это и возвращает соответствующее значение. Мой код выглядит следующим образом:

#!/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'

Мой вопрос: это лучший способ сделать это или есть лучший способ?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Twisted - это лучший сетевой движок в мире.Он будет обрабатывать все, что вы хотите, в приятном и дружественном куске кода, который является дружественным для процессора и ввода-вывода для вашей машины.http://twistedmatrix.com/trac/

0 голосов
/ 19 февраля 2011

Я использовал это для нескольких мелочей: http://docs.python.org/library/asynchat.html

Как говорят в документах, это больше подходит для серверов, связанных с вводом / выводом, чем для серверов, связанных с процессором.

0 голосов
/ 19 февраля 2011

В дальнейшем будет гораздо проще использовать какой-то сетевой пакет, а не полагаться только на стандартную библиотеку python. Я думаю, что 0MQ было бы хорошим местом для начала, с ним легко работать и изучать привязки к Python, большая часть того, что вы изучаете, все еще применяется, и это быстро и эффективно.

Кроме того, он не привязывает вас к языку Python для всех частей приложения и не заботится о методе транспорта, внутрипроцессном, межпроцессном, tcp ...

http://zeromq.github.com/pyzmq/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...