如何使用相同的Socket将InputStreamReader和OutputStreamWriter相乘

时间:2016-09-12 17:35:42

标签: java sockets

我正在java中创建一个irc客户端。起初,我为每个要连接的通道使用了一个套接字,例如:

String server = " ircServer " ;
int port = " 6667 " ;
Channellist String [ ] = { " channel 1 " , " Canal2 " " canal3 " , ...} ;

for ( String s : channellist ) {
    Socket socket = new Socket (server , port ) ;

    InputStreamReader InputStreamReader = new InputStreamReader ( socket.getInputStream ());
    OutputStreamWriter OutputStreamWriter = new OutputStreamWriter ( socket.getOutputStream ());

    // ... Code to connect the channel
}

但是这种方法在某些服务器上不起作用,因为它们声称来自同一IP的许多连接,这是由于使用了几个实例化的套接字。

所以,我想知道,我如何将N InputStreamReader和OutputStreamWriter与同一个套接字一起使用,以防止与服务器的过多连接。谢谢。

3 个答案:

答案 0 :(得分:1)

您不应该在同一个套接字中使用多个读取器/写入器。想象一下,尝试使用一部手机进行多次对话。

单个连接就足够了,IRC协议将其复用以处理与不同通道之间的通信。发送消息命令毕竟是/msg <channel> <msg>,允许您从单个作者发送到任意数量的频道。

答案 1 :(得分:0)

尝试使用java nio频道。他们可以解决你的问题

答案 2 :(得分:0)

Kayaman,谢谢你的回答。要发送消息,我得到它,但想使用相同的InputStreamReader和OutputStreamWriter加入多个通道。例如, 在上面的代码之后,它执行以下代码:

BufferedReader reader = new BufferedReader ( this.inputStreamReader ) ;
BufferedWriter writer = new BufferedWriter ( this.outputStreamWriter ) ;

writer.write ( " NICK " + " myNickName " + "\ r \ n");
writer.write ( " JOIN" + " ircChannel " + "\ r \ n");
writer.flush ();

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

通过作者我可以加入频道,而读者我可以听到频道中发生的事情。那么我该如何连接到多个频道并全部收听呢?

非常感谢。