gpt4 book ai didi

通过 channel 从客户端读取内容时出现 java.nio.channels.IllegalBlockingModeException

转载 作者:行者123 更新时间:2023-11-29 08:06:07 25 4
gpt4 key购买 nike

我是 NIO 的新手,正在构建一个聊天应用程序,我在所有客户端都建立了连接,但是在从客户端读取内容时,我遇到了 java.nio.channels.IllegalBlockingModeException。请帮助我这是发生异常的代码。当到达 while (rbc.read(b) != -1)PrintRequest class 发生异常

public class PrintRequest extends Thread
{

public PrintRequest(SocketChannel sc,int i)throws Exception
{
System.out.println("going to enter the try block of PrintRequest");
try
{
System.out.println("Am in the try block of PrintRequest");

ReadableByteChannel rbc = Channels.newChannel(sc.socket().getInputStream());
System.out.println("checking in PrintRequest 0001");
WritableByteChannel wbc = Channels.newChannel(System.out);
System.out.println("checking in PrintRequest 0010");
ByteBuffer b = ByteBuffer.allocateDirect(1024); // read 1024 bytes
// int numBytesRead = sc.read(b);
System.out.println("checking in PrintRequest 0011");
while (rbc.read(b) != -1)
{
System.out.println("Am in while loop of PrintRequest ");
b.flip();
while (b.hasRemaining())
{
wbc.write(b);
System.out.println();
}
b.clear();
}

}
catch(Exception E)
{
System.out.println("Exception in printlnRequest "+E);
}
} }

我的服务器代码:

public class Server
{

private Selector selector;

private ServerSocketChannel channel;

public void listner()
{

try
{
this.selector = Selector.open();
this.channel = ServerSocketChannel.open();
this.channel.configureBlocking(false);
this.channel.socket().bind(new InetSocketAddress(8888));
this.channel.register(this.selector, 16);
}
catch (IOException e)
{
throw new RuntimeException("Could not register listener", e);
}}


public void non_Socket()throws Exception
{

try
{
int i=0;
this.channel = ServerSocketChannel.open();
this.channel.configureBlocking(false);
this.channel.socket().bind(new InetSocketAddress(80));

while(true)
{

this.selector = Selector.open();
this.channel.register(this.selector, 16);

Set<SelectionKey> keys = this.selector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext())
{
SelectionKey key = keyIterator.next();
if(key.isAcceptable())
{
// a connection was accepted by a ServerSocketChannel.
System.out.println("a connection was accepted by a ServerSocketChannel");
SocketChannel sc = this.channel.accept();
sc.configureBlocking(false);
System.out.println("Received an incoming connection from " + sc.socket().getRemoteSocketAddress());
System.out.println("checking 0101");
// new PrintRequest(sc,i).start();
System.out.println("checking 0110");

if(sc == null )
{
System.out.println("Please login");
Thread.sleep(6000);
}
else
{
System.out.println("Last Login was successful");
// new PrintRequest(sc,i).start();
PrintRequest pr=new PrintRequest(sc,i);
new Thread(pr).start();

}


}
else if (key.isConnectable())
{
// a connection was established with a remote server.
System.out.println("a connection was established with a remote server");


}
else if (key.isWritable())
{
// a channel is ready for writing
System.out.println(" a channel is ready for writing");
}

else if (key.isReadable())
{
// a channel is ready for reading
System.out.println(" a channel is ready for Reading");
}
System.out.println(" a channel is prepare for Reading");
keyIterator.remove();
Thread.sleep(5000);
}

}
}

catch(Exception E)
{
System.out.println(" Here : "+E);
}
finally
{
if (channel != null)
{
try
{
channel.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}


public static void main(String [] abc) throws Exception
{
new Server().non_Socket();
}}

客户端:

public class Client 
{

public void non_Client_Socket()
{
SocketChannel sChannel=null;
try
{
sChannel = SocketChannel.open();
sChannel.connect(new InetSocketAddress("localhost", 80));
while (!sChannel.finishConnect())
{
System.out.println("Channel is not connected yet");
Thread.sleep(5000);
}

System.out.println("Channel is ready to use");

/* ---------- going to send data to server ------------*/
System.out.println("please enter the text");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
System.out.println("Enter the text");
String HELLO_REQUEST =stdin.readLine().toString();
if(HELLO_REQUEST.equalsIgnoreCase("end"))
{
break;
}

System.out.println("Sending a request to HelloServer");
ByteBuffer buffer = ByteBuffer.wrap(HELLO_REQUEST.getBytes());
sChannel.write(buffer);
}
}
catch(Exception E)
{

}

finally
{
if (sChannel != null)
{
try
{
sChannel.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}

} }
/* ---------- the data is written in sChannel server will read from this channel ------------ */




public static void main(String [] args)throws Exception
{
new Client().non_Client_Socket();
}}

最佳答案

ReadableByteChannel rbc = Channels.newChannel(sc.socket().getInputStream()); 

你的问题就在这里。您不能使用来自处于非阻塞模式的 channel 的流。无论如何,该代码毫无意义,因为 sc 已经是一个 ReadableByteChannel。只需删除此行并使用 sc 而不是 rbc 执行以下 I/O。但见下文。

您仍然没有解决我在您的 previous post 中提到的任何问题.您的连接技术仍然是错误的,并且您正在调用 PrintRequest() ,它以非阻塞模式循环读取而不是为 OP_READ 注册接受的 channel 。代码仍然毫无意义。

关于通过 channel 从客户端读取内容时出现 java.nio.channels.IllegalBlockingModeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11132206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com