LINUX.ORG.RU

Как постоянно прослушивать порт и отдавать данные?

 ,


3

1

Сабж
Нашел такое решение:

import socket

sock = socket.socket()
sock.bind(('127.0.0.1', 3333))
sock.listen(1)
conn, addr = sock.accept()

print ('connected:', addr)

while True:
	data = conn.recv(1024)
	if not data:
		break
	conn.send(data.upper())

conn.close()




Но сразу после отдачи данных скрипт завершается, а мне нужно, чтобы висел и отдавал на каждое обращение. Как это сделать? Если просто убрать conn.close() - все равно завершается

★★★★★

Последнее исправление: Qwentor (всего исправлений: 2)

попробовать заменить

	if not data:
		break
на
	if data: # А лучше вообще if data is not None
		conn.send(data.upper())

Dred ★★★★★
()
Ответ на: комментарий от Dred

Пробовал - первое обращение клиента проходит, второе намертво виснет

Qwentor ★★★★★
() автор топика
from socketserver import ThreadingTCPServer, StreamRequestHandler


class Handler(StreamRequestHandler):
    def handle(self):
        self.wfile.write(self.rfile.read())

if __name__ == "__main__":
    srv = ThreadingTCPServer(('127.0.0.1', 3333), Handler)
    srv.serve_forever()

Batteries included же :)

deadNightTiger ★★★★★
()

Если хочется именно на socket - то как-то так:

import socket

sock = socket.socket()
sock.bind(('127.0.0.1', 3333))
sock.listen(1)
while True:
    conn, addr = sock.accept()

    print ('connected:', addr)

    while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.send(data.upper())

    conn.close()

deadNightTiger ★★★★★
()
Ответ на: комментарий от deadNightTiger
import socket

conn = socket.socket()
conn.bind( ('127.0.0.1', 3333) )
conn.listen(100)

while True:
	try: client, addr = conn.accept()
	except socket.error: 
		pass 
	else: 
		
		data = client.recv(1024)
		print(data)
		client.send(data.upper())



Вот так работает вроде

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Есть asyncio

import asyncio

async def handle(r, w):
    w.write(await r.read())
    w.write_eof()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    srv_coro = asyncio.start_server(handle, '127.0.0.1', 3333, loop=loop)
    srv = loop.run_until_complete(srv_coro)
    loop.run_forever()
но это только python3.6+ (в 3.4-3.5 немного другой синтаксис, в 3.3 не было в стандартной библиотеке, но было в пипе). В продакшен обычно используют twisted или tornado.

deadNightTiger ★★★★★
()
Последнее исправление: deadNightTiger (всего исправлений: 1)
Ответ на: комментарий от deadNightTiger

Круто. Но у меня 3.4 как раз, т.е. как говорите другой синтаксис,
но погляжу

пока временно оставлю вариант который написал выше

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от deadNightTiger

У меня будет JSON не сильно большого размера - думаю просто задам число, в которое точно влезет. Хотя может и сделаю цикл

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Для 3.4 async def handle(...): заменяешь на

@asyncio.coroutine
def handle(...):
, вместо await r.read() делаешь yield from r.read() и всё.

deadNightTiger ★★★★★
()
Ответ на: комментарий от deep-purple

Select есть, конечно https://docs.python.org/2/library/select.html и всякие https://docs.python.org/2/library/asyncore.html были и http://www.gevent.org/ есть. И twisted и прочее. В продакшене обычно twister или tornado используют. Хотя вот во всяких яндексах gevent`а много.

Вот годное видео - основы, без всяких сторонних библиотек https://www.youtube.com/watch?v=MCs5OvhV9S4

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

В продакшене обычно twisted или tornado используют

Надеюсь, уже нет. Уж лучше треды, gevent или asyncio (правда, ни одна из подходов не идеален). А старое говно на коллбэках лучше закопать и не вспоминать.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

что значит «уже нет»? продакшен это как правило про легаси, ибо современного продакшена на питончике мало - хайпа то нет, значит дядьки с бабосами про него и не знают. исключения в пределах погрешности.

genryRar ★★
()
Ответ на: комментарий от true_admin

И в twisted, и в tornado (современных) есть корутины, если что. Правда, twisted так и не портирован до конца на 3 :(

deadNightTiger ★★★★★
()
Ответ на: комментарий от true_admin

Твистед 1000 лет не юзал, а в торнадо есть корутины и async/await синтаксис поддерживается. Плюс в торнадо есть всякие шаблоны встроенные, нормальная поддержка вебсокетов и т.п. Полноценный фреймворк.

pawnhearts ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.