Сетевое программирование на Python - PullRequest
2 голосов
/ 24 января 2010

Какую библиотеку мне использовать для сетевого программирования? sockets лучший, или есть интерфейс более высокого уровня, который является стандартным?

Мне нужно что-то, что будет довольно кроссплатформенным (например, Linux, Windows, Mac OS X), и мне нужно только иметь возможность подключаться к другим программам Python с использованием той же библиотеки.

Ответы [ 8 ]

7 голосов
/ 25 января 2010

Вы просто хотите отправить данные Python между узлами (возможно, на разных компьютерах)? Возможно, вы захотите взглянуть на SimpleXMLRPCServer. Он основан на встроенном HTTP-сервере, который основан на встроенном Socket-сервере, ни один из которых не является наиболее промышленным сервером, но его легко настроить в спешке:

from SimpleXMLRPCServer import SimpleXMLRPCServer
server = SimpleXMLRPCServer(("localhost", 9876))

def my_func(a,b):
    return a + b

server.register_function(my_func)
server.serve_forever()

И легко подключиться к:

import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:9876')

print s.my_func(2,3) 
>>> 5
print type(s.my_func(2,3))
>>> <type 'int'>
print s.my_func(2,3.0):
>>> 7.0

Twisted популярно для промышленных приложений, но у него жесткая кривая обучения.

6 голосов
/ 24 января 2010

ответ зависит от того, что вы пытаетесь сделать.

"Какую библиотеку мне использовать для сетевого программирования?" довольно расплывчато.

например, если вы хотите использовать HTTP, вы можете посмотреть на такие стандартные библиотеки, как urllib, urllib2, httplib, сокеты. Все зависит от того, какой протокол вы хотите использовать, и на каком сетевом уровне вы хотите работать.

в python есть библиотеки для различных сетевых задач ... электронная почта, web, rpc и т. Д. И т. Д. *

для начала, посмотрите справочное руководство по стандартной библиотеке и посмотрите, какие задачи вы хотите выполнить, а затем перейдите оттуда: http://docs.python.org/library/index.html

6 голосов
/ 24 января 2010

Есть рамки, которые могут вас заинтересовать: Витая

5 голосов
/ 25 января 2010

Лично я просто использую asyncore из стандартной библиотеки, которая немного похожа на очень урезанную версию Twisted, но это потому, что я предпочитаю простой и низкоуровневый интерфейс. Если вам нужен интерфейс более высокого уровня, особенно просто для связи с другим экземпляром вашей собственной программы, вам не обязательно беспокоиться о сетевом уровне, и вы можете рассмотреть что-то более высокого уровня, например RPyC или пиро вместо. Сеть становится подробностью реализации, и вы можете сосредоточиться только на отправке информации.

5 голосов
/ 24 января 2010

Как уже упоминалось, Twisted является самым популярным (на сегодняшний день). Тем не менее, есть много других альтернатив, которые стоит изучить. Торнадо и Дизель , вероятно, два главных претендента. Более полное сравнение находится здесь .

4 голосов
/ 24 января 2010

Многим нравится Витая . Некоторое время я был большим поклонником, но, немного поработав с ним и подумав об этом, я разочаровался. Это сложно, и в прошлом я смотрел, во многих из них предполагалось, что ваша программа всегда сможет отправлять данные, что приводит к возможным ситуациям, в которых ваша программа постоянно использует память, постоянно буферизуя данные для отправки, которые не не поднята удаленной стороной или недостаточно быстро.

На мой взгляд, это во многом зависит от того, какое сетевое программирование вы хотите делать. Много раз вы действительно не заботитесь о том, чтобы что-то сделать, пока вы ждете ввода-вывода. HTTP, например, очень ориентирован на запрос-ответ, и если вы говорите только с одним сервером, нет особых оснований для того, чтобы использовать что-то вроде Twisted и простых сокетов или встроенные библиотеки Python HTTP будут работать нормально.

Если вы пишете какой-либо сервер, вам почти наверняка нужно ориентироваться на события. У Twisted есть небольшое преимущество, но оно все еще кажется мне слишком сложным. Например, Bittorrent был написан на Python и совсем не использует Twisted.

Еще один фактор, поддерживающий Twisted, заключается в том, что для него уже написан код для многих протоколов. Поэтому, если вы хотите говорить по существующему протоколу, возможно, для вас уже проделана большая тяжелая работа.

1 голос
/ 25 января 2010

Модуль socket в стандартной библиотеке, на мой взгляд, является хорошим выбором, если вам не нужна высокая производительность.

Это очень известный API, который знают почти все разработчики почти всехязыки.Это довольно скромно, и в Интернете доступно много информации.Более того, другим людям будет легче понять ваш код.

Я полагаю, что управляемая событиями среда, такая как Twisted, имеет лучшую производительность, но в основных случаях достаточно стандартных сокетов.

Конечно, если вы используете протокол более высокого уровня (http, ftp ...), вы должны использовать соответствующую реализацию в стандартной библиотеке python.

0 голосов
/ 26 августа 2016

Сокет - это API низкого уровня, он напрямую связан с интерфейсом операционной системы. Twisted, Tornado ... являются высокоуровневыми фреймворками (конечно, они построены на сокете, потому что сокет низкого уровня). Когда дело доходит до программирования TCP / IP, вы должны иметь некоторые базовые знания, чтобы принять решение о том, что вы должны использовать:

  • Будете ли вы использовать известный протокол, такой как HTTP, FTP или создать свой собственный протокол?
  • Блокирующий или неблокирующий? Twisted, Tornado являются неблокирующими фреймворками (в основном, как nodejs). Конечно, сокет может делать все, потому что любой другой фреймворк базируется на нем;)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...