2016-05-15 1 views
0

私はGameMakerスタジオで作成されたマルチプレイヤーゲームに取り組んでいます。私はすでに完全にうまくいっているゲームメーカーにサーバーとクライアントを作成していますが、ゲームメーカーサーバーは直接的なxを使用する必要があるため、どの仮想マシンでも実行できません。だから、私は多くのためにそれらのオプションを展開するJavaでサーバーを書き直したいと思っています。私は多くのチュートリアルを見てきましたが、人々が "文字列"をメッセージとして送り、バイトで置き換えたいと思っていました。私がGameMakerで作成したサーバーでは、メッセージIDを使用して、各メッセージがどこに届くべきかを特定します。これらは、私はそれを読んでいる線です:メッセージのIDとしてJavaネットワーキングから特定のデータ型を取得する方法

buffer_seek(buffer, buffer_seek_start, 0); 
var mid = buffer_read(buffer, buffer_u8); 
switch(mid) { 

    case 0: 

が、Javaに限り、私が見てきたようにのみ入力ストリームがあります。どのように私はそれがダウンして怒鳴るのコードであるように、そのメッセージを分割することができるようになります。事前に

case network_type_data: 

var buffer = ds_map_find_value(async_load, "buffer"); 
var socket = ds_map_find_value(async_load, "id"); 

buffer_seek(buffer, buffer_seek_start, 0); 
var mid = buffer_read(buffer, buffer_u8); 
switch(mid) { 

    case 0: 
    //let's updated the first information we can get whether the user is registering or loging in 
    //Reads what username was assigned to player 
    var username = buffer_read(buffer, buffer_string); 
    //Updates information of players 
    UpdatePlayerInfo("name", username, socket); 
    SendRoomList(1, socket); 
    break; 

    case 1: //player wants to create a server 
    //find the name of the player 
     show_debug_message("a player created a room"); 
     if(Room_exists(socket) == false and PlayerInRoom(socket) == false) { 
     var Room = CreateRoom(socket, 2); 


     JoinRoom(socket, Room); 
     SendRoomList(1, socket); 
    } 
    break; 

    case 2: //player wants to join the server 

    var desired_room = buffer_read(buffer, buffer_u8); 
    if(PlayerInRoom(socket) == false) { 
    JoinRoom(socket, desired_room); 
    } 

    break; 



    } 
} 

おかげ (()サーバーのゲーム会社のネットワーク非同期イベント)!すべての答えは高く評価されています!

答えて

1

JavaのByteBufferは、単純なストリームからString以外の項目を取得するのに適しています。基本的には、TCP入力ストリームからByteBufferインスタンスへバイトのチャンクを取得し、getInt()、getDouble()などの同様のメソッドを呼び出して、プリミティブ型を取得できます。

ここでは、質問の中であなたのスクリプトと同様に配置されたいくつかの使い方があります。

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.nio.ByteBuffer; 
import java.nio.channels.SocketChannel; 
import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 


public class JavaIo { 

    // number of bytes in a user name 
    private static final int SIZE_OF_USER_NAME = 30; 
    // number of bytes in the internal buffer 
    private static final int BUFFER_SIZE = 1024; 

    public void workWithConnection() { 
     final int portNumber = 12345; // TODO: read this from config file or command line arguments instead 
     try (
       ServerSocket server = new ServerSocket(portNumber); 
       Socket connection = server.accept(); 
       SocketChannel channel = connection.getChannel(); 
     ) { 
      final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); 
      channel.read(buffer); // fill buffer from the input stream 
      // since your buffer in GameMaker is unsigned, let's prevent all that signed to unsigned nonsense by doing a 
      // bitmask 
      final int mid = buffer.get() & 0x000000FF; 
      switch(mid) { 
       case 0: 
        // grab some bytes from the buffer and change them into a String 
        final byte[] usernameBytes = new byte[SIZE_OF_USER_NAME]; 
        buffer.get(usernameBytes); 
        final String username = new String(usernameBytes, Charset.forName(StandardCharsets.UTF_8.name())); 
        // ... 
        break; 
       case 1: 
        // grab 4 bytes from the buffer and change it into an integer 
        final int roomId = buffer.getInt(); 
        // ... 
        break; 
       default: 
        // ... 
      } 
     } catch(IOException ioe) { 
      // TODO: handle exception 
     } 
    } 

} 

参考文献:

Convert a byte array to integer in java and vice versa

http://www.ibm.com/developerworks/java/tutorials/j-nio/j-nio.html

関連する問題