一.前言

前篇文章中了解了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时再做详细介绍!

参考

本机ip、127.0.0.1和0.0.0.0区别

ServerSocketChannel简述的更多相关文章

  1. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  2. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  3. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  4. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

  5. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  6. 简述ASP.NET MVC原理

    1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...

  7. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  8. 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part1/ Design Pattern ...

  9. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

随机推荐

  1. Android开发之EditText多行文本输入

    <EditText android:id="@+id/add_content" android:layout_width="fill_parent" an ...

  2. Oracle自定义脱敏函数

    对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名.证件号.地址等等,下面是自定义函数的代码 CREATE OR REPLACE FUNCTION F_GE ...

  3. 利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

    现有需求:将oracle数据库中的数据准实时同步至某ftp服务器中,以便前端应用能定时从ftp服务器目录中取增量数据 方法:将加工脚本写为存储过程,然后利用shell脚本执行该存储过程并将增量数据导出 ...

  4. MySQL读写分离之Proxy

    MySQL Proxy: ======================================================== MySQL_Proxy Master Slave1 Slav ...

  5. MySQL使用alter修改表的结构

    SQL语句     DLL        数据定义语言         create,drop     DML     数据操纵语言         insert,delete,select,upda ...

  6. fiddler深入学习

    参考:https://www.cnblogs.com/zhizhiyin/p/6807649.html http://blog.chinaunix.net/uid-27105712-id-373882 ...

  7. Layer获取iframe的dom元素及调用iframe页的js方法

    1. 父页面点击第一个按钮触发,获取子页面中的body元素,调用子页面中定义的js方法 yes : function(index,layero){ //获取iframe的body元素 var body ...

  8. Sonarqube C#静态代码规范检查(一)

    使用说明 代码规范对于每个开发来说重要也重要,说不重要其实也没那么重要,简单点的vs的code analysis也能提供很多的建议,重量级一点的Resharper不仅能提供建议,还提供了更方便快捷的一 ...

  9. Django 购物车模板

    url from django.contrib import admin from django.urls import path, re_path from django.urls import i ...

  10. java添加新表,接口合成流程必看

    生成代码后 创建模块包 先放入 实体类 然后按照 Controller 改成 然后是 service  后impl 然后是mapper  后xml 然后更新 代码