0

问题

如何修复我的程序以使其始终连接套接字?另外,请测试您的代码。我已经看到了很多关于这个的答案,但没有一个有效。

非常感谢你的帮助。

背景

有一段时间,我一直在开发一个通过 LAN 发送消息的程序。我一直在努力将我对 GUI 和套接字的知识整合到这个项目中。但是,无论我做什么,套接字都无法保持连接。

我已经问了很多关于这个的问题,但无论如何我都无法找到正确的解决方法。我相信这是我的错——我是自学成才的,也许没有问过正确的问题。这一次,我选择了笼统的陈述;请原谅我缺乏技巧,但这似乎是目前最好的方法。这是我在粘贴箱上的代码的链接。我在下面列出了最有可能出现问题的部分。

错误信息

('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)

非常感谢您的所有帮助。这个问题困扰了我好几个月,我拒绝放手。

4

3 回答 3

3

在您知道如何爬行之前,您正在尝试运行。

扔掉 Tk 和穿线。查看SocketServer示例并运行它们。从那开始工作,这样您就可以获得您似乎缺乏的基本套接字理解。

如您所知,StackOverflow 的人不太可能去查看您的 pastebin 代码。我确实看过它,它是多余的和令人困惑的。

于 2013-04-06T01:02:31.927 回答
2

我将从为客户端和服务器创建单独的 python 文件开始。如果他们要共享通用功能以及不共享什么,只需编写一个 common.py 文件并将它们导入两者。

浏览您的粘贴箱代码后,我看到的最大错误是您没有调用 SERVER_LOOP 函数。

在第90行,添加Thread(target = SERVER_LOOP, args = (s,)).start() #启动服务器线程

其次,您在第 91 行创建的线程将在执行 client.send() 后立即退出。无论您如何创建它,Python 垃圾收集都会拆除套接字。在其中放一个 time.sleep(5) 并将 client.send("sup") 包装在 while 1==1: 循环中

我强烈建议您找到一些关于在 python 中创建 python TCP 客户端和服务器的好示例代码。这是一个好的开始:http ://wiki.python.org/moin/TcpCommunication

于 2013-04-06T02:37:10.500 回答
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()
于 2013-04-06T01:03:36.687 回答