2011-01-16 13 views
0

私は基本的なサーバーとクライアントスクリプトを作成しようとしています。その考え方は、クライアントがサーバーに接続してコマンドを実行できることです。 SSHのようなものですが、非常にシンプルです。 HERESに私のサーバーコード:Python - サーバーとクライアントの問題

import sys, os, socket 


host = ''     
port = 50103 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host, port)) 
print("Server started on port: ", port) 
s.listen(1) 
while (1): 
    conn, addr = s.accept() 
    print 'New connection from ', addr 
    try: 
     while True: 
      rc = conn.recv(2) 
      pipe = os.popen(rc) 
      rl = pipe.readlines() 
      fl = conn.makefile('w', 0) 
      fl.writelines(rl[:-1]) 
      fl.close() 
    except IOError: 
      conn.close() 

そして、ここでは私のクライアントである:ここでは

import sys, socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = 'localhost' 
port = input('Port: ') 
s.connect((host, port)) 
while (1): 
    cmd = raw_input('$ ') 
    s.send(cmd) 
    file = s.makefile('r', 0) 
    sys.stdout.writelines(file.readlines()) 
    file.close() 

は私の問題です。私はサーバーを起動してから、同じマシンでクライアントを実行します。私はポートに入り、接続します。それから私は '$'であるraw_inputを取得します。私が 'ls'のようなコマンドを入力すると、クライアント側でハングするだけです。私はlsの出力を受け取るためにクライアントのためにサーバーを終了しなければなりません。ところで、私はUbuntu Linuxを実行しています。それが重要かどうかはわかりません。

+0

今、私はとにかくあなたのためにあなたのコードを書きました。答えが更新されます。あなたはsshを使ってやろうとしていることは何でもできます。 –

+0

SSHを再発明しないでください。いくつかの貧しい人は、これをサポートし、維持する必要があります! – Johnsyweb

答えて

1

あなたはクライアントで一度だけ接続しています。そして、読み取りごとにソケットを閉じているサーバーで。

この例を見てください。

http://ilab.cs.byu.edu/python/socket/echoserver.html

あなたは間違ってかなりの数のことをやっています。

+0

ありがとうございます。私はコードを更新しようとしましたが、試してみるとクライアント側でハングするだけです:/ 私はその例でいくつかのことを実装しようとしましたが、それでも動作しません。 – AustinM

2

ソケットでfile()を作成してからreadlines()を使用すると、ファイルの終わりに達するまで処理が続きます。ソケットのケースでは、もう一方の端から閉じています。

この場合、makefile()を使用することは意味がありません。特にmakeコマンドを作成し、各コマンドの後に閉じると意味があります。両端でsend()とrecv()を使うだけです。

クライアントが知っているように、サーバーがクライアントに「ここで応答します」と「これが応答の終わりです」と指示するような、ある種の実際の「プロトコル」が必要なのでしょう。さもなければ、応答を待つのをいつ止めるかを知るのが難しくなります。 :)

作品例とアップデート:

server.py:

import sys, os, socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(('', 50500)) 
print("Server started") 
s.listen(1) 
while True: 
    print "Accepting" 
    conn, addr = s.accept() 
    print 'New connection from ', addr 
    while True: 
     try: 
      rc = conn.recv(1024) 
      print "Command", rc 
      if not rc.strip(): 
       continue 

      if rc.strip() == 'END': 
       print "Close" 
       conn.send("**END**") 
       conn.close() 
       break 
      else: 
       conn.send("This is the result of command %s\n" % rc) 
     except Exception: 
      conn.close() 
      sys.exit() 

client.py

import sys, os, socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('localhost', 50500)) 
while True: 
    cmd = raw_input('$ ') 
    s.send(cmd) 
    result = s.recv(1024) 
    print result 
    if result == "**END**": 
     print "Ending" 
     break 
+0

ありがとうございます。私は出力を取得しないので、それは動作しません。私はコードで遊んでいます。出力をoso.system(rc)にプリフォームした後、conn.send(出力)を下にして作成しました。これで、サーバー側でコマンドが実行されますが、クライアントには送信されません。何か案は? – AustinM

+1

@AustinM:そうですね、送信はどうですか?そして、あなたは今でも "ssh "と打ち込んで、あなたがしようとしていることを実行することができます。 –

+0

出力はos.system(rc)に設定されていますが、conn.send(出力)を送信しようとしています。そして、それは私が仕上げる必要がある簡単なプロジェクトのためです。 – AustinM

関連する問題