Java-Gaming.org    
Featured games (91)
games approved by the League of Dukes
Games in Showcase (576)
games submitted by our members
Games in WIP (497)
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 2224 times)
0 Members and 1 Guest are viewing this topic.
Offline Mike

JGO Wizard


Medals: 69
Projects: 2
Exp: 5 years


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

My current game, Minecraft meets Farmville and goes online Smiley
State of Fortune | Discussion thread @ JGO
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: 605
Projects: 4
Exp: 16 years


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
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Mike

JGO Wizard


Medals: 69
Projects: 2
Exp: 5 years


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

My current game, Minecraft meets Farmville and goes online Smiley
State of Fortune | Discussion thread @ JGO
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.

 

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

The first screenshot will be displayed as a thumbnail.

xsi3rr4x (12 views)
2014-04-15 18:08:23

BurntPizza (10 views)
2014-04-15 03:46:01

UprightPath (24 views)
2014-04-14 17:39:50

UprightPath (10 views)
2014-04-14 17:35:47

Porlus (27 views)
2014-04-14 15:48:38

tom_mai78101 (49 views)
2014-04-10 04:04:31

BurntPizza (107 views)
2014-04-08 23:06:04

tom_mai78101 (207 views)
2014-04-05 13:34:39

trollwarrior1 (176 views)
2014-04-04 12:06:45

CJLetsGame (182 views)
2014-04-01 02:16:10
List of Learning Resources
by Longarmx
2014-04-08 03:14:44

Good Examples
by matheus23
2014-04-05 13:51:37

Good Examples
by Grunnt
2014-04-03 15:48:46

Good Examples
by Grunnt
2014-04-03 15:48:37

Good Examples
by matheus23
2014-04-01 18:40:51

Good Examples
by matheus23
2014-04-01 18:40:34

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:22:30

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:05:20
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
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!