1 // ==================== Program Discription =====================
2 // 程序名称:示例12-14 : SocketChannelDemo.java
3 // 程序目的:学习Java NIO#SocketChannel
4 // ==============================================================
5
6
7 import java.nio.ByteBuffer;
8 import java.nio.channels.ServerSocketChannel;
9 import java.nio.channels.SocketChannel;
10 import java.nio.channels.Selector;
11 import java.nio.channels.SelectionKey;
12 import java.nio.channels.SelectableChannel;
13
14 import java.net.Socket;
15 import java.net.ServerSocket;
16 import java.net.InetSocketAddress;
17 import java.util.Iterator;
18
19 public class SocketChannelDemo

20
21 {
22 public static int PORT_NUMBER = 23;//监听端口
23 ServerSocketChannel serverChannel;
24 ServerSocket serverSocket ;
25 Selector selector ;
26 private ByteBuffer buffer = ByteBuffer.allocateDirect (1024);
27
28 public static void main (String [] args)
29 throws Exception
30 {
31 SocketChannelDemo server=new SocketChannelDemo();
32 server.init(args);
33 server.startWork();
34 }
35
36
37 public void init (String [] argv)throws Exception
38 {
39 int port = PORT_NUMBER;
40
41 if (argv.length > 0) {
42 port = Integer.parseInt (argv [0]);
43 }
44
45 System.out.println ("Listening on port " + port);
46
47 // 分配一个ServerSocketChannel
48 serverChannel = ServerSocketChannel.open();
49 // 从ServerSocketChannel里获得一个对应的Socket
50 serverSocket = serverChannel.socket();
51 // 生成一个Selector
52 selector = Selector.open();
53
54 // 把Socket绑定到端口上
55 serverSocket.bind (new InetSocketAddress (port));
56 //serverChannel为非bolck
57 serverChannel.configureBlocking (false);
58
59 // 通过Selector注册ServerSocetChannel
60 serverChannel.register (selector, SelectionKey.OP_ACCEPT);
61
62 }
63
64 public void startWork()throws Exception

65
66 {
67 while (true) {
68
69 int n = selector.select();//获得IO准备就绪的channel数量
70
71 if (n == 0) {
72 continue; // 没有channel准备就绪,继续执行
73 }
74
75 // 用一个iterator返回Selector的selectedkeys
76 Iterator it = selector.selectedKeys().iterator();
77
78 // 处理每一个SelectionKey
79 while (it.hasNext()) {
80 SelectionKey key = (SelectionKey) it.next();
81
82 // 判断是否有新的连接到达
83 if (key.isAcceptable()) {
84           //返回SelectionKey的ServerSocketChannel
85 ServerSocketChannel server =
(ServerSocketChannel) key.channel();
86 SocketChannel channel = server.accept();
87
88 registerChannel (selector, channel,
89 SelectionKey.OP_READ);
90
91 doWork (channel);
92 }
93
94 // 判断是否有数据在此channel里需要读取
95 if (key.isReadable()) {
96
97 processData (key);
98
99 }
100
101 //删除 selectedkeys
102 it.remove();
103 }
104 }
105 }
106 protected void registerChannel (Selector selector,
107 SelectableChannel channel, int ops)
108 throws Exception
109 {

110 if (channel == null) {
111 return;
112 }
113
114
115 channel.configureBlocking (false);
116
117 channel.register (selector, ops);
118 }
119
120 //处理接收的数据
121 protected void processData (SelectionKey key)
122 throws Exception
123 {
124
125
126 SocketChannel socketChannel = (SocketChannel) key.channel();
127 int count;
128
129 buffer.clear(); // 清空buffer
130
131 // 读取所有的数据
132 while ((count = socketChannel.read (buffer)) > 0) {
133 buffer.flip();
134
135 // send the data, don′t assume it goes all at once
136 while (buffer.hasRemaining())
137 {
138 //如果收到回车键,则在返回的字符前增加[echo]$字样
139 if(buffer.get()==(char)13)
140 {
141 buffer.clear();
142 buffer.put("[echo]___FCKpd___0quot;.getBytes());
143 buffer.flip();
144
145 }
146 socketChannel.write (buffer);//在Socket里写数据
147 }
148
149 buffer.clear(); // 清空buffer
150 }
151
152 if (count < 0) {
153 // count<0,说明已经读取完毕
154 socketChannel.close();

155 }
156 }
157
158
159 private void doWork (SocketChannel channel)throws Exception
160 {
161 buffer.clear();
162 buffer.put ("
Hello,I am working,please input some thing,and i will echo to you!
[echo]
___FCKpd___0quot;.getBytes());
163 buffer.flip();
164 channel.write (buffer);
165 }
166
167 }

比较经典的例子

http://www.99inf.net/SoftwareDev/Java/52005.htm

转载于:https://www.cnblogs.com/liaomin416100569/archive/2010/03/25/9331908.html

ServerSocketChannel的使用例子相关推荐

  1. Java NIO系列教程(九) ServerSocketChannel

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

  2. java的io和nio例子

    1.基于tcp的io阻塞式线程io的线程版本 一个服务器端一般都需要同时为多个客户端提供通讯,如果需要同时支持多个客户端,则必须使用前面介绍的线程的概念.简单来说,也就是当服务器端接收到一个连接时,启 ...

  3. 仿照jetty的nio原理写了个例子

    看了好些天的nio和jetty源码,写了个例子. 太晚了,先直接贴代码了,注释不是很全. [color=darkred]更新了代码的解释和2个疑问在最下面[/color] package com.da ...

  4. Netty5的例子,简单介绍Netty的用法

    转自:http://blog.csdn.net/tjbsl/article/details/51038947 这是一个netty快速入门的例子,也是我的学习笔记,比较简单,翻译于官方的文档整理后把所有 ...

  5. Android开发使用ServerSocket ServerSocketChannel DatagramSocket进行TCP UDP通信 实现服务器与APP消息推送

    前言 在日常开发中采用Http协议进行数据传输的情况非常多,但这都是APP主动请求服务端,将数据传到服务器或者从服务器下载数据:那么如果我们想服务器主动联系我们或者我们频繁的上报消息给服务器,怎么弄呢 ...

  6. java reactor模式例子_回顾 Reactor 模式

    Reactor 作为网络编程库的核心模式的 Reactor 模式是网络编程中的最常用的模式,反应器 Reactor 又名分派器 Dispatcher, 或通知器 Notifier, 重温一下 POSA ...

  7. 高斯回归过程应用例子

    假设现在已经观察到了6个样本点,x为样本点特征(一维的),y为样本输出值. 现在新来了一个样本点,要求是用高斯回归过程来预测新来样本点的输出值.这些样本点显示如下; 其中前面6个点是已知输出值的训练样 ...

  8. 语义网所谓的“本体”的具体例子是什么?人工智能

    作者:王喆 链接:https://www.zhihu.com/question/19558514/answer/26323766 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  9. pytorch记录:seq2seq例子看看这torch怎么玩的

    https://blog.csdn.net/nockinonheavensdoor/article/details/82320580 先看看简单例子: import torch import torc ...

最新文章

  1. 读懂深度迁移学习,看这文就够了 | 赠书
  2. foreach迭代ArrayList时,真的不能删除元素吗?
  3. ffmpeg硬解码视频文件播放器
  4. 一些Cloud for Customer的客户需求
  5. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例
  6. python自动备份手机_python实现自动备份windows应用数据
  7. 文档服务器备份吗,本地资料和云服务器备份吗
  8. 设计模式,你知道什么是Observer模式吗?
  9. Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序。。
  10. 【通信电子电路】谐振功率放大电路multisim仿真
  11. 电脑上有哪些特别好用的小工具?盘点4个PC工具,个个都精品
  12. NGUI学习笔记(四).Sprite的Sliced类型与解决拉伸模糊的问题
  13. 使用微信支付接口生成支付二维码
  14. 微星 GL62M 7RD SSD+HDD双硬盘 安装双系统(win10+ubuntu 16.04)
  15. ESP32接入米家-小爱同学-IDF环境-巴法平台
  16. dns114.114.114..114
  17. 2020年 初赛真题
  18. VMware虚拟机使用虚拟机网络编辑器NAT模式配置网络图文教程,实现联网功能并测试
  19. 简单的ps去掉图片上不想留的文字
  20. js页面跳转 和 js打开新窗口 方法

热门文章

  1. [周榜单]极乐小程序榜单(第十一期)
  2. sql 通过游标 拆分xml结构
  3. 营销再好终归还要产品说话,留给大神X7的时间不多了
  4. Multiavatar 多元文化头像生成器
  5. Apache Hudi 是Uber 大数据存储系统
  6. Grafana 系统可视化监控
  7. Android 开发工具集合 - (Android Dev Tools)
  8. android stl,Android NDK中的c++ STL
  9. qt调用import sys库_QTCreator调用动态库实例
  10. 时间序列分析python课程论文_python时间序列分析