2016-06-12 6 views
3

やあみんな、私は、私は再びあなたの助けが必要だと思う:(パイソン - ソケット通信、複数のメッセージ

私はどこにでも見てきたが、私はまだ答えを見つけることができ、このソケット通信にこだわっている

問題:それは私にエラーを与えるか、スクリプトを終了どちらかの前に、私は唯一のクライアントから1つのメッセージを送ることができ を、私は、サーバーに複数のメッセージを送信できるようにする必要があり

サーバ側(図示。下記のとおりです):

# Echo server program 
import socket 
import time 
import os 

#----------------------------------------------------------------------------------------------------------------------- 

today = time.strftime('%Y.%m.%d') 
logFileName = "log - " + today + ".txt" 


HOST = '10.0.0.16'               
PORT = 8080                 # Reserve a port for your service 
BUFFER_SIZE = 1024               
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      # Create a socket object 
s.bind((HOST, PORT))              # Bind to the port 


def print_write(text): 
    log.write(time.strftime("%H:%M:%S") + " | " + text) 
    log.write("\n") 
    print text 


#----------------------------------------------------------------------------------------------------------------------- 


if os.path.isfile(logFileName) is True: 
    log = open(logFileName, 'a+') 
    print_write("[SERVER] Log for " + today + " already exists.") 
    print_write("[SERVER] Starting comms") 
else: 
    print "[SERVER] Log doesn't exist" 
    log = open(logFileName, 'a+')           # Create file -> log - %date%.txt 
    print_write("[SERVER] Log created") 


while True: 
    s.listen(1) 
    conn, addr = s.accept() 
    data = conn.recv(BUFFER_SIZE) 
    if data == "Comms Shutdown": 
     print_write("------ REMOTE SHUTDOWN ------") 
     conn.close() 
     raise SystemExit 
    else: 
     print_write("[COMMS] " + str(addr) + " says: " + data) 

log.close() 

申し訳ありません非常に混乱して混乱していますが、私はこのプロジェクトを終了する時間があまりありません。

私はここにあまりなく、を持っていないクライアント側では、私はあなたにこれをあげる:

import socket 

HOST = '10.0.0.16'   # The remote host 
PORT = 8080     # The same port as used by the server 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 

while True: 
    msg = raw_input() 
    s.sendall(msg) 
    print msg 

私はそれが動作しません知っている、それはあなたに私が必要なもののアイデアを与えることです。

ありがとうございます。

+0

サーバコードはrecvを1回だけ呼び出す前に再度呼び出します。新しい接続を開く前に 'recv'を何度か呼び出すためにwhileループなどを使用する必要があります。 – noteness

答えて

3

問題は、開いている各接続からの最初のメッセージだけを読み込んでから、次のメッセージに移動することです。 accept()メソッドは、新しい接続を待機し、新しい接続が到着したときに必要な情報を提供します。一方、recv()メソッドは、既存の接続からデータを受け取り、存在しない場合は待機します。単一のクライアントから複数のメッセージを受信したい場合は、最初の接続を待ってからrecv()でデータを待つだけです。これは、次のようになります。

s.listen(1) 
conn, addr = s.accept() 
while True: 
    data = conn.recv(BUFFER_SIZE) 
    if data == "Comms Shutdown": 
     print_write("------ REMOTE SHUTDOWN ------") 
     conn.close() 
     raise SystemExit 
    else: 
     print_write("[COMMS] " + str(addr) + " says: " + data) 

あなたはまた、複数のクライアントを管理できるようにしたい場合は、新しい接続を待っているwhileループから各1についてのスレッドを作成する必要があります。これはもう少し複雑です:

def client_handler(conn): 
    while True: 
     data = conn.recv(BUFFER_SIZE) 
     if data == "Comms Shutdown": 
      print_write("------ REMOTE SHUTDOWN ------") 
      conn.close() 
      raise SystemExit 
      # this will kill the server (remove the line above if you don't want that) 
     else: 
      print_write("[COMMS] " + str(addr) + " says: " + data) 

while True: 
    s.listen(1) 
    conn, addr = s.accept() 
    recv_thread = threading.Thread(target=client_handler, args=(conn,)) 
    recv_thread.start() 

このコードはすべてテストされていません。ロギング部分とソケット作成部分だけでなく、すべてのインポートを省略したことに注意してください。

+0

まさに私が探していたものです!大変、ありがとう。 – Pinco

関連する問題