![](/img/trans.png)
[英]How to detect when a client disconnects from a UDS (Unix Domain Socket)
[英]How to detect the server closing a unix domain socket?
我正在使用 python 扭曲庫,我似乎無法弄清楚如何讓我的客戶端檢測到服務器關閉其套接字。 我的客戶端繼續讓我將數據發送到不存在的服務器。 這是我的服務器:
from twisted.internet import protocol, reactor, endpoints, stdio
from twisted.protocols.basic import LineReceiver
class ConnectionProtocol(LineReceiver):
from os import linesep as delimiter
def lineReceived(self, line):
print 'got line: %s' % line
self.sendLine(line)
class ConnectionFactory(protocol.Factory):
def buildProtocol(self, addr):
return ConnectionProtocol()
def main():
endpoint = endpoints.UNIXServerEndpoint(reactor, './test.sock', 5, 0777, False)
endpoint.listen(ConnectionFactory())
print 'starting the reactor'
reactor.run()
main()
它所做的就是將它得到的每一行發送回連接的客戶端。 這是客戶端:
import os
from twisted.internet import protocol, reactor, endpoints, stdio
from twisted.protocols.basic import LineReceiver
class CommandProtocol(protocol.Protocol):
def dataReceived(self, data):
print data,
class StdinProtocol(LineReceiver):
from os import linesep as delimiter
def __init__(self, client):
self._client = client
def connectionMade(self):
self.transport.write('>>> ')
def lineReceived(self, line):
print 'writing line: %s' % line
self._client.transport.write(line + os.linesep)
def printError(failure):
print str(failure)
def main():
point = endpoints.UNIXClientEndpoint(reactor, './test.sock')
proto = CommandProtocol()
d = endpoints.connectProtocol(point, proto)
d.addErrback(printError)
stdio.StandardIO(StdinProtocol(proto))
reactor.run()
main()
如果我先運行服務器,然后運行客戶端,然后終止服務器,客戶端仍然像什么也沒發生一樣寫入CommandProtocol
的傳輸。 我認為errback
函數至少會報告一些東西。 在客戶端在服務器之前運行的情況下,使用 ConnectError 調用errback
函數,但我特別希望檢測客戶端已經連接到服務器並且服務器退出的情況。
如何檢測服務器已關閉?
如果在已斷開連接的傳輸上調用ITransport.write
是一個靜默的空操作。
如果您想了解連接丟失,請覆蓋connectionLost
方法。 一旦您知道連接已丟失,您就可以安排您的程序停止接受輸入或對它接收到的輸入執行其他操作。
我猜 os.stat 方法和 stat 模塊可以幫助你。 您可以將您的客戶代碼更改為如下所示:
import os
import stat
from twisted.internet import protocol, reactor, endpoints, stdio
from twisted.protocols.basic import LineReceiver
class CommandProtocol(protocol.Protocol):
def dataReceived(self, data):
print data,
class StdinProtocol(LineReceiver):
from os import linesep as delimiter
def __init__(self, client):
self._client = client
def connectionMade(self):
self.transport.write('>>> ')
def lineReceived(self, line):
print 'writing line: %s' % line
self._client.transport.write(line + os.linesep)
def printError(failure):
print str(failure)
def main():
if os.stat('./test.sock').st_mode & (stat.S_IRGRP | stat.S_IRUSR | stat.S_IROTH):
print "1"
print "using control socket"
point = endpoints.UNIXClientEndpoint(reactor, './test.sock')
proto = CommandProtocol()
d = endpoints.connectProtocol(point, proto)
d.addErrback(printError)
stdio.StandardIO(StdinProtocol(proto))
reactor.run()
else:
print "not ready"
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.