Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
/** * Created by LiuHuiChao on 2016/11/15. * description:based on TCP/IP+NIO to deliver the message */ public class TCP_IP_NIO { @Test public void clientStart() throws IOException { SocketChannel channel=SocketChannel.open(); channel.configureBlocking(false);//设置为非阻塞方式 SocketAddress remote=new InetSocketAddress("127.0.0.1",8888); channel.connect(remote); Selector selector= Selector.open(); channel.register(selector, SelectionKey.OP_CONNECT); /**阻塞至有感兴趣的IO事件发生,或到达超时时间,如果希望一直等至有感兴趣的IO事件发生,可调用无参数select方法, * 如果希望不阻塞直接返回目前是否有感兴趣的事件发生,可以调用selectNow方法 * */ int nkeys=selector.select();//如果nkeys大于0,说明有感兴趣的IO事件发生 SelectionKey selectionKey=null; if(nkeys>0){ Set<SelectionKey> keys=selector.selectedKeys(); for(SelectionKey key : keys){ //对于发生连接的事件 if(key.isConnectable()){ SocketChannel sc= (SocketChannel) key.channel(); sc.configureBlocking(false); /**注册感兴趣的IO读事件,通常不直接注册写事件,在发送缓冲区未满的情况下,一直是可写的, * 因此,如注册了写事件,而又不用写数据,很容易造成CUP消耗100%的情况; * */ selectionKey=sc.register(selector,SelectionKey.OP_READ); sc.finishConnect(); }else if(key.isReadable()){/**有流可读*/ ByteBuffer byteBuffer=ByteBuffer.allocate(1024); SocketChannel sc= (SocketChannel) key.channel(); int readBytes=0; try{ int ret=0; try{ /**读取目前可读的流,sc.read返回的为成功复制到bytebuffer中的字节数; * 此步骤为阻塞操作,值可能为0;当已经是流的结尾时,返回-1 * */ while((ret=sc.read(byteBuffer))>0){ readBytes+=ret; } }finally{ byteBuffer.flip(); } }finally{ if(byteBuffer!=null){ byteBuffer.clear(); } } }else if(key.isWritable()){/**可写入流*/ //取消对OP_WRITE事件的注册 key.interestOps(key.interestOps()&(~selectionKey.OP_WRITE)); SocketChannel sc= (SocketChannel) key.channel(); /**此步骤为阻塞操作,直到写入操作系统发送缓冲区或网路IO出现异常,返回的为成功写入的字节数,当操作系统的发送缓冲区已满,此处返回0*/ ByteBuffer byteBuffer=ByteBuffer.allocate(1024); sc.read(byteBuffer); int writtenedSize=sc.write(byteBuffer); //如未写入,则继续注册感兴趣的OP_WRITE事件 if(writtenedSize==0){ key.interestOps(key.interestOps() | selectionKey.OP_WRITE); } } } selector.selectedKeys().clear(); } } @Test public void serverStart() throws IOException { ServerSocketChannel ssc=ServerSocketChannel.open(); ServerSocket serverSocket=ssc.socket(); //绑定要监听的端口 serverSocket.bind(new InetSocketAddress(8888)); ssc.configureBlocking(false); Selector selector= Selector.open(); //注册感兴趣的事件连接 ssc.register(selector,SelectionKey.OP_ACCEPT); /** * 之后采取和客户端相同的方式对selector.select进行轮询。。。但是要增加一个key.isAcceptable的处理。。。 * */ } }
Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)的更多相关文章
- Java——基于java自身包实现消息系统间的通信(TCP/IP+BIO)
最近看到阿里的一位童鞋写的一本关于分布式的书,感觉不错,准备把这本书上基础的代码都写一写. /** * Created by LiuHuiChao on 2016/11/15. * descripti ...
- Java多线程之线程的状态以及线程间协作通信导致的线程状态转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html 一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...
- 《Wireshark数据包分析实战》 - http背后,tcp/ip抓包分析
作为网络开发人员,使用fiddler无疑是最好的选择,方便易用功能强. 但是什么作为爱学习的同学,是不应该止步于http协议的,学习wireshark则可以满足这方面的需求.wireshark作为抓取 ...
- Java基于SSM的个人博客系统(源码 包含前后台)
@ 目录 系统简介 系统运行截图 核心代码 写在最后 系统简介 技术点:Java.JSP.SSM框架,实现了个人博客系统 用户角色分为:普通用户.管理员.系统管理员 功能:发博客.博客分类.博客删除. ...
- Java并发读书笔记:如何实现线程间正确通信
目录 一.synchronized 与 volatile 二.等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 三.等待通知典型 生产者消费者模型 ...
- Java通过wait()和notifyAll()方法实现线程间的通信
Java代码(使用了2个内部类): package Threads; import java.util.LinkedList; /** * Created by Frank */ public cla ...
- Java核心知识点学习----多线程并发之线程间的通信,notify,wait
1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...
- 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】
基于Java自身包实现消息方式的系统间通信的方式有:TCP/IP+BIO,TCP/IP+NIO,UDP/IP+BIO,UDP/IP+NIO.下面就这4种类型一一做个详细的介绍: 一.TCP/IP+BI ...
- Java与C++进行系统间交互:Protocol Buffer
在一次项目中,因笔者负责的java端应用需要与公司C++系统进行交互,公司选定Protocol Buffer方案,故简单的了解一下 有需要的可以看一下其他作者的文章,了解一下Protobuf: htt ...
随机推荐
- Math Summary 数论总结
一.素数 Miller-Rabin 首先介绍一下伪素数:若n是一个正整数,且存在正整数a满足$a^{n-1}\equiv1\;(mod\;n)$ (费马小定理,但n不一定为素数) 那么我们说n是基于a ...
- python中的类(二)
python中的类(二) 六.类的成员 字段:普通字段,静态字段 eg: class Province(): country=’中国’ #静态字段,保存在类中,执行时可以通过类或对象访问 def __ ...
- 【react】慕课网视频学习笔记
1.JSX:语法糖,对语言的功能并没有影响,但更方便程序员使用,增强可读性. 2.jsFiddle:前端在线调试工具 3.为什么要把this额外声明成_self变量,因为window.setTimeo ...
- C#网络Socket编程
1.什么是Socket Sockets 是一种进程通信机制,是一个通信链的句柄(其实就是两个程序通信用的) 2.分类 流式套接字(SOCK_STREAM):提供了一种可靠的.面向连接的双向数据传输服务 ...
- 使用arcpy替换栅格数据异常
使用arcpy替换mxd中的栅格图层数据源时,发现导出的图片异常. 修改代码把修改后的mxd保存后发现修改后的数据源不是我传入参数的数据源 比如我设置的参数是 “2019_3_2_2f8091e2d4 ...
- unordered_map 遇到 vector subscript out of range 的错误提示
错误类型 当调用unordered_map的函数的时候,会出现如下问题: 使用linux运行则会提示 float exeption(core dump) 原因 遇到vector subscript o ...
- 区别Lua模式匹配中 %a+ 与 .-
匹配单词与匹配字符 > print(string.gsub("hello!zzy","%a+","tina"))tina!tina ...
- linux--yum源,源码包
一.企业版 搜狐:http://mirrors.sohu.com/ 网易:http://mirrors.163.com/ 阿里云:http://mirrors.aliyun.com/ 腾讯:http: ...
- Unity-iPhone has Conflicting Provisioning Settings
Select the top level node called Unity-iPhone in the left tree view (the one with the blue item). Se ...
- MySQL案例04:Cause: java.sql.SQLException: Could not retrieve transaction read-only status from server
今天同事发现程序日志有异常抛出,询问原因,进过排查发现与java的连接参数有关系,具体处理过程如下: 一.错误信息 "message": "\n### Error upd ...