Отправка пакетов через TCP-сокет - PullRequest
2 голосов
/ 13 марта 2011

Я пишу этот крошечный служебный метод для проверки отправки необработанных пакетов в определенную сеть обмена сообщениями (планирование разработки клиента для подключения к нему).

Сеть является сетью обмена сообщениями Deviantart (chat.deviantart.com:3900; TCP).

Мой класс:

protected void connect() throws IOException{

    Socket dAmn = null;
    //BufferedWriter out = null;
    PrintWriter out = null;
    BufferedReader in = null;

    /*
     * Create Socket Connection
     */
    try{
        dAmn = 
            new Socket("chat.deviantart.com", 3900);
        /*out =
            new BufferedWriter(new OutputStreamWriter(dAmn.getOutputStream()));*/
        out =
            new PrintWriter(dAmn.getOutputStream(), true);
        in =
            new BufferedReader(new InputStreamReader(dAmn.getInputStream()));
    }
    catch(SocketException e){
        System.err.println("No host or port for given connection");
        //handle
    }
    catch(IOException e){
        System.err.println("I/O Error on host");
        //handle
    }
    String userInput;
    BufferedReader userIn = 
                        new BufferedReader(new InputStreamReader(System.in));

    /*
     * dAmn communication
     */

    while((userInput = userIn.readLine()) != null){
        out.write(userInput);
        System.out.println(in.readLine());
    }
    if(in!=null)
        in.close();
    if(out!=null)
        out.close();
    if(dAmn!=null)
        dAmn.close();
}

Серверу требуется отправить рукопожатие, прежде чем можно будет войти в систему. Типичный пакет входа в систему выглядит так:

dAmnclient damnClient (в настоящее время 0.3) агент = агент

Каждый пакет должен заканчиваться символом новой строки и нулем.

Мой пакет рукопожатия будет выглядеть примерно так:

dAmnClient 0.3 \ nagent = SomeAgent \ n \ 0

Однако сервер просто отвечает: отключить

Я думаю, что-то неправильно анализируется, какой-нибудь совет? Кроме того, если вы очень заинтересованы в том, чтобы помочь мне: вот небольшая документация по клиенту -> протокол сервера dAmn: http://botdom.com/wiki/DAmn#dAmnClient_.28handshake.29

Ответы [ 2 ]

4 голосов
/ 13 марта 2011

Вы должны использовать Wireshark

С Wireshark вы можете прослушивать трафик с / на хосты.Это действительно легко определить, где ваше приложение делает что-то еще, кроме стандартного клиента.

Кстати, у вас есть \ n перед агентом =, это может быть проблемой

0 голосов
/ 13 марта 2011

Строка, прочитанная пользователем, не будет содержать фактического завершения строки, а также не будет содержать нулевого завершения. Ввод \ n на входе фактически передаст "\ n", а не новую строку.

Вы можете добавить новую строку, заменив write на println (осторожно, в зависимости от платформы можно использовать \ n, \ r \ n или просто \ r):

out.println(userInput);

Вы можете поддержать завершение пакета, например, проверяя наличие определенного пользовательского ввода, например:

if (userInput.equals(".")) {
  out.write((char) 0);
  out.flush();
} else {
  out.println(userInput);
}

Пользователь теперь может завершать пакеты, набирая точку.

(На самом деле код мог выполнять рукопожатие автоматически, не дожидаясь ввода пользователя, но это уже другая история.)

...