2012-11-12 89 views
-3

當我一起運行客戶端/服務器並嘗試發送消息時,似乎沒有任何人收到任何消息。爲什麼?爲什麼我的客戶端/服務器無法正常工作?

client.py:

import socket, sys 
import threading 

# Client for WutChat # 

PORT = 5000 

queue = [] 

def exitClient(s): 
    s.close() 
    print "Exiting..." 
    sys.exit() 

def connect(host, port): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    try: s.connect((host, port)) 
    except: return "error" 
    return s 

def recieveData(s): 
    while True: 
     data = s.recv(512) 
     if not data: continue 
     if data in queue: 
      continue 
     queue.append(data) 
     print data 

def sendData(s): 
    while True: 
     try: data = raw_input(">") 
     except EOFError: exitClient(s) 
     if data == "": print "no msg"; continue; 
     if data.startswith("/"): 
      print "Command detected" 
      continue 
     s.send(data) 

if __name__ == "__main__": 
    s = connect(sys.argv[1], int(sys.argv[2])) 
    threading.Thread(target=recieveData, args=(s,)).start() 
    threading.Thread(target=sendData, args=(s,)).start() 

server.py:

import socket, sys 
import threading 

# Server for WutChat # 

PORT = 5000 
DEBUG = True 

conns = {} 
msgqueue = [] 

def connect(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    try: s.bind(("", int(sys.argv[1]))) 
    except IndexError: s.bind(("", PORT)) 
    s.listen(1) 

    while True: 
     addr, obj = s.accept() 
     conns[addr] = obj 

     print str(addr)+" connected!" 

     threading.Thread(target=handle, args=(addr, obj, s,)).start() 


def handle(addr, obj, s): 
    while True: 
     try: msg = obj.recv(512) 
     except: 
      continue 

     print msg 
     msg = addr + msg 

     msgqueue.append(msg) 
     if DEBUG: print msgqueue 

     for conn in conns: 
      for message in msgqueue: 
       conns[conn].send(message) 
       del message 

if __name__ == "__main__": 
    connect() 
+0

由於[過長](http://sscce.org/#short),這個問題更適合[codereview.sx](http://codereview.stackexchange.com/)。 – phihag

回答

2

你身邊所產生的accept元組切換:

addr,obj = s.accept() 

應該

obj,addr = s.accept() 

要找到類似這樣的錯誤,請刪除handle中的通用try..except塊,並只捕獲您想要的特定錯誤。在您的具體情況下(如果obj.recv失敗),您可以捕獲socket.error,但發生這種情況時唯一明智的做法是關閉套接字並終止線程。

在不相關的說明中,您可能希望使用比obj更具描述性的名稱。 client_sock或簡單地sock

此外,

msg = addr + msg 

會失敗,因爲addr是一個元組,而味精字節字符串。你想

msg = repr(addr).encode('utf-8') + msg 

此外,

del message 

只是刪除了名message,並且是在你的情況下,no-op。您可能想使用Queue.get代替。

+0

感謝您的幫助 – Kaonashi

相關問題