title: Java multiplayer game - networking concepts
body: <p>For a school project, we're supposed to create a multiplayer game in Java (it should be client/server) which can be played over the internet (we're programming this at school, so it's not homework). The game is turn-based, but there should be a chat, which ofcourse is real-time. However, none of us has experience with network programming and the more I read about it, the more questions I seem to have.</p>
  
  <p>My first thought was to use the socket API to implement the multiplayer part. The server waits for new data from the clients. However, there are multiple kinds of data to receive, like chat messages, movement, etc. Also, once the connection to the server is made, some initial data (like the Player's name) should be sent. The server should be able to see what kind of message it received, but how? I was thinking of creating a class <code>Message</code> with a string field <code>type</code>. But in my server code, I will get code like this:</p>
  
  <pre><code>if (message.type.equals("message")) {
    // code to execute for chat messages
  } else if (message.type.equals("movement")) {
    // code to execute for movement
  } else if () {
    // ...
  } else {
    // ...
  } // Please ignore syntax errors :P
  </code></pre>
  
  <p>When there are a lot of different kinds of data to send (and there WILL be), this doesn't look like the most efficient way. Also, this would mean both the server and client should have this Message-class/interface (duplicate code).</p>
  
  <p>What about other game stuff? For example, player 1 moves his character to a position which defeats another character. The client of player 1 calculates this defeatment and applies the correct actions. But what should be send to the server? Just the new player position or also the defeatment? With the first option, it means all other clients should do the calculations. Couldn't this cause any trouble? As I have no prior network programming experience, I'm a bit confused on how to do all these things.</p>
  
  <p>I've also read in another thread here on Stackoverflow that RMI might be a better option. Having read some information about this, I understand what RMI is, but I'm still not able to see whether it is a good option for this project or not.  Any tips for this?</p>
  
  <p>As you see, I'm a bit confused on how to start with the networking part of this project. I've searched for some game programming books (for Java ofcourse), but none of them are focussed on the networking part. I've also searched for Java networking books, but these seem to be focussed on the technology, not on good code practices. </p>
  
  <p>If anyone knows a good book or has some advice in the right diection, it would be greatly appreciated.</p>
  
  <p>Thanks</p>