def publishTopic(self, topic): "establish connection with exactly one subscriber" print "PUBLISH", topic, (self.callerId, topic, lookupTopicType(topic)[0], self.callerApi) code, statusMessage, subscribers = self.master.registerPublisher( self.callerId, topic, lookupTopicType(topic)[0], self.callerApi ) print subscribers serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serverSocket.bind((NODE_HOST, PUBLISH_PORT)) print "Waiting ..." serverSocket.listen(1) soc, addr = serverSocket.accept() print "Connected by", addr data = soc.recv(1024) # TODO properly load and parse/check print data print "LEN", len(data) header = prefix4BytesLen( prefix4BytesLen("callerid=" + self.callerId) + prefix4BytesLen("topic=" + topic) + prefix4BytesLen("type=" + lookupTopicType(topic)[0]) + prefix4BytesLen("md5sum=" + lookupTopicType(topic)[1]) + "" ) soc.send(header) return soc
def publishTopic(self, topic): "establish connection with exactly one subscriber" print "PUBLISH", topic, (self.callerId, topic, lookupTopicType(topic)[0], self.callerApi) code, statusMessage, subscribers = self.master.registerPublisher( self.callerId, topic, lookupTopicType(topic)[0], self.callerApi) print subscribers serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serverSocket.bind((NODE_HOST, PUBLISH_PORT)) print "Waiting ..." serverSocket.listen(1) soc, addr = serverSocket.accept() print 'Connected by', addr data = soc.recv(1024) # TODO properly load and parse/check print data print "LEN", len(data) header = prefix4BytesLen( prefix4BytesLen("callerid=" + self.callerId) + prefix4BytesLen("topic=" + topic) + prefix4BytesLen("type=" + lookupTopicType(topic)[0]) + prefix4BytesLen("md5sum=" + lookupTopicType(topic)[1]) + "") soc.send(header) return soc
def requestTopic(self, topic): code, statusMessage, publishers = self.master.registerSubscriber( self.callerId, topic, lookupTopicType(topic)[0], self.callerApi ) assert code == 1, (code, statusMessage) assert len(publishers) == 1, (topic, publishers) # i.e. fails if publisher is not ready now print publishers publisher = ServerProxy(publishers[0]) code, statusMessage, protocolParams = publisher.requestTopic(self.callerId, topic, [["TCPROS"]]) assert code == 1, (code, statusMessage) assert len(protocolParams) == 3, protocolParams print code, statusMessage, protocolParams hostPortPair = (protocolParams[1], protocolParams[2]) soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP soc.connect(hostPortPair) soc.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) soc.setblocking(0) soc.settimeout(SOCKET_TIMEOUT) header = prefix4BytesLen( prefix4BytesLen("callerid=" + self.callerId) + prefix4BytesLen("topic=" + topic) + prefix4BytesLen("type=" + lookupTopicType(topic)[0]) + prefix4BytesLen("md5sum=" + lookupTopicType(topic)[1]) + "" ) soc.send(header) return soc
def requestTopic(self, topic): code, statusMessage, publishers = self.master.registerSubscriber( self.callerId, topic, lookupTopicType(topic)[0], self.callerApi) assert code == 1, (code, statusMessage) assert len(publishers) == 1, ( topic, publishers) # i.e. fails if publisher is not ready now print publishers publisher = ServerProxy(publishers[0]) code, statusMessage, protocolParams = publisher.requestTopic( self.callerId, topic, [["TCPROS"]]) assert code == 1, (code, statusMessage) assert len(protocolParams) == 3, protocolParams print code, statusMessage, protocolParams hostPortPair = (protocolParams[1], protocolParams[2]) soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP soc.connect(hostPortPair) soc.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) soc.setblocking(0) soc.settimeout(SOCKET_TIMEOUT) header = prefix4BytesLen( prefix4BytesLen("callerid=" + self.callerId) + prefix4BytesLen("topic=" + topic) + prefix4BytesLen("type=" + lookupTopicType(topic)[0]) + prefix4BytesLen("md5sum=" + lookupTopicType(topic)[1]) + "") soc.send(header) return soc