我試圖在qgis插件中設置一個簡單的套接字服務器。最終目標是在qgis和matlab之間進行溝通。套接字服務器在線程中沒有響應
我發現了一個明顯的例子的東西可比從這裏: http://www.blog.pythonlibrary.org/2013/06/27/wxpython-how-to-communicate-with-your-gui-via-sockets/
實現時,似乎在self.socket.accept掛()即使在客戶端與它連接。連接建立(嘗試與matlab和python),但我沒有收到任何東西。Netstat顯示有一臺服務器正在偵聽正確的端口。
下面是相關代碼:
class SocketServerListen(threading.Thread):
def __init__(self):
host = "127.0.0.1"
port = 22001
QgsMessageLog.logMessage("Initializing server")
threading.Thread.__init__(self)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((host, port))
self.socket.listen(5)
self.setDaemon(True)
self.start()
def run(self):
while True:
try:
QgsMessageLog.logMessage("Waiting for connection")
conn, address = self.socket.accept()
ready = select.select([conn,],[], [],2)
if ready[0]:
conn.sendall("hello")
QgsMessageLog.logMessage("Connected to client")
time.sleep(0.5)
#receive header and message
message = conn.recv(512)
#disconnect connection
QgsMessageLog.logMessage("Message:" + message)
self.socket.shutdown(socket.SHUT_RDWR)
conn.close()
self.socket.close()
break
except socket.error, msg:
print "Socket error! %s" % msg
break
在日誌中我可以看到「等待連接」的消息,但它從來沒有通過「連接到客戶端」。 我試着在沒有線程的情況下實現它(刪除線程,setDaemon和start() - > run()),然後它確實工作。然而gui顯然凍結了,所以這不是一個選項。
編輯:
我刪除了選擇,這的確是拖延的過程,只有關閉客戶端套接字。 這裏是服務器的獨立代碼:
import threading
import socket
import time
import select
class SocketServerListen(threading.Thread):#threading.Thread
def __init__(self):
host = "127.0.0.1"
port = 22001
print("Initializing server")
threading.Thread.__init__(self)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((host, port))
self.socket.listen(5)
self.setDaemon(True)
self.start()
def run(self):
while True:
try:
print("Waiting for connection")
conn, address = self.socket.accept()
conn.sendall("hello")
print("Connected to client")
time.sleep(0.5)
#receive message
message = conn.recv(512)
print(message)
#disconnect connection
conn.close()
#self.socket.close()
#break
except socket.error, msg:
print("Socket error! %s"),msg
break
listenIncoming = SocketServerListen()
for i in range(0,10):
time.sleep(5)
print("doing other stuff")
print("end")
和客戶端:
import socket
host = "127.0.0.1"
port = 22001
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host,port))
message = client.recv(512)
print("Message:" + message)
client.sendall("hiya")
client.shutdown(socket.SHUT_RDWR)
client.close()
獨立這個現在做什麼,我想它做的事:)。不幸的是,在qgis插件中實施更改後仍然出現同樣的問題。我想問題在於qgis,以及它如何處理單獨的線程。
試着做一個示例程序,在隔離工作,我們可以獨立運作。 – 2014-09-30 08:05:42