Java NIO Socket基础问题,望热心的高手解答!
发布网友
发布时间:2022-05-01 15:37
我来回答
共2个回答
热心网友
时间:2023-10-22 09:36
1客户端和服务器肯定是用的自己的Selecot,这个是单独的,一边一个,没有关系。
2write不需要注册事件,注册事件是为了程序不阻塞,write方法不是阻塞的,啥时候写都没问题,读需要因为读是阻塞的,如果直接read,没有信息来,就会阻塞,为了不阻塞,NIO就是为了这个,所以又了监听,只有知道有数据来了,再去读,那么肯定就能读。这个监听只是提供了一个触发机制,“(不太明白这里我还没注册WRITE事件怎么就可以写了)”其实你都不注册,读写也是可以进行的,不过,内样读就是阻塞的,不是NIO的机制了。
最后的这个只看你说的不知道原因,方便的话,可以给代码看看吗
热心网友
时间:2023-10-22 09:36
当对方关闭时,你的 readable 事件可能有在几秒钟内一直收到,但却无法读取到任何内容,大概是因为这个时候却收到的只是状态变量,是系统的包,不是应用程序的数据包。
你在 channel.read(buf) 得到 count = -1 就表示对方关闭了,所以这时你需要停下来,否则会进行一个大约几秒钟的快速循环中,直到收到一个 IOException 停下来。
另外的 write 事件基本上有连接稳定时会一直触发,所以你只需要在有数据要写出时才写,否则 Thread.currentTread().yield() 放弃当前的时间片。
热心网友
时间:2023-10-22 09:36
1客户端和服务器肯定是用的自己的Selecot,这个是单独的,一边一个,没有关系。
2write不需要注册事件,注册事件是为了程序不阻塞,write方法不是阻塞的,啥时候写都没问题,读需要因为读是阻塞的,如果直接read,没有信息来,就会阻塞,为了不阻塞,NIO就是为了这个,所以又了监听,只有知道有数据来了,再去读,那么肯定就能读。这个监听只是提供了一个触发机制,“(不太明白这里我还没注册WRITE事件怎么就可以写了)”其实你都不注册,读写也是可以进行的,不过,内样读就是阻塞的,不是NIO的机制了。
最后的这个只看你说的不知道原因,方便的话,可以给代码看看吗
热心网友
时间:2023-10-22 09:36
当对方关闭时,你的 readable 事件可能有在几秒钟内一直收到,但却无法读取到任何内容,大概是因为这个时候却收到的只是状态变量,是系统的包,不是应用程序的数据包。
你在 channel.read(buf) 得到 count = -1 就表示对方关闭了,所以这时你需要停下来,否则会进行一个大约几秒钟的快速循环中,直到收到一个 IOException 停下来。
另外的 write 事件基本上有连接稳定时会一直触发,所以你只需要在有数据要写出时才写,否则 Thread.currentTread().yield() 放弃当前的时间片。
热心网友
时间:2023-10-22 09:36
1客户端和服务器肯定是用的自己的Selecot,这个是单独的,一边一个,没有关系。
2write不需要注册事件,注册事件是为了程序不阻塞,write方法不是阻塞的,啥时候写都没问题,读需要因为读是阻塞的,如果直接read,没有信息来,就会阻塞,为了不阻塞,NIO就是为了这个,所以又了监听,只有知道有数据来了,再去读,那么肯定就能读。这个监听只是提供了一个触发机制,“(不太明白这里我还没注册WRITE事件怎么就可以写了)”其实你都不注册,读写也是可以进行的,不过,内样读就是阻塞的,不是NIO的机制了。
最后的这个只看你说的不知道原因,方便的话,可以给代码看看吗
热心网友
时间:2023-10-22 09:36
当对方关闭时,你的 readable 事件可能有在几秒钟内一直收到,但却无法读取到任何内容,大概是因为这个时候却收到的只是状态变量,是系统的包,不是应用程序的数据包。
你在 channel.read(buf) 得到 count = -1 就表示对方关闭了,所以这时你需要停下来,否则会进行一个大约几秒钟的快速循环中,直到收到一个 IOException 停下来。
另外的 write 事件基本上有连接稳定时会一直触发,所以你只需要在有数据要写出时才写,否则 Thread.currentTread().yield() 放弃当前的时间片。