我目前正在为一个班级的项目工作。它包含一个简单的聊天客户端(由教师提供的协议)代码(最初)做一些简单的任务。
我的问题是,在全球通道或其他不需要使用命令的通道上发送一个分段后,尝试发送任何命令,服务器回复错误,说: 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)
正在那里做点什么?
希望你能帮助我。
答案 0 :(得分:0)
(另一件事,请注意我的字典不是正确的打印原因,我不知道为什么)
字典不尊重订单。
我的问题是,在全球通道或其他不需要使用命令的通道上发送一个分段后,尝试发送任何命令,服务器回复错误,说: msgbeforemsgbeforeCOMMAND“不是有效的命令。我只是无法弄清楚为什么会发生这种情况......
这不仅仅是代码的问题,服务器还会重新发送消息,并保留它们直到出现'\ n',然后解释命令。这是协议的“问题”,但必须更改代码。
btw,sys.stdout.write(data)正在做什么?
据说与print (data.decode())
做同样的事情,但在我的情况下不起作用。我不确定。