2017-01-05 4 views
0

Ich möchte Port in Python3 hören.Socket in Python3, Überwachungsport

import socket 

sock = socket.socket() 
sock.bind(('', 9090)) 
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() 

Die Daten, die ich hören möchte, wie folgt aussieht:

8,0,0,test,0,2016/07/19,14:40:57.938,2016/07/19,14:40:57.938,,,,,,,,,,,,0 
8,0,0,test,0,2016/07/19,14:40:57.965,2016/07/19,14:40:57.965,,,,,,,,,,,,0 
3,0,0,test,0,2016/07/19,14:41:04.687,2016/07/19,14:41:04.687,,2475,,,,,,,,,,0 
.. 

, die ich gelesen wird müssen, bis '\n' Also muss ich diesen Block ändern, aber ich weiß nicht, wie ..

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

ich will ersetzen nc:

nc -k -l -p 30003 | python3 script.py 

wo script.py

while True: 
    for string in sys.stdin: 

Auch muss ich wieder an, wenn etwas schief, Server alle Daten bereit nehmen jederzeit sein muss, genau wie nc -k -l -p 30003 | python3 script.py

Antwort

0

Leitgedanke Sie lesen ist, bis \n Charakter finden in deinem Stream. Natürlich \n kann darüber hinaus 1024 Bytes, die Sie lesen, so müssen Sie alles, was Sie lesen, in einem Puffer speichern. Dies kann mit für eine solche Klasse Beispiel emuliert werden:

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 

Und Nutzung:

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() 

Wenn Sie für den Server wollen Daten dienen für immer verwenden Sie einen anderen while Schleife:

import socket 

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

while True: 
    conn, addr = sock.accept() 
    print('connected:', addr) 
    reader = SocketLineReader(conn) 
    # The other code goes here 

Das Problem mit diesem Ansatz ist, dass es keine Parallelität gibt. Ihr Server wird keine parallelen Verbindungen verarbeiten. Eine Möglichkeit, dies zu beheben ist es, jede neue Verbindung zu einem separaten Thread senden:

import socket 
import threading 

def handle(conn): 
    print('connected:', addr) 
    reader = SocketLineReader(conn) 
    # The other code goes here 

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

while True: 
    conn, addr = sock.accept() 
    threading.Thread(target=handle, args=(conn,)).start() 

Dies sollte in Ordnung sein, bis Sie Leistungsgrenze getroffen. Es gibt Möglichkeiten, die Effizienz zu verbessern (z. B. Ereignisschleifen), aber ich nehme an, dass es jenseits dieser Frage liegt.

+0

Es ist absolut was ich will. Aber es gibt einige Probleme: Wenn ich das erste Mal verbinden: 'NC Localhost Port Ctrl + C ' und das Skript beendet. Ist es möglich, es jederzeit zu ändern? Danke. – user7365441

+0

@ user7365441 Sie müssen nur Ihre hörende Buchse zu akzeptieren für immer (d. H. In einer 'while' Schleife). Ich habe die Antwort aktualisiert. – freakish

+0

Großartig! Vielen Dank! – user7365441