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).
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 );
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;
}
}
public static void SendHandShake()
{
try
{
outStream.writeByte( 2 );
writeTheString( nickname, outStream );
}
catch( IOException e )
{
e.printStackTrace();
}
}
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();
}
}
public static void SendChatMessage( String str )
{
try
{
outStream.writeByte( 3 );
writeTheString( str, outStream );
}
catch( IOException e )
{
e.printStackTrace();
}
}
public static void SendKeepAlive()
{
try
{
while( true )
{
outStream.writeByte( 0 );
Thread.sleep( 500 );
}
}
catch( InterruptedException e )
{
}
catch( IOException e )
{
}
}
}