2016-12-16 25 views
0

私の問題は、このサーバを作っていることです。サーバに 's'を送信してサーバをシャットダウンできるようにしたいのですが、どうしたらいいのですか?データを更新する(私はリターンとグローバルの両方を試みましたが、動作するようにはできませんでしたが、それは空のままですが、これについてのヒントを得ることができますか? 。Pythonサーバの関数内で変数を更新する

import socket 
import sys 
from _thread import * 
host = '' 
port = 4444 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

try: 
    s.bind((host, port)) 
except socket.error as e: 
    print(str(e)) 

s.listen(1) 
print('waiting for connetion') 
def threaded_client(conn): 
    conn.send(str.encode('welcome, type your data')) 

    while True: 
     global data 
     data = conn.recv(2048) 
     data = data.decode('utf-8') 
     reply = 'server output: '+ data 
     if not data: 
      print('connetion lost') 
      return data 
      break 
     conn.sendall(str.encode(reply)) 
    conn.close() 


while True: 
    global data 
    data = '' 
    conn, addr = s.accept() 
    print('connected to: '+ addr[0]+ ':' +str(addr[1])) 
    start_new_thread(threaded_client, (conn,)) 
    print(data) 
    if data == 's': 
     print('shutting down server goodbye....') 
     s.close() 
     exit() 
+1

をトリミングする必要があり、実際にs\r\nです:戻りdata'を?何も返さないことが保証されています。そして、あなたは 'start_new_thread'の戻り値をどこからでも確認しないので、実際にこの方法で試してはいけません。グローバルなトレフは大規模な競争状態のようです。 – luk32

+0

おかげで、本当にpythonとコーディング全体に新しい、一緒に行くようにインターネットの周りに見つけたものをたくさん使用しました – cryseth

答えて

0

38行程度で、まだ多くの改善COUがあります

while True:   
     if data and data.strip() == 's': 
      print('shutting down server goodbye....') 
      s.close() 
      exit() 

に変更しますしかし、この変更は 's'が検出された場合にスクリプトを終了させます。あなたのコードで

データのチェック==「s」は、二つの理由のために失敗しました:

  • チェックは一度だけ実行し、メインスレッドがアイドル状態に行ってきました。ルーピングすることにより、将来的にデータ値をチェックすることができます。
  • データ値は、そう、あなたが `ない場合は、データのようなものを書いた場合は、データを取り戻すことを期待するにはどうすればよいの改行に
+0

おかげで、これと他のコメント私は私がこの仕事をより良くする方法を理解すると思う非常にプログラミングに新しい:)を学ぶ楽しみ – cryseth

+0

あなたは大歓迎です。受け入れられたとして私の答えをマークしてください、またはupvote、それはSOに「感謝」と言う最良の方法です。 –

+0

ya:D new to stackoverflow aswell – cryseth

関連する問題