Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinSock][java.io][java.net]Problem z standardami java'y i c++

Ostatnio zmodyfikowano 2012-05-06 00:08
Autor Wiadomość
Chlorek
Temat założony przez niniejszego użytkownika
[WinSock][java.io][java.net]Problem z standardami java'y i c++
» 2012-05-06 00:08:49
Tak więc wracam do tutaj do zagadnienia, które się już kiedyś tu pojawiło na forum, jednak nie znalazłem odpowiedzi na temat bardzo mnie wciągający i w pewien sposób denerwujący (jest chyba pierwsza rzecz w c++, której nie mogę podołać). Opiszę więc swój problem, jest pewna aplikacja serwera - napisana w języku Java. Teraz ja chcę do niej napisać własnego klienta w java'ie. Java i C++ posiadają odmienne standardy wielu rzeczy. Ogółem różnią się i to przeszkadza w dobrej komunikacji tych programów. Dokładniej mój problem polega na przesyłaniu pakietów do serwera, pakiety są prosto zbudowane, dokładnie znam całą ich strukturę i działanie. Jednak przesyłanie zmiennych typu char sprawia mi tu trudność. Że tak to ujmę w java'ie inaczej "wygląda" char i w c++ inaczej. Wysyłając z klienta łańcuch znaków o długości powiedzmy 7 znaków, serwer otrzymuje go jako kilka tysięcy.
Teraz chciałbym prosić kogoś kto zna się dobrze na java'ie i c++ o przeprowadzenie mnie w końcu przez tą łamigłówkę UTF'ów, big/little-endiannes'ów, host to network byte orderów etc, etc etc...
Powiem teraz co chcę wysłać i jeśli ktoś będzie mógł mi pomóc będę niesamowicie wdzięczny:
1. Wysyłam pierwszy pakiet - budowa:
- wysyłam ID pakietu (serwer odbiera go jako BYTE)
- wysyłam zmienną typu SHORT, która zawiera ilość znaków string'a który nadejdzie w następnym pakiecie (w moim   przypadku 7)
- wysyłam string'a z nazwą użytkownika (w moim przypadku ma on długość równą 7)

2. Wysyłam drugi pakiet który jest prośbą o zalogowanie - budowa:
- wysyłam ID pakietu (serwer odbiera go jako BYTE)
- wysyłam numer protokołu (serwer rozpoznaje, czy klient ma dobrą wersję) jako INT, aktualnie 23
- wysyłam zmienną typu SHORT, która zawiera ilość znaków string'a który nadejdzie w następnym pakiecie (w moim   przypadku 7)
- wysyłam string'a z nazwą użytkownika (w moim przypadku ma on długość równą 7)
- teraz wysyłam sporo śmieci które są aktualnie nieużywane przez serwer ale trzeba je wysłać, są to kolejno:
* zmienna long równa 0
* zmienna Short równa 0
* zmienna Int rowna 0
* zmienna Byte rowna 0 (z tego co mi wiadomo Byte w Java'ie jest zmienną liczbową)
* zmienna byte rowna 0
* zmienna byte rowna 0

I na tyle - dla testu napisałem taki klient w java'ie (prawie jej nie znam więc niektórym może mój kod wydawać się śmieszny, ale uczyłem się java'y może ze 2-3 godziny).
C/C++
import java.io.*;
import java.net.*;
import java.util.*;

public class Keepalive
{
    static DataOutputStream outStream;
    static DataInputStream inStream;
    static String nickname;
   
    public static void main( String[] args )
    {
        System.out.println( "===============\n== KeepAlive Client by Chlorek ==\n===============" );
        System.out.println( "> Preparing connection..." );
        try
        {
            nickname = args[ 2 ];
            Socket socket = new Socket( args[ 0 ], 25565 ); // port bedzie na args[1] ale nie wiem jak rzutowac
            outStream = new DataOutputStream( socket.getOutputStream() );
            inStream = new DataInputStream( socket.getInputStream() );
            System.out.println( "> Sending Handshake..." );
            SendHandShake();
            System.out.println( "> Sending Login Request..." );
            SendLoginRequest();
            SendChatMessage( "Test!" );
            System.out.println( "> Sending KeepAlive..." );
            SendKeepAlive();
        }
        catch( UnknownHostException e )
        {
        }
        catch( IOException e )
        {
        }
    }
   
    public static void writeTheString( String s, DataOutputStream dataoutputstream ) throws IOException
    {
        if( s.length() > 32767 )
        {
            throw new IOException( "String zbyyyyt dlugi" );
        }
        else
        {
            dataoutputstream.writeShort( s.length() );
            dataoutputstream.writeChars( s );
            return;
        }
    }
   
    /*
    HAND SHAKE PACKET
    */
    public static void SendHandShake()
    {
        try
        {
            outStream.writeByte( 2 );
            writeTheString( nickname, outStream );
        }
        catch( IOException e )
        {
            e.printStackTrace();
        }
    }
   
    /*
    Login Request PACKET
    */
    public static void SendLoginRequest()
    {
        try
        {
            outStream.writeByte( 1 );
            outStream.writeInt( 23 );
            writeTheString( nickname, outStream );
            outStream.writeLong( 0 );
            outStream.writeShort( 0 );
            outStream.writeInt( 0 );
            outStream.writeByte( 0 );
            outStream.writeByte( 0 );
            outStream.writeByte( 0 );
            outStream.writeByte( 0 );
        }
        catch( IOException e )
        {
            e.printStackTrace();
        }
    }
   
    /*
    ChatMessage Packet
    */
    public static void SendChatMessage( String str )
    {
        try
        {
            outStream.writeByte( 3 );
            writeTheString( str, outStream );
        }
        catch( IOException e )
        {
            e.printStackTrace();
        }
    }
   
    /*
    KeepAlive PACKET
    */
    public static void SendKeepAlive()
    {
        try
        {
            while( true )
            {
                outStream.writeByte( 0 );
                Thread.sleep( 500 );
            }
        }
        catch( InterruptedException e )
        {
        }
        catch( IOException e )
        {
        }
    }
}
P-56088
« 1 »
  Strona 1 z 1