java socket nio编程
上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下...
- public class TimeServer {
- public static void main(String[] args) {
- MultipexerTimeServer timersServer=new MultipexerTimeServer("192.168.1.102", 8400);
- new Thread(timersServer, "nio-多路复用器").start();
- }
- }
- public class MultipexerTimeServer implements Runnable {
- private Selector selector;
- private ServerSocketChannel serverSocketChannel;
- private volatile boolean stop;
- public MultipexerTimeServer(String addr,int point){
- try {
- selector=Selector.open();
- serverSocketChannel=ServerSocketChannel.open();
- serverSocketChannel.socket().bind(new InetSocketAddress(addr, point));
- serverSocketChannel.configureBlocking(false);
- serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
- System.out.println("socket服务端:"+serverSocketChannel.socket().getInetAddress()+":"+serverSocketChannel.socket().getLocalPort()+"");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- public void stop(){
- this.stop=true;
- }
- @Override
- public void run() {
- while(!stop){
- try {
- selector.select(1000);
- Set<SelectionKey> selectionKeys=selector.selectedKeys();
- if(selectionKeys !=null && selectionKeys.size()>0){
- Iterator<SelectionKey> it=selectionKeys.iterator();
- SelectionKey key=null;
- while(it.hasNext()){
- key=it.next();
- it.remove();
- try {
- handleInput(key);
- } catch (Exception e) {
- if(key!=null){
- key.cancel();
- if(key.channel()!=null){
- try {
- key.channel().close();
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- }
- }
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- if(selector!=null){
- try {
- selector.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- private void handleInput(SelectionKey key) throws IOException{
- if(key.isValid()){
- //处理新接入的请求
- if(key.isAcceptable()){
- ServerSocketChannel ssc=(ServerSocketChannel)key.channel();
- SocketChannel sc=ssc.accept();
- sc.configureBlocking(false);
- sc.register(selector,SelectionKey.OP_READ);
- SocketAddress clientAddress =sc.getRemoteAddress();
- System.out.println("socket链接新客户端:" + clientAddress);
- }
- if(key.isReadable()){
- //读取数据
- SocketChannel sc=(SocketChannel)key.channel();
- ByteBuffer readBuffer=ByteBuffer.allocate(1024);
- int readBytes=sc.read(readBuffer);
- if(readBytes>0){
- readBuffer.flip();
- byte[] bytes=new byte[readBuffer.remaining()];
- readBuffer.get(bytes);
- String body=new String(bytes, Charset.forName("GBK"));
- SocketAddress clientAddress =sc.getRemoteAddress();
- System.out.println("socket链接老客户端:" + clientAddress);
- System.out.println("服务器接收数据:"+body);
- //然后回写点数据给客服端
- SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String time=dateFormat.format(new Date());
- String res="来自与服务端的回应,时间:"+ time;
- doWrite(sc,res);
- }else if(readBytes<0){
- key.cancel();
- sc.close();
- }else{
- //System.out.println("服务器收到0字节数据...");
- }
- }
- }
- }
- private void doWrite(SocketChannel sc,String res) throws IOException{
- if(res!=null && res.trim().length()>0){
- byte[] bytes=res.getBytes();
- ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
- byteBuffer.put(bytes);
- byteBuffer.flip();
- sc.write(byteBuffer);
- }
- }
代码不想解释太多,有空整理一下nio的基本概念...
java socket nio编程的更多相关文章
- Java Socket 网络编程心跳设计概念
Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...
- Java Socket网络编程的经典例子(转)
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作.Socket ...
- java之NIO编程
所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义. 本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识. ...
- Java Socket NIO入门
Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...
- Java Socket网络编程Server端详解
Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网 ...
- 【Socket】Java Socket基础编程
Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...
- Java Socket网络编程学习笔记(一)
0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...
- Java Socket NIO详解(转)
java选择器(Selector)是用来干嘛的? 2009-01-12 22:21jsptdut | 分类:JAVA相关 | 浏览8901次 如题,不要贴api的,上面的写的我看不懂希望大家能给我个通 ...
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...
随机推荐
- MySQL的 inner join on 与 left join on
WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接.INNER JOIN……ON子句产生的连接称为显性连接. inner join:理解为“有效连接”,两张表中都有的数据才会显示left ...
- 第七章 探秘Qt的核心机制-信号与槽
第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...
- simple_factory
#include <stdlib.h> #include <iostream> using namespace std; class Product { public: vir ...
- js自运行函数
学习闭包的基础知识: 函数声明 function fn(){ //这里是代码 }; fn(); //运行fn函数 与上面等价 var fn = function(){ //这里是代码 } fn(); ...
- sersync 实时同步工具
出处:http://code.google.com/p/sersync/ 当前版本的sersync依赖于rsync进行同步.如下图所示,在同步主服务器上开启sersync,将监控路径中的文件同步到目标 ...
- php取整的几种方法
php取整的几种方式. floor 舍去法取整 语法格式:float floor ( float value )返回不大于value 的下一个整数,将value 的小数部分舍去取整.floor() 返 ...
- Python 基础篇:介绍
1. Python 发展 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Cir ...
- IIs上MP4、及SVG格式加载失败解决方式
部署项目是遇到网页播放mp4文件时候,MP4文件不能加载的问题.那是因为IIS上MIME类型中没有添加MP4的格式,添加一下即可. 解决方案: 1.在IIS上选中你的网站,然后点击右边的MIME类型, ...
- grunt项目配置
安装完CLI,还要在项目安装Grunt npm install -g grunt-cli npm install grunt --save-dev 源码放在src下 package.json放在根目录 ...
- DB天气app冲刺第十天
好了 这是第十天了,按照白板任务上的来说的话,今天没有完成,所以等一下还要继续看看今天能不能把他做完,今天出的问题在于我又自己调整了一下UI设计,因为发现以前的设计发面有重复,浪费了屏幕.所以还不如省 ...