套接字无法连接

时间:2013-04-06 00:51:59

标签: python sockets python-2.7

问题

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

非常感谢您的帮助。

背景

有一段时间,我参与了一个通过局域网发送消息的程序。我一直在努力在这个项目中集成我对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)

非常感谢你的帮助。这个问题困扰了我几个月,我拒绝让它离开。

3 个答案:

答案 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()
相关问题