Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字客户端无法重新连接_Python_Sockets - Fatal编程技术网

Python套接字客户端无法重新连接

Python套接字客户端无法重新连接,python,sockets,Python,Sockets,我有两个按钮。连接和断开。第一次按下connect时,客户端成功连接到服务器(localhost:4106),按下disconnect时,客户端断开连接。 我的问题是,当我再次按下“连接”时,客户端将不会重新连接到服务器,我会收到一条错误消息: 我认为这是因为套接字连接不能重复使用?有解决办法吗?谢谢 #!/usr/bin/python import socket import Tkinter import tkMessageBox top

我有两个按钮。连接和断开。第一次按下connect时,客户端成功连接到服务器(localhost:4106),按下disconnect时,客户端断开连接。 我的问题是,当我再次按下“连接”时,客户端将不会重新连接到服务器,我会收到一条错误消息:

我认为这是因为套接字连接不能重复使用?有解决办法吗?谢谢

#!/usr/bin/python          

import socket               
import Tkinter
import tkMessageBox

top = Tkinter.Tk()

s = socket.socket()       
host = '127.0.0.1' 
port = 4106              

def connect():
    s.connect((host, port))

def disconnect():
    s.close()

ConnectBtn = Tkinter.Button(top, text ="Connect", command = connect)

DisconnectBtn = Tkinter.Button(top, text ="Disconnect", command = disconnect)

ConnectBtn.pack()
DisconnectBtn.pack()

top.mainloop()

我不知道如何用python重写这段代码tcl/tk,但这可能是解决方案的良好开端。此代码显示了如果连接丢失,客户端将如何自动重新连接到服务器

我使用with success自动重新连接到服务器此代码:

def open_connection():
    data0=''

    try:
        # Create a TCP/IP socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        # Connect the socket to the port where the server is listening
        server_address = ('192.168.0.100', 8000)
        sock.settimeout(10)     # TimeOut 5 secunde

        while True:

            try:
                sock.connect(server_address)
                message = 'new connection'
                sock.sendall(message)

                # Look for the response
                amount_received = 0
                data0=sock.recv(1024)
                amount_received = len(data0)
                return

            finally:
                wNET = 0
                pass

    except:
        sock.close()
        time.sleep(60)
        del data0

在connect中再次调用socket.socket(),并将s分配给新套接字。在disconnect()中进行检查,确保它是一个有效的打开的套接字,然后再关闭它;在
connect()
函数中使用
s=socket.socket()
,并将代码顶部的
s
声明替换为
s=0
。您还可以使用
disconnect()
函数来关闭套接字(仅当它是有效套接字时),方法是检查其值是否为
0
,并使函数在成功断开连接后将其值设置为
0
。我认为这是有道理的。