【问题标题】:Python chat client: the server receives commands along with previously sent messagesPython 聊天客户端:服务器接收命令以及先前发送的消息
【发布时间】:2016-01-04 20:40:29
【问题描述】:

我目前正在为一个班级做一个项目。它包含在代码中一个简单的聊天客户端(由老师提供的协议)来执行(起初)一些简单的任务。

我的问题是,在我在全球频道或其他不需要使用命令的频道上发送消息后,并尝试发送任何命令,服务器回复错误,说:“ 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) 在那里做什么?

希望你能帮帮我。

【问题讨论】:

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


    【解决方案1】:

    (另外,请注意我的字典没有打印正确的原因,我不知道为什么)

    字典不尊重顺序。

    我的问题是,在我在全球频道或其他不需要使用命令的频道上发送消息后,并尝试发送任何命令,服务器回复错误,说:“ msgbeforemsgbeforeCOMMAND”不是一个有效的命令。我就是想不通为什么会这样……

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 2016-07-23
      • 2021-12-29
      • 2014-09-15
      • 2015-06-27
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多