我正在使用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();
}
}
答案 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.");
}
这里有几个问题。
isConnectionPending()
测试是多余的。它必须待定,否则你不会得到这个事件,但你可能会通过测试来诱惑普罗维登斯。摆脱这个测试。
finishConnect()
来电,你做得不对。如果finishConnect()
返回true 然后,则可以取消注册OP_CONNECT
并注册OP_READ
或其他任何内容。如果返回false,则表示不正常。
如果finishConnect()
引发异常,则连接失败,您必须关闭该频道。
您正在调用finishConnect()
两次:一次在try
块中,一次在记录状态时。除去第二个电话并使用第一个电话的结果(如果有的话)。我会重新组织这个来记录(a)来自finishConnect()
的成功,(b)来自finishConnect()
的失败,以及(c)来自finishConnect()
的异常,都是单独的。
你最后的System.out.println()
只是三个案件中两个案件的谎言。不要告诉自己你不知道的事情是真的。它只是混淆了图片。如上所述单独记录每个案例。
您假设连接是可读的,而不是测试isReadable().