全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JAVA-NIO之Socket/ServerSocket Channel(详解)

一、ServerSocketChannel

Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。

打开 ServerSocketChannel

通过调用 ServerSocketChannel.open() 方法来打开ServerSocketChannel.

关闭 ServerSocketChannel

通过调用ServerSocketChannel.close() 方法来关闭ServerSocketChannel.

监听新进来的连接

通过 ServerSocketChannel.accept() 方法监听新进来的连接。当 accept()方法返回的时候,它返回一个包含新进来的连接的 SocketChannel。因此, accept()方法会一直阻塞到有新连接到达。

通常不会仅仅只监听一个连接,在while循环中调用 accept()方法.

当然,也可以在while循环中使用除了true以外的其它退出准则。

非阻塞模式

ServerSocketChannel可以设置成非阻塞模式。在非阻塞模式下,accept() 方法会立刻返回,如果还没有新进来的连接,返回的将是null。 因此,需要检查返回的SocketChannel是否是null.如:

/**
   * socket server channel
   */
  @Test
  public void text2() throws IOException {
    ServerSocketChannel channel = ServerSocketChannel.open();  //新建channel
    channel.socket().bind(new InetSocketAddress(9999));   //监听端口
    channel.configureBlocking(true);               //设置阻塞

    while (true) {
      SocketChannel accept = channel.accept();          //设置为阻塞,则此方法阻塞,直到有连接
      //如果设置为非阻塞,需要在这里判断 accept == null?
      ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
      accept.read(byteBuffer);
      byteBuffer.flip();                  //反转
      while (byteBuffer.hasRemaining()) {          //判断
        System.err.println((char)byteBuffer.get());    //输出
      }
    }
  }

二、SocketChannel

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:

打开一个SocketChannel并连接到互联网上的某台服务器。

一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。

打开 SocketChannel

下面是SocketChannel的打开方式:

关闭 SocketChannel

当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:

从 SocketChannel 读取数据

要从SocketChannel中读取数据,调用一个read()的方法之一。

首先,分配一个Buffer。从SocketChannel读取到的数据将会放到这个Buffer中。

然后,调用SocketChannel.read()。该方法将数据从SocketChannel 读到Buffer中。read()方法返回的int值表示读了多少字节进Buffer里。如果返回的是-1,表示已经读到了流的末尾(连接关闭了)。

写入 SocketChannel

写数据到SocketChannel用的是SocketChannel.write()方法,该方法以一个Buffer作为参数。

注意SocketChannel.write()方法的调用是在一个while循环中的。Write()方法无法保证能写多少字节到SocketChannel。所以,我们重复调用write()直到Buffer没有要写的字节为止。

非阻塞模式

可以设置 SocketChannel 为非阻塞模式(non-blocking mode).设置之后,就可以在异步模式下调用connect(), read() 和write()了。

connect()

如果SocketChannel在非阻塞模式下,此时调用connect(),该方法可能在连接建立之前就返回了。为了确定连接是否建立,可以调用finishConnect()的方法。

write()

非阻塞模式下,write()方法在尚未写出任何内容时可能就返回了。所以需要在循环中调用write()。前面已经有例子了,这里就不赘述了。

read()

非阻塞模式下,read()方法在尚未读取到任何数据时可能就返回了。所以需要关注它的int返回值,它会告诉你读取了多少字节。

非阻塞模式与选择器

非阻塞模式与选择器搭配会工作的更好,通过将一或多个SocketChannel注册到Selector,可以询问选择器哪个通道已经准备好了读取,写入等。Selector与SocketChannel的搭配使用会在后面详讲。

/**
   * socket channel
   */
  @Test
  public void test3() throws IOException {
    SocketChannel channel = SocketChannel.open();                //新建服务端
    channel.connect(new InetSocketAddress("127.0.0.1",9999));  //连接服务端地址
    ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //缓冲区
    byteBuffer.put("123".getBytes());
    byteBuffer.flip();                 //反转
    while (byteBuffer.hasRemaining()) {         //判断
      channel.write(byteBuffer);
    }
  }

以上这篇JAVA-NIO之Socket/ServerSocket Channel(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# ServerSocket  # Channel  # Java的NIO与IO的详解及对比  # Java 高并发八:NIO和AIO详解  # Java使用BIO和NIO进行文件操作对比代码示例  # 使用java NIO及高速缓冲区写入文件过程解析  # 浅谈Java中BIO、NIO和AIO的区别和应用场景  # Java NIO框架Netty简单使用的示例  # 全面解读Java NIO(看这篇就够了)  # 的是  # 模式下  # 是一个  # 给大家  # 选择器  # 设置为  # 方法来  # 连接到  # 读到  # 服务端  # 法会  # 是在  # 还没有  # 在这里  # 就像  # 多个  # 将会  # 就不  # 告诉你  # 会在 


相关文章: 网站app免费制作软件,能免费看各大网站视频的手机app?  山东云建站价格为何差异显著?  c# 服务器GC和工作站GC的区别和设置  定制建站方案优化指南:企业官网开发与建站费用解析  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何通过西部建站助手安装IIS服务器?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何在西部数码注册域名并快速搭建网站?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何快速搭建响应式可视化网站?  5种Android数据存储方式汇总  如何通过多用户协作模板快速搭建高效企业网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  如何通过VPS搭建网站快速盈利?  香港服务器WordPress建站指南:SEO优化与高效部署策略  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何通过服务器快速搭建网站?完整步骤解析  焦点电影公司作品,电影焦点结局是什么?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  制作网站的基本流程,设计网站的软件是什么?  营销式网站制作方案,销售哪个网站招聘效果最好?  如何通过IIS搭建网站并配置访问权限?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  已有域名如何免费搭建网站?  Android使用GridView实现日历的简单功能  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何在建站之星网店版论坛获取技术支持?  潮流网站制作头像软件下载,适合母子的网名有哪些?  魔方云NAT建站如何实现端口转发?  如何选择最佳自助建站系统?快速指南解析优劣  建站之星代理平台如何选择最佳方案?  历史网站制作软件,华为如何找回被删除的网站?  如何在Windows虚拟主机上快速搭建网站?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  定制建站如何定义?其核心优势是什么?  如何选择美橙互联多站合一建站方案?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  网站专业制作公司有哪些,做一个公司网站要多少钱?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  建站之星会员如何解锁更多建站功能?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  如何快速搭建个人网站并优化SEO?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  网页设计网站制作软件,microsoft office哪个可以创建网页?  如何通过虚拟主机快速搭建个人网站?  如何通过虚拟机搭建网站?详细步骤解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。