2012-03-31 8 views
2

ここではこのコードに問題があります。私はソケットを開いて、whileループでそれを聞いています。私はそれは非常にうまく動作しますが、私は行のいくつかの書き込みを送信するときに、Pythonスクリプトは、ちょうど1つの書き込みと書き込みの一部を処理複数の書き込みが単一のものとして処理される

socket_write($sock, $test, $len); 

でPHPスクリプトからデータを送信します。

import socket 

HOST = 'localhost' # the host 
PORT = 12126 # the port 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
while 1: 
    s.listen(0) 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    while 1: 
     data = conn.recv(1024) 
     if not data: break 
conn.close() 

私は、そのポートを聞いて1つずつ書き込む方法を探しています。

+0

は書き込みをバッファリングPHPますか? http://us.php.net/manual/en/function.fflush.php –

+0

はい私はそれらを印刷し、Pythonプログラムで見ることができます。 –

答えて

4

。バイトが入り、バイトが出ますが、メッセージの大きさを伝えるための他のメカニズムが必要です。 50バイト、次に75バイト、次にソケットの片方の20バイトを送信してからrecv(100)を呼び出すと、ブロッキングソケットから1〜100バイトのいずれかを取得できます。完全なメッセージがあるまでrecvのバッファリングを行い、完全なメッセージの内容を定義する必要があります。いくつかのオプション:

  1. 固定長のメッセージを送信します。
  2. メッセージの長さを表す固定数のバイトを送信し、次にメッセージを送信します。
  3. センチネルバイトでメッセージを区切ります。

はここでセンチネルバイトを使用して、受信したデータをバッファリングするクラスの例です:

import socket 

class Client(object): 

    def __init__(self): 
     self.buffer = '' 
     self.sock = None 

    def connect(self,address): 
     self.buffer = '' 
     self.sock = socket.socket() 
     self.sock.connect(address) 

    def get_msg(self): 
     '''Append raw data to buffer until sentinel is found, 
      then strip off the message, leaving the remainder 
      in the buffer. 
     ''' 
     while not '\n' in self.buffer: 
      data = self.sock.recv(4096) 
      if not data: 
       return '' 
      self.buffer += data 
     sentinel = self.buffer.index('\n') + 1 
     msg,self.buffer = self.buffer[:sentinel],self.buffer[sentinel:] 
     return msg 

    def close(self): 
     self.sock.close() 

if __name__ == '__main__': 
    c = Client() 
    c.connect((HOST,PORT)) 
    while True: 
     msg = c.get_msg() 
     if not msg: 
      break 
     print repr(msg) 
    c.close() 
+0

ああ、ありがとう、私が探していたものです。私はPythonにとってまだかなり新しいです。 –

1

私はそれがUNIXソケットの仕組みではないと思います。しかし、システムコールでは、多くのデータを返すことができ、メッセージをまとめてバッチ処理する可能性があります。 http://linux.die.net/man/2/recv

典型的な方法は、各メッセージ間に区切り文字を含むプロトコルを使用することです。例えば、HTTPとSMTPは改行を使ってメッセージの各部分を区切ります。

Pythonでは、あなたはこのようなものを使用することができます

方法ソケットの仕事ではありません
for message in data.split('\n'): 
    do_stuff(message) 

http://docs.python.org/howto/sockets.html

+0

これは私にとってはうまくいきません。私は最初の書き込みだけを接続で取得します。 –

関連する問題