2011-11-17 94 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

相關問題