博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ServerSocketChannel简述
阅读量:6678 次
发布时间:2019-06-25

本文共 2707 字,大约阅读时间需要 9 分钟。

一.前言

前篇文章中了解了SocketChannel:提供了连接到套接字通道,从某种层面而言,NIO中提供了类似于java.net包中对于网络操作的api的功能。既然已经有连接到Socket套接字的通道,可以主动发起连接、传输数据,还缺少接收连接(client端)。不言而喻,还缺少接收连接,接收数据的通道(server端)。这篇文章就主要介绍监听套接字的通道ServerSocketChannel。

二.ServerSocketChannel

A selectable channel for stream-oriented listening sockets.

上述摘自java docs中定义:ServerSocketChannel是面向流的监听socket套接字的可选择性通道。从定义中可以看出以下几点:

  • 具有阻塞和非阻塞两种模式
  • 可以注册到多路复用器上
  • 基于TCP连接
  • 需要绑定到特定端口上

ServerSocketChannel可以被无参的open()方法创建。但是改方法只是创建了一个ServerSocketChannel对象,并没有进行绑定操作,仍需要调用bind()方法进行绑定,使之监听某个套接字。未进行绑定的ServerSocketChannel调用accept(),将会抛出NotYetBoundException异常。

ServerSocketChannel支持的可选参数:

参数名 作用描述
SO_RCVBUF 套接字接收缓冲区大小
SO_REUSEADDR 重新使用地址

ServerSocketChannel支持两种模式:阻塞模式和非阻塞模式。且是线程安全的

三.ServerSocketChannel使用

1.创建ServerSocketChannel
ServerSocketChannel channel = ServerSocketChannel.open();  //创建ServerSocketChannel
2.绑定到本机网络接口
channel.bind(new InetSocketAddress(8091));  //绑定至8091端口
3.接收连接
SocketChannel socketChannel = channel.accept();

ServerSocketChannel的accept方法返回SocketChannel套接字通道,用于读取请求数据和写入响应数据。

ServerSocketChannel的阻塞和非阻塞体现在这里:

  • 阻塞模式:在调用accept方法后,将阻塞知道有新的socket连接时返回SocketChannel对象,代表新建立的套接字通道。
  • 非阻塞模式:在调用accept方法后,如果无连接建立,则返回null;如果有连接,则返回SocketChannel。

四.简单的client-server

创建简单的server:

public void createServerSocketChannel() throws IOException {    ServerSocketChannel channel = ServerSocketChannel.open();    channel.bind(new InetSocketAddress(8091));    while (true) {        SocketChannel socketChannel = channel.accept();        ByteBuffer byteBuffer = ByteBuffer.allocate(16);        int count = socketChannel.read(byteBuffer);        while(count != -1) {            byteBuffer.flip();             while (byteBuffer.hasRemaining()) {                 System.out.print((char) byteBuffer.get());             }             byteBuffer.clear();            count = socketChannel.read(byteBuffer);        }        System.out.println();    }}

创建简单client:

public void client() throws IOException {    SocketChannel socketChannel = SocketChannel.open(        new InetSocketAddress("10.17.83.11", 8091));    String msg = "ok";    socketChannel.write(ByteBuffer.wrap(msg.getBytes()));    SocketChannel socketChannel3 = SocketChannel.open(        new InetSocketAddress(8091));    socketChannel3.write(ByteBuffer.wrap(msg.getBytes()));    System.out.println("s3");    SocketChannel socketChannel4 = SocketChannel.open(        new InetSocketAddress(8091));    socketChannel4.write(ByteBuffer.wrap(msg.getBytes()));    System.out.println("s4");    socketChannel4.close();    socketChannel3.close();    socketChannel.close();}

ServerSocketChannel基本上不会单独使用绝大多数情况下都是配合多路复用Selector选择器共同使用。这里只关注ServerSocketChannel本身,关于其与多路复用混合使用,后面再介绍Selector时再做详细介绍!

参考

转载于:https://www.cnblogs.com/lxyit/p/9224248.html

你可能感兴趣的文章
express如何使用session与cookie
查看>>
react技术栈
查看>>
面向对象的JavaScript(如何一步步成为js高手)
查看>>
Java+MySQL实现附近功能
查看>>
一篇文章带你理解闭包
查看>>
angularJS开发的注意事项汇总
查看>>
Android权限列表
查看>>
Sass基础
查看>>
Spring Cloud(五)断路器监控(Hystrix Dashboard)
查看>>
Webpack3简单入门2
查看>>
Springmvc+mybatis+restful+bootstrap框架整合
查看>>
[译]集群调度架构的变革 (三)
查看>>
JavaScript设计模式与开发实践 - 观察者模式
查看>>
node学习
查看>>
sublime当中创建自定义代码段
查看>>
【前端学习】-margin
查看>>
GitChat · 架构 | 从订单中心开始,聊“多KEY”类业务数据库水平切分架构实践...
查看>>
前端每周清单第 28 期:JS 运行原理与优化,高性能 CSS 引擎,Coursera GraphQL 实践...
查看>>
lombok的使用
查看>>
Ubuntu+phpstorm+firefox+xdebug的配置
查看>>