0

我正在使用 Java NIO 做客户端服务器 Java 程序。基本上对于服务器代码,我从这里获取。而对于客户端,我从这里拿走了。现在看来还不错。我现在想要实现的是将数据从客户端发送到服务器,服务器将发送回客户端。

但我的逻辑有问题。假设我放了“AMessage”,然后我必须放“BMessage”才能从服务器检索“AMessage”。我做了调试,似乎我key.isConnectable()的总是 return true。我尝试设置关键兴趣,重新注册它,但我还没有找到任何解决方案。

我试过这个key.interestOps(0);,,myChannel.register(selector, SelectionKey.OP_READ);但似乎什么也没发生。isConnectable仍然返回 true。我发现其他人告知的一些问题说这是本地主机问题。我不知道。但现在我在 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();

        }

    }
4

1 回答 1

4
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().

于 2013-03-28T08:50:43.193 回答