@delkov

Сокеты в Python3, как прослушать порт?

Доброго времени суток, уважаемые!
Есть поток вида
8,0,0,test,0,2016/07/19,14:40:57.938,2016/07/19,14:40:57.938,,,,,,,,,,,,0
3,0,0,test,0,2016/07/19,14:41:04.687,2016/07/19,14:41:04.687,,2475,,,,,,,,,,0
..

Он поступает на порт 30003 и обрабатывается так:
#!/bin/bash
        nc -l -k -p 30003 | python3 script.py

в самом script.py
while True:
    for string in sys.stdin:

Сервер в данном случае живет постоянно - после закрытия соединения, создать новое - не проблема.
Хочу заменить nc, а именно: слушать порт прямо из Python.
import socket
sock = socket.socket()
sock.bind(('', 30003))
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()

Т.е вопроса два:
1) С учетом входных данных, необходимо как-то видоизменить чтение - заканчивать его по символу новой строки.
2) Сервер должен слушать постоянно - после закрытия соединения, создать новое должно не быть проблемой.

Заранее много благодарен!
  • Вопрос задан
  • 1809 просмотров
Решения вопроса 1
@delkov Автор вопроса
class SocketLineReader:
    def __init__(self, socket):
        self.socket = socket
        self._buffer = b''

    def readline(self):
        pre, separator, post = self._buffer.partition(b'\n')
        if separator:
            self._buffer = post
            return pre + separator

        while True:
            data = self.socket.recv(1024)
            if not data:
                return None

            pre, separator, post = data.partition(b'\n')
            if not separator:
                self._buffer += data
            else:
                data = self._buffer + pre + separator
                self._buffer = post
                return data


import socket

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)

conn, addr = sock.accept()

print('connected:', addr)

reader = SocketLineReader(conn)
while True:
    data = reader.readline()
    print(data)
    if not data:
        break
    conn.send(data.upper())

conn.close()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы