Python聊天客户端:服务器接收命令以及先前发送的消息

时间:2016-01-04 20:40:29

标签: python python-2.7 python-3.x client-server chat

我目前正在为一个班级的项目工作。它包含一个简单的聊天客户端(由教师提供的协议)代码(最初)做一些简单的任务。

我的问题是,在全球通道或其他不需要使用命令的通道上发送一个分段后,尝试发送任何命令,服务器回复错误,说: msgbeforemsgbeforeCOMMAND“不是有效的命令。我只是无法弄清楚为什么会发生这种情况......

另一件事,请注意我的字典不是正确的打印原因,我不知道为什么

例如: chat running

import socket, select, string, sys
import threading
import time

def prompt():
    sys.stdout.write('<You>: ')
    sys.stdout.flush()

tLock = threading.Lock()
shutdown = False

def receber(sock):
    while not shutdown:
        try:
            tLock.acquire()
            while True:
                data = sock.recv(1024)
                if not data:
                    print ('Disconnected from server\n')
                    sys.exit()
                else:
                    print ('<server>: %s' % (data.decode()))
                    sys.stdout.write(data)
        except:
            pass
        finally:
            tLock.release()


#Main Function
if __name__ == "__main__":

    host = 'mini.alunos.di.uevora.pt'
    port = 143

    #IP do servidor
    try:
        busca_ip = socket.gethostbyname( host )
        print ('Chat server IP: %s Port: %d \nNow connecting...\n' %(busca_ip, port))

    except socket.gaierror:
        #Não conseguiu o IP do servidor
        print ('Hostname could not be resolved. Exiting.')
        sys.exit()

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(3)

    # connectar ao host
    try :
        s.connect((busca_ip, port))
        s.setblocking(0)
    except :
        print ('Unable to connect to the server.')
        sys.exit()

    print ('Connected to chat server. You may start chatting\n')

    COM_ARG = {'_Comando_': '_Argumentos_',
               'NICK': '<nickname> [\<password>]',
               'MSG': '<recipient> \<message>',
               'ENTER': '<room>',
               'LEAVE': '<room> [\<message>]',
               'RLIST':'',
               'ULIST':''}

    for chave, valor, in COM_ARG.items():
        print (("%s %s") % (chave,valor))

    print ('\n')

    comandos = COM_ARG.keys()


    #criar thread para o socket
    t = threading.Thread(target = receber, args=(s,))
    t.start()

    while True:

        msg = input('<You>: ')
        msg = msg.strip()
        msg12 = msg.upper()
        msg12 = msg12.split()
        try:
            if msg12[0] in comandos:
                msg = msg + '\n'
        except:
            pass
        s.send(msg.encode())
        time.sleep(0.25)

顺便说一下,sys.stdout.write(data)正在那里做点什么?

希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

  

(另一件事,请注意我的字典不是正确的打印原因,我不知道为什么)

字典不尊重订单。

  

我的问题是,在全球通道或其他不需要使用命令的通道上发送一个分段后,尝试发送任何命令,服务器回复错误,说: msgbeforemsgbeforeCOMMAND“不是有效的命令。我只是无法弄清楚为什么会发生这种情况......

这不仅仅是代码的问题,服务器还会重新发送消息,并保留它们直到出现'\ n',然后解释命令。这是协议的“问题”,但必须更改代码。

  

btw,sys.stdout.write(data)正在做什么?

据说与print (data.decode())做同样的事情,但在我的情况下不起作用。我不确定。