2010-11-21 9 views
1

練習として、私は簡単なPythonチャットのクライアント/サーバーシステムを探して、おもちゃを探しました。最初の大きな失敗は、サーバーとクライアントが通信するために単一のtcp接続を使用したことでした。もう1つは、2人の人(クライアントを使用する人とサーバーを使用する人)が通信できることです。第三に、連続した投稿は不可能でした。ある人がメッセージを送った後、もう一度話す前に他の人が1つのメッセージを送るのを待たなければなりませんでした。非常に、非常に制限しています。Pythonチャットのクライアント/サーバーの変更がひどく間違っている

私はそれをスレッド化し、ソケットを試し始めました。クライアントは一度サーバーに接続し、IPアドレスを指定してリスニングスレッドを作成し、サーバーのメッセージ受信者に再接続します。 すべての投稿がその受信者に送信され、接続されたクライアントのリストを繰り返してそれぞれのクライアントに接続し、メッセージを送信します(送信者の名前は最初、その他の機能です)。 (私はそう頻繁に新しい接続を開くと、それは非効率的であるようにすることを知っているが、私はそれが働いていたまで、私は、TCP接続を維持したい、とTHEN UDPに行く)

しかし、奇妙ながらくたが起こって始めました。エラー91の悪夢があると言っても過言ではありません。

誰もこのコードをこの構造と機能セット内でどのようにレンダリングできるのか識別できますか? (Pythonのバージョン2.6 YEY;プレースホルダで無限ループを無視する)

サーバコード:

from socket import * 
from time import time, ctime 
import Queue, threading 

IP = '' 
PORT = 5000 
PORTPlus = 2 
PORTRec = 1000 
ADS = (IP, PORT) 
namelist = [] 
clientlist = [] 



class clientRec(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     print "I'm this far:", (IP, (PORT + PORTRec)) 
     self.receiver = socket(AF_INET, SOCK_STREAM) 
     self.receiver.bind((IP, PORT + PORTRec)) 
     self.sender = socket(AF_INET, SOCK_STREAM) 
    def run(self): 
     global clientlist, namelist 
     self.receiver.listen(10) 
     connected = True 
     while connected: 
      tcpcli, addr = receiver.accept() 
      message = tcpcli.recv(1024)     # Accept clien't IP for home-dialing 
      for i in range(clientlist.__len__()):    # For each connected client 
       try: 
        sender.connect(clientlist(i))     # connect 
        sender.send(namelist[i] + message)   # and deliver message with sender's name 
        sender.close() 
       except: 
        del clientlist[i], namelist[i] 

print "ADS:", (IP, 5000) 
handle = clientRec() 
tcpsoc = socket(AF_INET, SOCK_STREAM) # Paperwork 
tcpsoc.bind(ADS)      # Bind self to port 
tcpsoc.listen(5)      # Listen on that port0 
handle.start()       # Start thread 

# Main 
while 1: 
    print "Waiting for connection" 
    tcpcli, addr = tcpsoc.accept()  # Accept unknown client 
    print "Connection received; handling..." 
    namelist.append(tcpcli.recv(1024)) # Accept client's name 
    client_IP = tcpcli.recv(1024)  # Accept clien't IP for home-dialing 
    client_port = int(tcpcli.recv(1024))# Accept clien't listening port 
    port_assign = PORT + PORTRec 
    tcpcli.send(str(port_assign))  # Tell the client that port 
    tcpcli.close()      # Close client connection 

    clientlist.append((client_IP, client_port))# Add client to send-list 
    print "Handled." 

tcpsoc.close() 

クライアントコード:

#!/usr/bin/env python 

from socket import * 
import threading, cgi, os 

IP = '' 
PORT = 5000 
PORTmy = 100 
ADS = (IP, PORT) 

class iListen(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.receiver = socket(AF_INET, SOCK_STREAM)# Paperwork 
     self.receiver.bind(('', PORT + PORTmy))  # Listen on that port 
     self.receiver.listen(5)      # Listen for posts 
    def run(self): 
     while listening: 
      tcpcli, addr = receiver.accept()  # Accept unknown client 
      message = tcpcli.recv(1024) 
      if message == "/q": 
       listening = False 
      tcpcli.close() 

# Initial CONNECT 
myname = raw_input("Tell me yer name partnah: ") 
tcpsoc = socket(AF_INET, SOCK_STREAM) 
tcpsoc.connect(ADS)      # First Connect 
tcpsoc.send(myname)      # Declare name 
tcpsoc.send(gethostbyname(gethostname()))# Give IP address 
tcpsoc.send(str(PORT + PORTmy))   # Give listening port 
ADS = (IP, int(tcpsoc.recv(1024)))  # Get new connect details 
tcpsoc.close()       # Close old connection 
listen = iListen()      # Create listener thread 
listen.start()       # Start listening 

# RECONNECT 
print ADS 
tcpsoc = socket(AF_INET, SOCK_STREAM) 
tcpsoc.connect(ADS)      # reconnect to new port 
connected = True 

# Main Chat-loop 
while connected: 
    mes = raw_input(">>>") 
    tcpsoc.send(mes) 
    if mes == "/q": 
     tcpsoc.close() 
     connected = False 
     time.sleep(4) 

sys.exit() 
+3

あなたは幸運を得ると、誰かがここにあなたのためにあなたのコードを書いていますが、私はそれを疑う、partnahかもしれません。 StackOverflowの質問は、少し集中して、宿題のように見えるようにする必要があります。 – msw

+0

チャットのUDP?ハハ良い人! PS:インデントを修正しました... –

+1

"変なことが起き始めました"と言っているのではなく、あなたが見ているエラーを詳細に説明したいかもしれません。また、この問題をより簡単な例に分けて、問題をより詳細に特定してください。それはあなた自身の利益のためにあり、また質問を答えるかもしれません。 –

答えて

0

私はたくさんこのような何かに取り組んでいます、テキスト暗号化を実装するつもりです。私はあなたがクライアントリストのためにリストを訴えているのを見ています...しかし、私はそれをするより良い方法があると言います。私は辞書を使用しています。

辞書に精通している場合は、次の段落はスキップしてください。

双極子は基本的に2つの変数を扱うことができ、{}を使用して定義されます。そう、これを使用して

>>> stuff = {'a':'hello','b':'world'} 
>>> print stuff['a'] 
hello 
>>> print stuff['a'],stuff['b'] 
hello world 

、あなたは{「ユーザ名」:「IPADDR」}のような辞書作ることができ、両方のユーザ名とIPSがすべて一つの変数になるようにあなたがそれを作ることができるこの方法で。あなたが私のような最終製品を望むなら、あなたはそれを作って、すべてのサーバーがメッセージを繰り返して、それが接続されているすべての人に送信するようにします。サーバーはユーザー名を循環するだけです。

もうひとつのメモとして、私はtcpsoc.listen(5)は一度に何人も接続できると思っています...私はどこかで読んだものだと思います。

なぜこのエラーが発生するのかわかりませんが、中途半端なコードを見たい場合は、歓迎すべきものです。 (ランダム輸入を無視し、これはまだ使用されていませんが、暗号化システムの一部となります)

http://piratepad.net/PwQzdU0bkk

関連する問題