2016-10-26 26 views
0

私はPythonでクライアントを書いて、TCPサーバーにパケットを送信したいと思います。 私は、サーバーimplemantationを知らないが、それは常に(nc server 4444後など)、このようにメニューを返す:Pythonサーバー接続

Make your choice: 
1- test1 
2- test2 
3- insert two numbers 
4- test4 
5- test5 
6- test6 

その後、私は例えば、私が送ってしまう、のpythonですべてを自動化したいシーケンスを次に示します。

1 (test1) 
3 (insert two numbers) 
2 
1 
6 (test6) 

私は次のスクリプト

class Connect(object): 

    def connect(self): 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     print('connecting to host') 
     sock.connect(('127.0.0.1',4444)) 
     return sock 

    def send(self, command): 
     sock = self.connect() 
     recv_data = "" 
     data = True 

     print('sending: ' + command) 
     sock.send(command) 

     while data: 
      data = sock.recv(1024) 
      recv_data += data 
      print('received: ' + data) 

     sock.close() 
     return recv_data 

def main(): 
    connect = Connect() 
    connect.send("1") 
    connect.send("3") 
    connect.send("2") 
    connect.send("1") 
    connect.send("6") 

if __name__ == "__main__": 
    main() 

で試してみました。しかし、それは動作しません!

提案がありますか?

ありがとうございます!

+0

サーバの実装を見ることなく確かに知る方法はありませんが、サーバがテキストメニューを戻している場合は、サーバが予期していると思われます。各コマンドの最後に改行または復帰改行が含まれています。 –

+0

@GilHamiltonはいそうですが、各コマンドの最後に改行が必要です。たとえば、ncでうまくいきますが、コマンドごとに新しい行を挿入すると、最初のもの(connect.send( "1 \ n"))のみが実行され、永遠に待機します – Livio

答えて

1

いくつかの注意:

1.接続にあなたがsendを使用するたびに開き、閉じないでください。サーバーの実装はわかりませんが、同じクライアントが再接続したのか、新しいクライアントなのかをサーバーが伝えることはできません。 TCPにはこれのためのツールがないだけです。あなたのケースのクライアントポート番号さえあなたのOSによって無作為に選ばれます。完了したら、接続を一度開いて閉じます。あなたは、いくつかの点で永遠にここで立ち往生する可能性があります

2.

while data: 
    data = sock.recv(1024) 

サーバが接続を閉じた場合は、例外を取得することがあります。サーバーが送信するものがない場合、サーバーは永遠に待機します。 selectを使用してサーバーから何かが送信されたかどうかを確認するか、 +例外が発生してrecvが一定時間待機するようにしてください。

疑わしい品質のsock.recv交換の迅速な非選択例:

def try_recv(sock, bufsize, timeout): 
    old_timeout = sock.gettimeout() 
    sock.settimeout(timeout) 
    try: 
     data = sock.recv(bufsize) 
    except socket.timeout: 
     data = None 
    sock.settimeout(old_timeout) 
    return data 
+0

ポイント2が私の解決策になります。それをテストしてから私はあなたにフィードバックを与えるでしょう – Livio

0

おそらく、あなたのpythonを使用する必要はありません。

printf "1\n3\n2\n1\n6\n" | telnet 127.0.0.1 4444 
+0

それは(ncでも)動作しますが、16進数( "\ x40 \ x41 \ x00 \ x80")も送信する必要があります – Livio

関連する問題