版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/zhuyijian135757/article/details/37672151

java Nio 通信与Bio通信主要不同点:

1.Nio中的单个channel就可以支持读操作也能够支持写操作,而bio中读操作要用inputstream,写操作要outputstream.

2.nio 採用byteBuffer 作为内存缓存区,向channel里写或者度操作,bio基本是用byte[]

3.nio採用 selector组件轮询读取就绪channel

服务端demo代码:

  1. package com.my.socket3;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.net.InetSocketAddress;
  5. import java.nio.ByteBuffer;
  6. import java.nio.channels.SelectionKey;
  7. import java.nio.channels.Selector;
  8. import java.nio.channels.ServerSocketChannel;
  9. import java.nio.channels.SocketChannel;
  10. import java.util.Iterator;
  11. import java.util.Set;
  12. import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
  13. public class ServerTest {
  14. public static void main(String[] args) throws Exception {
  15. server();
  16. }
  17. public static void server(){
  18. ServerSocketChannel channel=null;
  19. try{
  20. Selector selector=Selector.open();
  21. channel=ServerSocketChannel.open();
  22. channel.configureBlocking(false);
  23. channel.socket().setReuseAddress(true);
  24. channel.bind(new InetSocketAddress(8020));
  25. channel.register(selector, SelectionKey.OP_ACCEPT,new Integer(1));
  26. while(true){
  27. if(selector.select()>0){
  28. Set<SelectionKey> sets=selector.selectedKeys();
  29. Iterator<SelectionKey> keys=sets.iterator();
  30. while(keys.hasNext()){
  31. SelectionKey key=keys.next();
  32. keys.remove();
  33. if(key.isAcceptable()){
  34. key.attach(new Integer(1));
  35. SocketChannel schannel=((ServerSocketChannel) key.channel()).accept();
  36. schannel.configureBlocking(false);
  37. schannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
  38. }
  39. if(key.isReadable()){
  40. SocketChannel schannel=(SocketChannel) key.channel();
  41. ByteBuffer buf=ByteBuffer.allocate(1024);
  42. ByteOutputStream output=new ByteOutputStream();
  43. int len=0;
  44. while((len=schannel.read(buf))!=0){
  45. buf.flip();
  46. byte by[]=new byte[buf.remaining()];
  47. buf.get(by);
  48. output.write(by);
  49. buf.clear();
  50. }
  51. String str=new String(output.getBytes());
  52. key.attach(str);
  53. }
  54. if(key.isWritable()){
  55. Object object=key.attachment();
  56. String attach=object!=null ? "server replay: "+object.toString() : "server replay: ";
  57. SocketChannel schannel=(SocketChannel) key.channel();
  58. schannel.write(ByteBuffer.wrap(attach.getBytes()));
  59. }
  60. }
  61. }
  62. }
  63. }catch(Exception e){
  64. e.printStackTrace();
  65. }finally{
  66. if(channel!=null){
  67. try {
  68. channel.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. }
  75. }

客户端demo代码

  1. package com.my.socket3;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.net.InetSocketAddress;
  5. import java.nio.ByteBuffer;
  6. import java.nio.channels.SelectionKey;
  7. import java.nio.channels.Selector;
  8. import java.nio.channels.SocketChannel;
  9. import java.util.Iterator;
  10. import java.util.Set;
  11. public class ClientTest {
  12. public static void main(String[] args) throws Exception {
  13. client();
  14. }
  15. public static void client() {
  16. SocketChannel channel=null;
  17. try {
  18. Selector selector=Selector.open();
  19. channel = SocketChannel.open();
  20. channel.configureBlocking(false);
  21. channel.connect(new InetSocketAddress(8020));
  22. channel.register(selector, SelectionKey.OP_CONNECT);
  23. while(true){
  24. if(selector.select()>0){
  25. Iterator<SelectionKey> set=selector.selectedKeys().iterator();
  26. while(set.hasNext()){
  27. SelectionKey key=set.next();
  28. set.remove();
  29. SocketChannel ch=(SocketChannel) key.channel();
  30. if(key.isConnectable()){
  31. ch.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE,new Integer(1));
  32. ch.finishConnect();
  33. }
  34. if(key.isReadable()){
  35. key.attach(new Integer(1));
  36. ByteArrayOutputStream output=new ByteArrayOutputStream();
  37. ByteBuffer buffer=ByteBuffer.allocate(1024);
  38. int len=0;
  39. while((len=ch.read(buffer))!=0){
  40. buffer.flip();
  41. byte by[]=new byte[buffer.remaining()];
  42. buffer.get(by);
  43. output.write(by);
  44. buffer.clear();
  45. }
  46. System.out.println(new String(output.toByteArray()));
  47. output.close();
  48. }
  49. if(key.isWritable()){
  50. key.attach(new Integer(1));
  51. ch.write(ByteBuffer.wrap((("client say:hi")).getBytes()));
  52. }
  53. }
  54. }
  55. }
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }finally{
  59. try {
  60. channel.close();
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. }
  66. static class ClientRunnable implements Runnable{
  67. private SocketChannel ch;
  68. private ClientRunnable(SocketChannel ch){
  69. this.ch=ch;
  70. }
  71. @Override
  72. public void run() {
  73. try {
  74. while(true){
  75. ch.write(ByteBuffer.wrap((("client say:hi")).getBytes()));
  76. Thread.sleep(5000);
  77. }
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. try {
  81. ch.close();
  82. } catch (IOException e1) {
  83. e1.printStackTrace();
  84. }
  85. }
  86. }
  87. }
  88. }

跑demo时遇到的问题

1.客户端须要进行 ch.finishiCnonnect()操作,否则两边都堵塞着

2.读channel中的bytebuffer时, while((len=ch.read(buffer))!=0) 推断不要写成while((len=ch.read(buffer))!=-1) 

假设SocketChannel被设置为非堵塞,则它的read操作可能返回三个值:
1) 大于0,表示读取到了字节数。
2) 等于0。没有读取到消息,可能TCP处于Keep-Alive状态,接收到的是TCP握手消息。
3) -1,连接已经被对方合法关闭。

java NIO socket 通信实例的更多相关文章

  1. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  2. Java NIO Socket编程实例

    各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用 ...

  3. Java nio socket与as3 socket(粘包解码)连接的应用实例

    对Java nio socket与as3 socket连接的简单应用 <ignore_js_op>Java nio socket与as3 socket连接的应用实例.rar (9.61 K ...

  4. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA)   好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...

  5. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  6. 网络协议栈学习(一)socket通信实例

    网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...

  7. (8)Linux(客户端)和Windows(服务端)下socket通信实例

    Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <st ...

  8. java nio实现非阻塞Socket通信实例

    服务器 package com.java.xiong.Net17; import java.io.IOException; import java.net.InetSocketAddress; imp ...

  9. Java NIO Socket 非阻塞通信

    相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...

随机推荐

  1. Sql Server 出现此数据库没有有效所有者问题

    在新建数据库或附加数据库后,想添加关系表,结果出现下面的错误:  此数据库没有有效所有者,因此无法安装数据库关系图支持对象.若要继续,请首先使用“数据库属性”对话框的“文件”页或ALTER AUTHO ...

  2. C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件

    使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...

  3. 学Python的第四天

    第四天啦,今天依旧代码少的啃树皮.... 但是作业留的有了幼儿园的水准!!!让小编我看到了希望.... #!/usr/bin/env python # -*- coding:utf8 -*- impo ...

  4. Ansible笔记(1)---基本概念

    一.ansible的作用以及工作结构 1.1.ansible简介: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func ...

  5. bzoj5118 Fib数列2 二次剩余+矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5118 题解 这个题一看就是不可做的样子. 求斐波那契数列的第 \(n\) 项,\(n \leq ...

  6. Pyhton---基础---递归

    2019-05-21 ------------------------------------------- 一. #类似于栈的先进后出模式def digui(num):    print(num)  ...

  7. python——解释型语言

    编程语言分三大类   :  低级语言  .  汇编语言 .   高级语言. 现代计算机都是基于  图灵机模型 制造的.  因此计算机的内部只能接受二进制数据.而用二进制代码  0  1  描述的指令叫 ...

  8. android 6.0适配(总结)

    6.0的适配主要是权限: 权限的分组: 普通权限:也就是正常权限,是对手机的一些正常操作,对用户的隐私没有太大影响的权限,比如手机的震动,网络访问,蓝牙等权限,这些权限会在应用被安装的时候默认授予,用 ...

  9. Linux负载均衡软件LVS

    linux下的开源负载均衡软件LVS的安装.配置和使用.LVS是一个中国人创建和开发的开放源码项目,利用LVS可以构建高可用.高可靠的负载均衡集群,因此,利用Linux+LVS不但可以假设高性能的负载 ...

  10. 170814关于Cookie的知识点

    1.会话控制 Http协议   Http协议两个缺陷: 1.HTTP协议是纯文本的    2.HTTP协议是无状态的 服务器不能简单的通过HTTP协议来区分多次请求是否发自同一个用户    虽然通过H ...