我正在为我的聊天程序创建一个额外的功能,允许您注册(它将您希望的姓名与您的同名保存)。这个想法是当有人发送消息时,主机(脚本)首先检查你是否发送了注册命令(-set --name)。如果您要求您提供所需的用户名并将其保存在带有您的对等名称的.txt(names.txt)文件中(例如57883:jack),然后向其他客户发送一条消息,表明57883已将其姓名更改为jack
如果你还没有发送命令,主机(脚本)会通过在names.txt文件中查找你的peername来检查你是否注册了,当它找到它时,它会得到' :'并将其与消息一起发送给其他客户(如下:你好小伙子们,你们怎么做?)
else:
try:
data = sock.recv(RECV_BUFFER)
if data:
for o,a in data:
if o in ("-set", "--name"):
name = raw_input('name: ')
peer2 = sock.getpeername()
with open('names.txt', 'a') as f:
f.write(name + ':' + peer2)
f.write('\n')
f.close()
broadcast_data(sock,'set name to: ' + name)
else:
peer = sock.getpeername()
with open('names.txt', 'r') as d:
lines = d.readlines()
for i, peer in enumerate(f):
numb, name = peer.rstrip(":")
print i, numb, name
broadcast_data(sock,'<' + name + '> ' + data)
except:
broadcast_data(sock, "Client (%s, %s) is offline" % addr)
print "Client (%s, %s) is offline" % addr
sock.close()
CONNECTION_LIST.remove(sock)
continue
这是我到目前为止,但它不起作用..客户端与主机精确连接,但当客户端发送消息时,他断开连接。为什么他没有尝试?
else:
try:
data = sock.recv(RECV_BUFFER)
if data:
broadcast_data(sock,'<' + str(sock.getpeername()) + '> ' + data)
except:
broadcast_data(sock, "Client (%s, %s) is offline" % addr)
print "Client (%s, %s) is offline" % addr
sock.close()
CONNECTION_LIST.remove(sock)
continue
这是我尝试添加额外功能之前的代码。干杯!
答案 0 :(得分:0)
我可能错了,但不行:
name = raw_input('name: ')
在主机上工作,打印“name:”并期望用户在控制台上输入一行输入?当用户键入并按下回车键时,不会发生任何其他事情。
另外,该行:
for i, peer in enumerate(f):
这里的范围是?看来你期望它返回一个整数和一个套接字。 f的唯一其他可见用途是在文件打开/关闭-set和--name。你的意思是枚举(行)?