練習として、私は簡単な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()
あなたは幸運を得ると、誰かがここにあなたのためにあなたのコードを書いていますが、私はそれを疑う、partnahかもしれません。 StackOverflowの質問は、少し集中して、宿題のように見えるようにする必要があります。 – msw
チャットのUDP?ハハ良い人! PS:インデントを修正しました... –
"変なことが起き始めました"と言っているのではなく、あなたが見ているエラーを詳細に説明したいかもしれません。また、この問題をより簡単な例に分けて、問題をより詳細に特定してください。それはあなた自身の利益のためにあり、また質問を答えるかもしれません。 –