10 from threading
import Thread, Event
14 super(SocketTransport, self).
__init__()
31 super(SocketTransport, self).
start()
32 rospy.loginfo(
"[%s] Started" %
type(self).__name__)
35 if self.
alive is not None:
40 super(SocketTransport, self).
join()
41 rospy.loginfo(
"[%s] Stopped" %
type(self).__name__)
45 while not self.alive.wait(self.
poll_rate):
47 self.socket.settimeout(1)
49 if sys.version_info.major >= 3
and type(buf) == bytes:
52 except socket.error
as e:
53 if sys.version_info.major >= 3
and type(e) == socket.timeout:
55 if sys.version_info.major < 3
and e.message ==
"timed out":
59 parsed_data, parsed_length = self.
parse(recvbuf)
60 for data
in parsed_data:
63 if len(recvbuf) > parsed_length:
64 recvbuf = recvbuf[parsed_length:]
69 except RuntimeError
as e:
70 rospy.logerr(
"Failed to parse data: %s" % str(e))
76 self.socket.getpeername()
78 except socket.error
as e:
92 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
94 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
95 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
97 rospy.loginfo(
"[%s] Connected to server %s",
type(self).__name__, info)
100 except socket.error
as e:
106 raise IOError(
"[%s] Failed to connect to %s after %d retries: %s" % (
type(self).__name__, info, retry, str(err)))
111 rospy.loginfo(
"[%s] Disconnected",
type(self).__name__)
119 if sys.version_info.major >= 3
and type(data) == str:
122 self.socket.sendall(data)
125 except AttributeError:
129 self.callbacks.append(cb)
132 raise NotImplementedError()
135 if __name__ ==
'__main__':
def __init__(self, host, port, max_retry)
def on_received_data(self, cb)