问题
如何修复程序以使套接字始终连接?另外,请测试您的代码。我已经看到很多关于此的答案,但没有一个有效。
非常感谢您的帮助。
背景
有一段时间,我参与了一个通过局域网发送消息的程序。我一直在努力在这个项目中集成我对GUI和套接字的知识。但是,无论我做什么,套接字都无法保持连接。
I have asked many questions about this,但无论我发现什么都没能找到正确的解决办法。我相信这是我的错 - 我是自学成才,也许没有问过正确的问题。这一次,我选择了一揽子声明;请原谅我缺乏技巧,但这似乎是目前最好的方式。 Here is a link to my code on paste bin.我在下面列出了最有可能存在问题的部分。
错误消息
('localhost', 1234)
Socket created
Socket bind complete
Socket now listening
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1410, in __call__
return self.func(*args)
File "/Volumes/XXMBABANEXX'S USB/Python Programs/Sockets/IM Project/Server/Functions/Simple Server.py", line 148, in <lambda>
command = lambda: send_msg(s,message))
File "/Volumes/XXMBABANEXX'S USB/Python Programs/Sockets/IM Project/Server/Functions/Simple Server.py", line 82, in send_msg
conn.sendall(my_message)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 57] Socket is not connected
相关代码
由于错误消息显示我的send_msg
功能存在问题,因此我决定将其包含在下方。
def send_msg(conn, message):
"""Send Messages"""
#Send some data to the remote server
my_message = message.get("0.0", END)
#set the whole string
conn.sendall(my_message)
非常感谢你的帮助。这个问题困扰了我几个月,我拒绝让它离开。
答案 0 :(得分:3)
在您知道如何抓取之前,您正试图运行。
扔掉Tk并穿线。查看SocketServer示例并运行它们。从中工作,以便您可以获得您似乎缺乏的基本套接字理解。
您知道,StackOverflow人员不太可能去查看您的pastebin代码。我确实看过它,这是多余和令人困惑的。
答案 1 :(得分:2)
我首先要为客户端和服务器创建单独的python文件。如果他们要共享共同的功能,那么只需编写一个common.py文件并将它们导入两者。
浏览你的粘贴代码后,我看到的最大错误就是你没有调用你的SERVER_LOOP函数。
第90行,添加 线程(target = SERVER_LOOP,args =(s,))。start()#Start服务器线程
其次,您在第91行创建的线程将在执行client.send()后立即退出。无论你如何创建它,Python垃圾收集都会拆掉套接字。在那里放一个time.sleep(5)并在一段时间内包装client.send(“sup”)1 == 1:循环
我强烈建议你在python中创建python TCP客户端和服务器时找到一些很好的示例代码。这是一个好的开始:http://wiki.python.org/moin/TcpCommunication
答案 2 :(得分:0)
您在错误的套接字上发送数据 - 您需要在客户端套接字上发送数据,而不是侦听套接字。服务器的一般模式如下所示:
# Set up the listening socket
listen_socket = socket.socket(...)
listen_socket.bind(...)
listen_socket.listen(...)
# Accept connections and process them
while should_continue_running:
client_socket, client_addr = listen_socket.accept()
# All communication with the new client should now happen on client_socket,
# NOT on listen_socket:
client_socket.recv(...)
client_socket.send(...)
...
client_socket.close()