【发布时间】:2013-07-31 21:40:35
【问题描述】:
几个月来,我一直在尝试让一个基本的聊天应用程序在 python 2.7(使用 Geany IDE)中运行,最后得到了一个使用 UDP 运行的基本应用程序。我可以连接和广播通信,但是如果客户端连接然后稍后关闭,服务器会在下次尝试向所有客户端广播消息时崩溃。问题是它在没有返回错误消息或回溯的情况下崩溃,所以我无法确切地知道发生了什么。这是代码(由于客户端中的 getch() 代码,它只能在 Windows 上运行)。
服务器:
from socket import *
s = socket(AF_INET,SOCK_DGRAM)
s.bind(("25.150.175.48",65437))
maxsize = 4096
listeners = []
while True:
data, addr = s.recvfrom(maxsize)
if addr not in listeners:
listeners.append(addr)
#print addr[1]
print "new client added from %s on port %i" % (addr[0],addr[1])
for l in listeners:
try:
s.sendto(data,l)
except:
listeners.remove(l)
客户:
from socket import *
import select
import msvcrt
s = socket(AF_INET,SOCK_DGRAM)
s.bind(("25.150.175.48",65438))#change port to 65439 for the second client
maxsize = 4096
waitseconds = 0.001
server = ("25.150.175.48",65437)
s.sendto(raw_input(">"),server)
while True:
ready = select.select([s], [], [], waitseconds)
if ready[0]:
data = s.recv(maxsize)
print data
else:
if msvcrt.kbhit():
char = msvcrt.getch()
if char == "\r":
s.sendto(raw_input(">"),server)
我的理论是,如果我可以让服务器识别一个人何时关闭客户端,我可以从侦听器列表中删除客户端地址,它会正常工作。不幸的是,它工作不正常,我不知道如何让服务器发送某种测试数据包,我可以用它来验证连接。我在互联网上阅读的所有示例似乎都只是验证端口是否存在。 如果有人对如何处理此问题有任何想法,我将不胜感激。
编辑:
经过一番调试,我终于设法通过在 IDLE 中运行服务器程序来接收回溯。回溯如下:
Traceback (most recent call last):
File "G:\Python\Miscellaneous\Examples\UDP Chat Server & Client\UDP server.py", line 7, in <module>
data, addr = s.recvfrom(maxsize)
error: [Errno 10054] An existing connection was forcibly closed by the remote host
我需要一些帮助来处理这个问题,因为我的 try/except 语句在我运行它时似乎无法捕捉到它(我非常担心;python 错误?)。返回此回溯后,程序退出。有什么建议吗?
【问题讨论】:
-
回溯显示recvfrom()调用中的异常,而不是sendto()。也许在那里放一个 try 块并打印异常。然后您可以忽略/处理它。
-
它按预期打印出异常,但我现在不知道如何处理该问题。代码有什么方法可以返回哪个客户端被强行关闭?或者至少是一个 IP?
-
如果你在recvfrom()调用周围添加一个try块,你会在Exception对象中得到什么异常信息?
-
@pcm 如果我把它打印出来,我会得到这个:
error: [Errno 10054] An existing connection was forcibly closed by the remote host。我可以通过某种方式获取故障客户端的 IP 吗?
标签: python exception-handling udp chat sendto