2017-01-05 5 views
0

Python3でポートをリッスンします。Python3のソケット、リスニングポート

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

私が聞きたいデータを、次のようになります。だから私は、このブロックを変更する必要があるが、私はどのように知らない

私は '\n' まで読む必要があるさ
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 
.. 

..

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

私は、NCを置き換えたい:

nc -k -l -p 30003 | python3 script.py 
また、私は間違っている、サーバーの準備ができなければなりません何かあれば再接続script.py

while True: 
    for string in sys.stdin: 

を必要とする210

あなたが\n文字を見つけるまで、主なアイデアは、読み取ることがあるだけでnc -k -l -p 30003 | python3 script.py

答えて

0

のように、いつでもすべてのデータを取りますあなたのストリームに。もちろん\nは、あなたが読んでいる1024バイトを超えている可能性があります。したがって、読み込んだすべてをバッファに保存する必要があります。これは、例えば、そのようなクラスのためにエミュレートすることができます。

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

あなたがデータを提供するために、サーバーをご希望の場合は永遠に別のwhileループを使用します。

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 

このアプローチの問題は、並列性がないことです。サーバーは並列接続を処理しません。あなたが性能限界を打つまでは問題ないはず

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

:それを解決する一つの方法は、別のスレッドにそれぞれの新しい接続を送信することです。効率を改善する方法(イベントループなど)がありますが、それはこの質問を超えていると思います。

+0

私が絶対に望むものです。 しかし、いくつかの問題があります。最初に接続するとき: 'nc localhost port Ctrl + C ' とスクリプトが終了しました。 いつでも変更できるのですか?おかげさまで – user7365441

+0

@ user7365441あなたはリスニングソケットに永遠に 'accept'(つまり' while'ループ)を伝えるだけです。私は答えを更新しました。 – freakish

+0

素晴らしい!ありがとうございました! – user7365441

関連する問題