2016-12-16 59 views
0

所以我的問題是即時通訊製作這臺服務器,我希望它能夠通過發送's'關閉服務器,但無論我嘗試我無法關閉服務器更新數據(你可以看到我已經嘗試了return和global,但不能讓它工作:(),它仍然是空的,我可以得到一個提示嗎?真的是新的python,所以如果可能的話,很容易理解。更新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

你怎麼能期望得到的數據回來,如果你寫的東西像'如果沒有數據:返回data'?它保證不會返回任何東西。而且你不檢查任何地方的'start_new_thread'返回,所以你不會真的這樣試試。走低谷全球似乎是一個巨大的競爭條件。 – luk32

+0

okey謝謝,真的是新的python和整體編碼,使用了很多我在互聯網上找到的東西,使它們走在一起 – cryseth

回答

0

在約38行,將其更改爲

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

還有許多改進,腠對代碼進行編碼,但如果檢測到「s」,此更改將導致腳本退出。

在您的代碼數據==「S」是失敗有兩個原因檢查:

  • 支票只跑一次,然後在主線程就處於閒置狀態。通過循環,您可以檢查未來的數據值。
  • 的數據值實際上是s\r\n所以你要修剪換行符
+0

okey謝謝你,有了這個和其他評論我想我明白如何使這項工作更好,仍然非常新的編程:)有趣的學習 – cryseth

+0

不客氣。請將我的答案標記爲已接受,或者讚揚它,因爲這是對SO說'謝謝'的最佳方式。 –

+0

得到亞:D新的stackoverflow以及 – cryseth