Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于与IRC服务器通信的Java套接字_Java_Multithreading_Sockets_Irc - Fatal编程技术网

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

用于与IRC服务器通信的Java套接字,java,multithreading,sockets,irc,Java,Multithreading,Sockets,Irc,我正在学习Java,希望创建自己的IRC客户端。我有两个线程,但问题是,我并不总是从服务器得到响应(看不到PING),而且我的消息传递滞后 我以为这和线程不睡觉有关,但事实证明不是 当我连接到服务器时,我会发送以下命令来识别我自己和PrivateMg self: USER me * 8 : hi NICK mynick 我也不确定我对线程的使用是否正确 我使用的代码是: import java.io.*; import java.net.*; import java.util.logging

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

我以为这和线程不睡觉有关,但事实证明不是

当我连接到服务器时,我会发送以下命令来识别我自己和PrivateMg 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中调用.readLine()两次。由于每个循环消耗2条消息,因此在收到偶数条消息之前,将看不到任何输出(因此在收到第四条消息之前,第三条消息似乎会“挂起”)

谢谢,这正是问题的原因。我已经删除了.readLine()中的第二个
,它解决了问题。