1

私は現在、Java で書かれた IRC クライアントに取り組んでいます。

サーバーへの接続が確立されるとすぐに、次のメッセージを送信します。

  • /ニックテスト
  • /JOIN #チャット

最初のテストはうまくいきました - サーバーは応答しています。しかし、それは言うたびに:

  • 通知認証:***
  • IDの確認
  • 通知認証:***
  • ID 応答なし
  • エラー:リンクを閉じています... (登録がタイムアウトしました)

少し役立つ関連する質問を見つけました。ポート 113 でリッスンして、IRC サーバーからの接続とメッセージを受信して​​応答する必要があると表示されます。そのポートでリッスンする ServerSocket を実装しましたが、サーバーはポート 113 で接続を開こうとしません。何が間違っていますか?

コードは次のとおりです。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class IdentProtocolThread extends Thread {

private String nick;
private ServerSocket serverSocket;
private BufferedReader reader;
private BufferedWriter writer;

public IdentProtocolThread(String nick) throws IOException {
    this.nick = nick;

    this.serverSocket = new ServerSocket(113);
}

@Override
public void run() {

    try {

        System.out.println("waiting for incoming socket");
        Socket socket = this.serverSocket.accept();

        System.out.println("socket accepted");
        this.initialize(socket);
        System.out.println("reader/writer initialized");

        String line = null;
        while ((line = this.reader.readLine()) != null) {
            System.out.println(line);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("done");
}

private void initialize(Socket socket) throws IOException {
    this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    this.writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
}
}

実行すると、これだけが表示されます:

着信ソケットを待機中

ident チェックを回避するために、他のメッセージを送信する必要がありますか?

4

1 に答える 1

3

基礎となる IRC プロトコルへの参照については、この質問をご覧ください。/これは、クライアントで見慣れているコマンドよりも構造化されています。多くの場合、握手は次のようになります。

<< USER foo . . :real name
<< NICK bar
>> :server PING somethinglonghere
<< PONG :somethinglonghere
>> :server 001 bar :Welcome!
<< JOIN #channel
>> :bar!foo@yourhost JOIN #channel
>> :server 332 bar #channel :channel topic
>> :server 353 bar = #channel :@someop +somevoice someuser anotheruser
>> :server 366 bar #channel :End of /NAMES list

ここで<<、 はサーバーに送信されたテキスト>>行を示し、サーバーから受信したテキスト行を示します。IRC は名目上\r\n行末を使用することにも注意してください。ただし、多くのサーバーも受け入れ\nます。

于 2013-08-28T06:15:05.060 に答える