Java rite=buffer.capacity(); while(字节到写入>0){ 字节到写入-=通道写入(缓冲区); } } key.interesttops(选择key.OP_READ); } 公共无效队列数据(SelectionKey,字节[]数据){ SocketChannel=(SocketChannel)key.channel(); List pendingData=this.dataMap_out.get(通道); key.interesttops(选择key.OP_WRITE); pendingData.add(数据); } 公共无效发送消息(int-id,String-msg){ SelectionKey=keys.get(id); if(key!=null) 发送消息(键,消息); //否则 //待办事项处理 } 公共无效发送消息(选择键、字符串消息){ 试一试{ 队列_数据(key,msg.getBytes(“utf-8”); } 捕获(不支持DencodingException ex){ //未抛出:始终定义utf-8 } } 公共字符串get_message(){ 返回_msg.poll(); } 私有静态无效日志(字符串s){ 系统输出打印项次; } @凌驾 公开募捐{ 试一试{ 启动服务器(); } 捕获(IOE异常){ System.out.println(“IOException:+e”); //TODO句柄异常 } } //为指定的主机名和端口创建非阻塞套接字通道。 //在返回新通道之前,会对其调用connect()。 公共静态SocketChannel createSocketChannel(字符串主机名,int端口)引发IOException{ //创建非阻塞套接字通道 SocketChannel sChannel=SocketChannel.open(); sChannel.配置阻塞(错误); //向服务器发送连接请求;此方法是非阻塞的 connect(新的InetSocketAddress(主机名、端口)); 返回夏奈尔; } }

Java rite=buffer.capacity(); while(字节到写入>0){ 字节到写入-=通道写入(缓冲区); } } key.interesttops(选择key.OP_READ); } 公共无效队列数据(SelectionKey,字节[]数据){ SocketChannel=(SocketChannel)key.channel(); List pendingData=this.dataMap_out.get(通道); key.interesttops(选择key.OP_WRITE); pendingData.add(数据); } 公共无效发送消息(int-id,String-msg){ SelectionKey=keys.get(id); if(key!=null) 发送消息(键,消息); //否则 //待办事项处理 } 公共无效发送消息(选择键、字符串消息){ 试一试{ 队列_数据(key,msg.getBytes(“utf-8”); } 捕获(不支持DencodingException ex){ //未抛出:始终定义utf-8 } } 公共字符串get_message(){ 返回_msg.poll(); } 私有静态无效日志(字符串s){ 系统输出打印项次; } @凌驾 公开募捐{ 试一试{ 启动服务器(); } 捕获(IOE异常){ System.out.println(“IOException:+e”); //TODO句柄异常 } } //为指定的主机名和端口创建非阻塞套接字通道。 //在返回新通道之前,会对其调用connect()。 公共静态SocketChannel createSocketChannel(字符串主机名,int端口)引发IOException{ //创建非阻塞套接字通道 SocketChannel sChannel=SocketChannel.open(); sChannel.配置阻塞(错误); //向服务器发送连接请求;此方法是非阻塞的 connect(新的InetSocketAddress(主机名、端口)); 返回夏奈尔; } },java,network-programming,nonblocking,Java,Network Programming,Nonblocking,我的问题:以上代码是否正确且良好,或者我应该更改什么?我如何正确地实现上面提到的要求?还要注意我的“待办事项” 谢谢你的帮助 这里有几个问题 您没有检查write()的结果。它可以返回从零到零的任何值。你可能需要重复多次 如果finishConnect()返回false,这不是一个错误,它只是还没有完成,所以只需让OP_CONNECT保持注册状态,等待它(再次)启动。您刚刚通过SocketChannel.open()创建的SocketChannel的唯一validOps()是OP_CONNECT

我的问题:以上代码是否正确且良好,或者我应该更改什么?我如何正确地实现上面提到的要求?还要注意我的“待办事项”


谢谢你的帮助

这里有几个问题

  • 您没有检查write()的结果。它可以返回从零到零的任何值。你可能需要重复多次

  • 如果finishConnect()返回false,这不是一个错误,它只是还没有完成,所以只需让OP_CONNECT保持注册状态,等待它(再次)启动。您刚刚通过SocketChannel.open()创建的SocketChannel的唯一validOps()是OP_CONNECT。如果finishConnect()引发异常,这是一个错误,您应该关闭通道

  • 关闭频道会取消密钥,您不必自己取消密钥

  • 通常,绑定时应使用null作为本地InetAddress


  • 非常感谢。To 4:目前,我通过将“null”传递给构造函数来实现这一点。顺便说一句:这是我的第一篇文章,编辑上面的代码来改进它好吗?或者我应该怎么做?@user905686好的,是的,你应该编辑它,这样线程就可以作为问题和正确答案的永久记录。如果我的答案有帮助的话,你也应该投票给我,如果你发现它是正确的,你应该把它标记为正确的。好的,代码已经更新了,我试着实现你的建议。对不起,由于我的名声不好,我仍然无法提高投票率,但我会在得到足够的票数后再做;)