@@ -709,7 +709,7 @@ public async void ServiceResponse<T>(T response_message, string service, bool re
709709
710710
711711 /// <summary>
712- ///
712+ /// Call ROS service.
713713 /// </summary>
714714 /// <param name="calling_message">The calling message</param>
715715 /// <param name="service">Service name</param>
@@ -752,20 +752,33 @@ public async void CallService<T, R>(T calling_message, string service, string id
752752
753753 private async Task ClientReadAsync ( ) {
754754 Debug . Log ( "INFO: ZOROSBridgeConnection::ClientReadAsync Start" ) ;
755- byte [ ] buffer = new byte [ 1024 * 100 ] ; // BUGBUG: hardwired buffer. TODO: handle when we get messages larger then the buffer!
755+ const int bufferSize = 1024 ;
756+ byte [ ] buffer = new byte [ bufferSize ] ;
757+
756758
757759 while ( _isConnected ) {
758760 int bytesRead = - 1 ;
761+ int totalBytes = 0 ;
759762 try {
760763
761- bytesRead = await _tcpClient . GetStream ( ) . ReadAsync ( buffer , 0 , buffer . Length ) ;
762- // Debug.Log("INFO: ReadAsync read byte count" + bytesRead.ToString());
763- if ( bytesRead > 0 ) {
764+ MemoryStream memoryStream = new MemoryStream ( ) ;
765+
766+ do {
767+ bytesRead = await _tcpClient . GetStream ( ) . ReadAsync ( buffer , 0 , buffer . Length ) ;
768+ memoryStream . Write ( buffer , 0 , bytesRead ) ;
769+ totalBytes += bytesRead ;
770+ // Debug.Log($"INFO: bytesRead: {bytesRead} totalBytes: {totalBytes}");
771+ } while ( _tcpClient . GetStream ( ) . DataAvailable ) ;
772+
773+ if ( totalBytes > 0 ) {
774+
775+ byte [ ] finalBuffer = memoryStream . ToArray ( ) ;
764776
765777 if ( Serialization == SerializationType . JSON ) {
778+
766779 // check if we have valid JSON by checking if we have the '{' & '}'
767- if ( buffer [ 0 ] == '{' && buffer [ bytesRead - 1 ] == '}' ) {
768- string msg = System . Text . Encoding . UTF8 . GetString ( buffer , 0 , bytesRead ) ;
780+ if ( finalBuffer [ 0 ] == '{' && buffer [ totalBytes - 1 ] == '}' ) {
781+ string msg = System . Text . Encoding . UTF8 . GetString ( finalBuffer , 0 , totalBytes ) ;
769782 JObject msgJSON = JObject . Parse ( msg ) ;
770783 string topic = msgJSON [ "topic" ] . Value < string > ( ) ;
771784 foreach ( var subscriber in _subscribers [ topic ] ) {
@@ -782,9 +795,8 @@ private async Task ClientReadAsync() {
782795
783796 // TODO: we have to deserialize to JSON because we do not know the type of the object
784797 // coming in. Would be faster to be able to "peek" into the BSON and then deserialize...
785- MemoryStream memStream = new MemoryStream ( buffer ) ;
786- JObject msgJSON ;
787- using ( BsonDataReader reader = new BsonDataReader ( memStream ) ) {
798+ JObject msgJSON = null ;
799+ using ( BsonDataReader reader = new BsonDataReader ( new MemoryStream ( finalBuffer ) ) ) {
788800 msgJSON = ( JObject ) JToken . ReadFrom ( reader ) ;
789801 }
790802
@@ -827,12 +839,12 @@ private async Task ClientReadAsync() {
827839 await SendJSONStringAsync ( JsonConvert . SerializeObject ( nextServiceCall ) ) ;
828840 } else if ( Serialization == SerializationType . BSON ) {
829841
830- MemoryStream memoryStream = new MemoryStream ( ) ;
831- BsonDataWriter writer = new BsonDataWriter ( memoryStream ) ;
842+ MemoryStream bsonMemoryStream = new MemoryStream ( ) ;
843+ BsonDataWriter writer = new BsonDataWriter ( bsonMemoryStream ) ;
832844 JsonSerializer serializer = new JsonSerializer ( ) ;
833845 serializer . Serialize ( writer , nextServiceCall ) ;
834846
835- await SendBSONAsync ( memoryStream ) ;
847+ await SendBSONAsync ( bsonMemoryStream ) ;
836848 }
837849 }
838850
0 commit comments