0

私はAndroid xfireクライアントから接続を確立しようとしています.TCP接続だと思います。私はどこでもググってみましたが、ポート 25999 で cs.xfire.com を使用して xfire (メッセージング サービス) に接続するように何度も言われてきました。しかし、最後に、接続しないという例外が発生します。そのため、接続を確立できない理由を知りたいです。接続できない理由を理解するのに役立つインターネット上の情報はほとんどありません。パケットスニファーを介して接続をリッスンし、公式の xfire から「接続」をクリックすると、ポート 25999 も提供されました。ウィンドウズアプリ。この質問があまり意味をなさない場合は申し訳ありませんが、私が持っているもののコードは次のとおりです。

public class Connectionn extends Activity{
private DataInputStream in = null;
private DataOutputStream out = null;
private byte[] buffer;
private String username, password, nickname, statustext = "Online";
private boolean runThread = true;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.connected);
    TextView txtView1 = (TextView) findViewById(R.id.tvTest);
    Bundle extras = getIntent().getExtras();
    String username = extras.getString("username");
    String password = extras.getString("password");

    try {

        Socket s = new Socket("cs.xfire.com", 25999);
        txtView1.setText("Connected!");
        in = new DataInputStream(s.getInputStream());
        out = new DataOutputStream(s.getOutputStream());
        login();
    } catch (IOException ioe) {
        //disconnect();
        txtView1.setText(ioe.toString());

    }   
}

public void run() {
    setTitle("Xfire Reader Thread");
    while(runThread) {
            readBytes();
            debug(buffer);

            switch(buffer[0] & 0xFF) {
            case 0x80: // salt

                    break;
            case 0x81: // auth failed
                    disconnect();

                    break;
            case 0x82: // loginreply


                    break;
            case 0x83: // friendslist

                    break;
            case 0x84: // friend online

                    break;
            case 0x85: // receive message

                /*ReceiveMessagePacket rmp = new ReceiveMessagePacket(buffer);
                    if (rmp.getMessageType() == ReceiveMessagePacket.MSGTYPE_IM) {
                            AckImPacket amp =
                                    new AckImPacket(rmp.getSid(), rmp.getImIndex());
                            write(amp.getBytes());
                    }*/

                    break;
            case 0x87: // friend in game

                    break;
            case 0x91: // disconnected with reason
                    disconnect();

                    break;
            case 0x9a: // friend status text

                    break;
            case 0xac:

                    break;
            }
    }
}

private void login() {
    // TODO Auto-generated method stub

    // initialize connection with the 'UA01' packet
    write("UA01".getBytes());

    // send the version packet
    final byte[] p_version_1 = new byte[] {
            0x03, 0, 0x01, 0x07,
            0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, // version
            0x02
    };

    final int version = 118;
    String vp = null;
    write(vp.getBytes());

    // start the reader thread
    onStart();

}

public void disconnect() {
    //EventManager.removeObserver(this);
    runThread = false;

    try {
            out.write(new byte[] { 0, 0, 0, 0 }); // sabotage the stream                    
    } catch (IOException ioe) {
            ioe.printStackTrace();
    } finally {
            try {
                    out.close();
                    in.close();
            } catch (IOException ioe) {
                    ioe.printStackTrace();
            }
            //FriendManager.getInstance().cleanup();
           // EventManager.fireEvent(new DatalessEvent(XfireEvent.XF_OFFLINE));
    }
}

private void readBytes() {
     try {
             byte[] numBytes = new byte[2];
             in.read(numBytes, 0, 2);
             int low = numBytes[0] & 0xFF, high = numBytes[1] & 0xFF;
             int len = (0x00 | low | (high << 8)) - 2;

             if (len <= 0) {
                     buffer = new byte[] { 0 };
                     return;
             }

             buffer = new byte[len];
             in.read(buffer, 0, len);
     } catch (IOException ioe) {
             ioe.printStackTrace();
             disconnect();
     }
}

private static void debug(byte[] bs) {
    for (byte b : bs) {
            System.out.print(String.format("%02x", b) + " ");
    }
    System.out.println();
}

public void write(byte[] bs) {
    try {
            out.write(bs);
    } catch (IOException ioe) {
            ioe.printStackTrace();
            disconnect();
    }
 }
 }
4

1 に答える 1