Python聊天客户端服务器修改出了可怕的错误

Python聊天客户端服务器修改出了可怕的错误,python,client,chat,Python,Client,Chat,作为练习,我寻找了一个简单的Python聊天客户端-服务器系统来进行修改和玩弄。我在系统中发现的第一个主要故障是,服务器和客户端使用单一tcp连接进行通信。第二个问题是,您只能让两个人—一个使用客户端,另一个使用服务器—进行通信。第三,连续的职位是不可能的。一个人发送了一条消息,然后必须等待另一个人发送一条消息,然后才能再次交谈。非常非常有限 所以我开始给它穿线,并用插座做实验。客户端连接到服务器一次,提供其IP地址,创建侦听线程,然后重新连接到服务器的消息接收器。 所有帖子都被发送到该接收者,

作为练习,我寻找了一个简单的Python聊天客户端-服务器系统来进行修改和玩弄。我在系统中发现的第一个主要故障是,服务器和客户端使用单一tcp连接进行通信。第二个问题是,您只能让两个人—一个使用客户端,另一个使用服务器—进行通信。第三,连续的职位是不可能的。一个人发送了一条消息,然后必须等待另一个人发送一条消息,然后才能再次交谈。非常非常有限

所以我开始给它穿线,并用插座做实验。客户端连接到服务器一次,提供其IP地址,创建侦听线程,然后重新连接到服务器的消息接收器。 所有帖子都被发送到该接收者,该接收者遍历已连接客户端的列表,并连接到每个客户端,并发送开头带有发送者姓名的消息;杂项特征。 我知道经常这样打开一个新的连接效率很低,但我想保持tcp连接,直到它正常工作,然后转到UDP

然而,奇怪的事情开始发生了。只要说我做过错误的噩梦就够了

有人能确定如何在这个结构和特性集中使代码可操作吗? 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()  

我正在做很多类似的事情,但我将实现文本加密。我看到你在起诉客户名单的名单。。。但我想说有更好的方法。我在用字典

如果你熟悉字典,跳过下一段

字典可以处理2个基本变量,并且使用{}定义

>>> stuff = {'a':'hello','b':'world'}
>>> print stuff['a']
hello
>>> print stuff['a'],stuff['b']
hello world
使用这个,你可以创建一个像{'username':'ipaddr'}这样的字典,这样你可以使用户名和IP都在一个变量中。如果你想要像我一样的最终产品,那么服务器所做的就是重复消息,并将其发送给所有连接的人。然后服务器就可以循环使用用户名了

另外,我认为tcpsoc.listen5是指一次可以连接多少人。。。我想这就是我在某处读到的

我不知道你为什么会犯这样的错误,但如果你想看看我的半结构化代码,你也非常欢迎。忽略导入随机,这尚未使用,但将成为加密系统的一部分


你可能会很幸运,有人在这里为你编写代码,但我对此表示怀疑,帕特纳。StackOverflow问题需要更加集中,看起来不像家庭作业练习。UDP用于聊天?哈哈,好的!PS:修正了缩进…不要说奇怪的废话开始发生,你可以详细解释你看到的错误。另外,尝试将其分解为一个更简单的示例,以便更容易地隔离问题。这将是为了你自己的利益,也可能使问题的答案…你可能还想点击1010101按钮,并重新格式化你的代码,使它看起来像代码。