Java NIO isConnectable始终返回true

时间:2013-03-28 08:10:16

标签: java client-server nio

我正在使用Java NIO做客户端服务器Java程序。基本上对于服务器代码,我从here获取。而对于客户方,我从here开始。现在看起来不错。我现在想要实现的是从客户端向服务器发送数据,服务器将发送回客户端。

但我的逻辑有问题。让我说我放“AMessage”,然后我必须放“BMessage”以从服务器检索“AMessage”。我进行了调试,似乎我的key.isConnectable()始终返回true。我尝试设置关键兴趣,重新注册它,但我还没有找到任何解决方案。

我已尝试过这个key.interestOps(0);myChannel.register(selector, SelectionKey.OP_READ);,但似乎没有任何反应。 isConnectable仍然是真的。我发现其他人通知的一些问题是它是localhost问题。我不知道。但现在我在localhost上运行服务器和客户端。任何人有任何想法?

谢谢:)

编辑:这是我的代码的一部分: -

if (key.isConnectable()) {
if (myChannel.isConnectionPending()) {
    try{
        myChannel.finishConnect();
    }
    catch(IOException e){
        System.out.println(e);
    }
    System.out.println("Status of finishCOnnect(): " + myChannel.finishConnect() );
    System.out.println("Connection was pending but now is finished connecting.");
}

    ByteBuffer bb = null;
    ByteBuffer incomingBuffer = null;

    Scanner input = new Scanner(System.in);  // Declare and Initialize the Scanner

    while (true) {

        System.out.println("Status isReadable is " + key.isReadable() + " and isWritable is " + key.isWritable() + 
                                            " and isConnectable is " + key.isConnectable());

        readMessage(key); //read if server send data


        //send data to server here
        String inputFromClient = input.nextLine(); //Get the input from client

        System.out.println("debugging after get input...");

        bb = ByteBuffer.allocate(inputFromClient.length()); //Allocate buffer size according to input size

        byte[] data = inputFromClient.getBytes("UTF-8"); //convert the input to form of byte
        bb = ByteBuffer.wrap(data); //wrap string inside a buffer

        myChannel.write(bb); //Write the buffer on the channel to send to the server
        bb.clear();

        }

    }

1 个答案:

答案 0 :(得分:3)

if (key.isConnectable()) {
if (myChannel.isConnectionPending()) {
    try{
        myChannel.finishConnect();
    }
    catch(IOException e){
        System.out.println(e);
    }
    System.out.println("Status of finishCOnnect(): " + myChannel.finishConnect() );
    System.out.println("Connection was pending but now is finished connecting.");
}

这里有几个问题。

  1. isConnectionPending()测试是多余的。它必须待定,否则你不会得到这个事件,但你可能会通过测试来诱惑普罗维登斯。摆脱这个测试。

  2. finishConnect()来电,你做得不对。如果finishConnect()返回true 然后,则可以取消注册OP_CONNECT并注册OP_READ或其他任何内容。如果返回false,则表示不正常。

  3. 如果finishConnect()引发异常,则连接失败,您必须关闭该频道。

  4. 您正在调用finishConnect()两次:一次在try块中,一次在记录状态时。除去第二个电话并使用第一个电话的结果(如果有的话)。我会重新组织这个来记录(a)来自finishConnect()的成功,(b)来自finishConnect()的失败,以及(c)来自finishConnect()的异常,都是单独的。

  5. 你最后的System.out.println()只是三个案件中两个案件的谎言。不要告诉自己你不知道的事情是真的。它只是混淆了图片。如上所述单独记录每个案例。

  6. 您假设连接是可读的,而不是测试isReadable().