用于与IRC服务器通信的Java套接字

我正在学习Java,想要创建自己的IRC客户端。 我有两个线程,但问题是我并不总是从服务器得到响应(看不到PING)并且它滞后于我的消息被传递。

我认为这与线程没有睡眠有关,但事实certificate并非如此。

当我连接到服务器时,我发送以下命令来识别我自己和privatemsg self:

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!"); } } } } 

您在ServerListener中调用了两次in.readLine() 。 因为你每个循环消耗2个消息,所以在得到偶数个消息之前不会看到任何输出(因此第3个消息似乎会“挂起”直到你得到第四个消息)。