2011-11-17 45 views
1

我正在学习Java并希望创建自己的IRC客户端。我有两个线程,但问题是我并不总是从服务器获得响应(无法看到PING),并且它滞后于我的消息传递。用于与IRC服务器通信的Java套接字

我认为这是线程没有睡眠,但事实证明它不是。

当我连接到服务器我送下面的命令,以确定自己和privatemsg自我:

USER me * 8 : hi 
NICK mynick 

我也不能肯定,如果我的线程的使用是正确的。

的代码我使用:

import java.io.*; 
import java.net.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class f_irc { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException { 

    Socket ircSocket = null; 
    BufferedWriter out = null; 
    BufferedReader in = null; 
    String host = "irc.freenode.net"; 
    int port = 6667; 

    Boolean proxyEnabled = true; 

    try { 
     SocketAddress addr = new InetSocketAddress("127.0.0.1", 1080); 
     Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); 
     ircSocket = new Socket(proxy); 
     InetSocketAddress final_addr = new InetSocketAddress(host, port); 
     ircSocket.connect(final_addr); 
    } 
    catch(Exception e) 
    { 
     ircSocket = new Socket(host, port); 
    } 

    Thread listener = new ServerListener(ircSocket); 
    listener.start(); 

    System.out.println("Listener started!"); 

    Thread sender = new ServerSender(ircSocket); 
    sender.start(); 

    System.out.println("Sender started!"); 
} 
} 

class ServerListener extends Thread implements Runnable { 

Socket ircSocket; 
String serverAnswer = null; 
BufferedReader in = null; 

ServerListener(Socket irc) throws IOException { 
    ircSocket = irc; 
    in = new BufferedReader(new InputStreamReader(irc.getInputStream())); 
} 

@Override 
public void run() { 
    while(true) { 
     System.out.println("Running: "); 
     try { 
      serverAnswer = in.readLine(); 
      if (serverAnswer != null) { 
       System.out.println("Server talkin: " + in.readLine()); 
       System.out.println("Server talkin++: " + serverAnswer); 
      } 
     } catch (IOException ex) { 
      System.out.println("cant read linez br0w"); 
     } 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(ServerSender.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
} 

class ServerSender extends Thread { 

Socket ircSocket; 
String serverCommand = null; 
BufferedWriter out = null; 
BufferedReader stdIn = null; 

ServerSender(Socket irc) throws IOException { 
    ircSocket = irc; 
    out = new BufferedWriter(new OutputStreamWriter(irc.getOutputStream())); 
    stdIn = new BufferedReader(new InputStreamReader(System.in)); 
} 

@Override 
public void run() { 
    while(true) { 
     System.out.println("Running snder: "); 
     try { 
      serverCommand = stdIn.readLine(); 
      if (serverCommand != null) { 
       out.write(serverCommand + "\n"); 
       out.flush(); 
       System.out.println("Sent: " + serverCommand); 
      } 
     } 
     catch(IOException e) { 
      System.out.println("Server fed up"); 
     } 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException ex) { 
      System.out.println("Sleep failed!"); 
     } 
    } 
} 
} 

回答

3

你在你的ServerListener调用in.readLine()两次。由于每循环消耗2条消息,因此在得到偶数条消息之前不会看到任何输出(所以第3条消息看起来会“挂起”,直到获得第4条消息)。

+0

谢谢这正是导致问题。我已经删除了第二个'in.readLine()',它解决了这个问题。 – Aivaras

相关问题