Java-Gaming.org
Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
Featured games (78)
games approved by the League of Dukes
Games in Showcase (408)
games submitted by our members
Games in WIP (293)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Sockets to send/recieve bytes - best reader/writer?  (Read 1647 times)
0 Members and 1 Guest are viewing this topic.
Offline Mickelukas

JGO Ninja


Medals: 39
Projects: 2


Java guru wanabee


« Posted 2010-10-06 14:29:35 »

Hi guys,

I was looking for the best solution to send/recieve bytes and never found a great solution. The best one I found (and which works unless the socket calls come in a different order than sent) is the following:

Send:
1  
2  
3  
4  
5  
6  
7  
DataOutputStream socketWriter;
try {
    socketWriter.writeInt(message.length);
    socketWriter.write(message);
} catch (IOException e) {
    e.printStackTrace();
}


Receive:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
DataInputStream socketReader;
byte[] b=null;
String message=null;
int size;
try {
    size=socketReader.readInt();
    b=new byte[size];
    socketReader.readFully(b);
} catch (IOException e) {
    e.printStackTrace();
}


The problem is that readFully needs to know how many bytes it should read. One way to solve this is to always let the server wait for a confirmation that the client got the whole message (both the int and the bytearray) before sending the next message but there should be a better way to do this, or?

Thanks,
Mike

Offline dbotha

Senior Newbie





« Reply #1 - Posted 2010-10-06 14:48:32 »

I don't quite understand the problem, why would the server need to wait for confirmation that the client has received the whole message? If this is being sent reliably (TCP) you can send the client all the bytes you please and as long as the connection remains established you are garanteed they will receive them in the order they were sent. I don't really see any need for the client to ACK the message as being received. On the client you just parse off each message as it comes. In your case read the message length and then read the message of that length. If you are using non blocking operations you may need to buffer data until the whole message is available to you.
Offline Riven
« League of Dukes »

JGO Overlord


Medals: 439
Projects: 4


Hand over your head.


« Reply #2 - Posted 2010-10-06 14:51:41 »

Indeed, what you are doing is correct.

But please add some sanity-check on the value of readInt(), as it's now way too easy to hijack all RAM in the server.

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social rankings
Projects: Revenge of the Titans, Titan Attacks, Droid Assault, and Ultratron
Games published by our own members! Check 'em out!
Try the Free Demo of Titan Attacks
Offline Mickelukas

JGO Ninja


Medals: 39
Projects: 2


Java guru wanabee


« Reply #3 - Posted 2010-10-06 16:17:15 »

I don't quite understand the problem, why would the server need to wait for confirmation that the client has received the whole message? If this is being sent reliably (TCP) you can send the client all the bytes you please and as long as the connection remains established you are garanteed they will receive them in the order they were sent. I don't really see any need for the client to ACK the message as being received. On the client you just parse off each message as it comes. In your case read the message length and then read the message of that length. If you are using non blocking operations you may need to buffer data until the whole message is available to you.

So if I send different messages really quick I'm always sure that each message will arrive in the same order? That solved my potential problem, thanks Smiley

Riven, that makes perfect sense and I'm adding it right away, thanks! :-)

I love this forum. The most helpful and friendly people ever! :-D

Offline dbotha

Senior Newbie





« Reply #4 - Posted 2010-10-06 16:21:03 »

Yes provided that you are using a reliable transport such as TCP this is guaranteed!
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
 
Get high quality music tracks for your game!

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

The invasion has landed! On Mars! And you're there to beat 'em!
cubemaster21 (118 views)
2013-05-17 21:29:12

alaslipknot (125 views)
2013-05-16 21:24:48

gouessej (154 views)
2013-05-16 00:53:38

gouessej (147 views)
2013-05-16 00:17:58

theagentd (161 views)
2013-05-15 15:01:13

theagentd (146 views)
2013-05-15 15:00:54

StreetDoggy (190 views)
2013-05-14 15:56:26

kutucuk (214 views)
2013-05-12 17:10:36

kutucuk (213 views)
2013-05-12 15:36:09

UnluckyDevil (217 views)
2013-05-12 05:09:57
Complex number cookbook
by Roquen
2013-04-24 12:47:31

2D Dynamic Lighting
by Oskuro
2013-04-17 16:46:12

2D Dynamic Lighting
by Oskuro
2013-04-17 16:45:57

2D Dynamic Lighting
by Oskuro
2013-04-17 16:23:20

Noise (bandpassed white)
by Roquen
2013-04-05 17:36:01

Noise (bandpassed white)
by Roquen
2013-04-03 16:17:38

Java Data structures
by Roquen
2013-03-29 13:21:12

Topic Request
by kutucuk
2013-03-22 21:42:01
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!
Page created in 0.116 seconds with 21 queries.