该程序不断从发送方接收数据。当我检查它运行if
部分时,我有一个选中/未选中的按钮......这很好。现在我让它取消选中然后else
部分运行并打印Unchecked going to close socket
,但s.shutdown(10)
和s.close()
没有关闭套接字它显示错误s.shutdown(10)不是套接字对象OS [Errno 10022]提供了无效参数为什么它不关闭套接字或其他任何方式来关闭它。
附加要求
如果我的套接字再次关闭,我想检查(第二次)再次运行if
部分从发送方计算机接收数据是否可以再次启动套接字而无需关闭我的程序。
def show_markers(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname('192.168.225.12')
s.connect((host, port))
scale=0
while True:
if self.iconAction.isChecked():
print ('Checked')
m = QgsVertexMarker(self.iface.mapCanvas())
data = s.recv(SIZE)
data1 = s.recv(SIZE)
c = data.decode()
d = data1.decode()
x = float(c)
y = float(d)
print("printing X :", x)
print("printing Y :", y)
rect = QgsRectangle(float(x)-scale, float(y)-scale, float(x)+scale, float(y)+scale)
me = self.iface.mapCanvas()
me.setExtent(rect)
me.refresh()
m.setCenter(QgsPointXY(x, y))
m.setColor(QColor(255, 0, 0))
m.setIconSize(7)
m.setIconType(QgsVertexMarker.ICON_X) # or ICON_CROSS, ICON_X
m.setPenWidth(3)
else:
print('Unchecked going to close socket')
s.shutdown(10)
s.close()
我假设它应该像:
套接字关闭或关闭后,您无法复活它,但必须创建一个新套接字。
一般设计应该是:
def show_markers(self):
scale=0
active_socket = False
while True:
if self.iconAction.isChecked():
print ('Checked')
if not active_socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname('192.168.225.12')
s.connect((host, port))
active_socket = True
...
else:
if active_socket:
print('Unchecked going to close socket')
s.shutdown(10) # ??
s.close()
active_socket = False
我用一个审讯标记了shutdown
这条线,因为我无法理解你在这里要做什么。首先出于可移植性的原因,您不应该使用数值,而应该只使用socket
模块提供的常量。下一个shutdown
很少在graceful shutdown之外使用,这里没有完全实现。