Java异步通信
服务器端:
import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.util.Iterator; public class TCPServer { protected Selector selector; protected Charset charset = Charset.forName("UTF-8"); protected CharsetEncoder charsetEncoder = charset.newEncoder(); protected CharsetDecoder charsetDecoder = charset.newDecoder(); int count = 1; /** * @throws Exception */ public TCPServer() throws Exception{ this(8888); } /** * @param port * @throws Exception */ public TCPServer(int port) throws Exception { selector = Selector.open(); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(port)); // port ssc.configureBlocking(false); ssc.register(selector, SelectionKey.OP_ACCEPT);// register while (true) { // selector 线程。select() 会阻塞,直到有客户端连接,或者有消息读入 selector.select(); Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); iterator.remove(); // 删除此消息 // 并在当前线程内处理 handleSelectionKey(selectionKey); } } } /** * @param selectionKey * @throws Exception */ public void handleSelectionKey(SelectionKey selectionKey) throws Exception { if (selectionKey.isAcceptable()) { ServerSocketChannel ssc = (ServerSocketChannel) selectionKey.channel(); SocketChannel socketChannel = ssc.accept(); socketChannel.configureBlocking(false); Socket socket = socketChannel.socket(); // 立即注册一个 OP_READ 的SelectionKey, 接收客户端的消息 SelectionKey key = socketChannel.register(selector,SelectionKey.OP_READ); SocketAddress clientInfo = socket.getRemoteSocketAddress(); key.attach("第 " + (count++) + " 个客户端 [" + clientInfo + "]"); // 打印 println(key.attachment() + " 连接成功"); } else if (selectionKey.isReadable()) { // 有消息进来 ByteBuffer byteBuffer = ByteBuffer.allocate(100); SocketChannel sc = (SocketChannel) selectionKey.channel(); try { int len = sc.read(byteBuffer); // 如果len>0,表示有输入。如果len==0, 表示输入结束。需要关闭 socketChannel if (len > 0) { byteBuffer.flip(); String msg = charsetDecoder.decode(byteBuffer).toString(); println(selectionKey.attachment() + " :" + msg); // 根据客户端的消息,查找到对应的输出 String newMsg = "****************"; ByteBuffer bt = charsetEncoder.encode(CharBuffer.wrap(newMsg + "\n")); sc.write(bt); } else { // 输入结束,关闭 socketChannel println(selectionKey.attachment()+ " 已关闭连接"); sc.close(); } } catch (Exception e) { // 如果read抛出异常,表示连接异常中断,需要关闭 socketChannel e.printStackTrace(); sc.close(); } } else if (selectionKey.isWritable()) { println("TODO: isWritable()"); } else if (selectionKey.isConnectable()) { println("TODO: isConnectable()"); } else { println("TODO: else"); } } /** * @param object */ public static void println(Object object) { System.out.println(object); } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { new TCPServer(); } }
客户端:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.io.InputStream; public class TCPClient extends Thread { public void run() { try { Socket socket = new Socket("127.0.0.1", 8888); OutputStream ous = socket.getOutputStream(); InputStream ins = socket.getInputStream(); BufferedReader r = new BufferedReader(new InputStreamReader(ins, "UTF-8")); // 发送服务器 ous.write(">>>>>>>>>>>>>>>>".getBytes("UTF-8")); ous.flush(); // 接收给服务器 System.out.println(">>>> " + r.readLine()); // 发送服务器 ous.write("<<<<<<<<<<<<<<<<".getBytes("UTF-8")); ous.flush(); // 接收服务器 System.out.println(">>>> " + r.readLine()); Thread.sleep(3*1000); ins.close(); ous.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { for (int i = 0; i < 3; i++) { try { new TCPClient().start(); } catch (Exception e) { e.printStackTrace(); } } } }
Java异步通信的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- JAVA NIO 类库的异步通信框架netty和mina
Netty 和 Mina 我究竟该选择哪个? 根据我的经验,无论选择哪个,都是个正确的选择.两者各有千秋,Netty 在内存管理方面更胜一筹,综合性能也更优.但是,API 变更的管理和兼容性做的不是太 ...
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...
- c#与JAVA利用SOCKET实现异步通信的SanNiuSignal.DLL已开源
大家好,前段时间C#的SanNiuSignal.DLL已开源;因部分用户特需要JAVA版的SanNiuSignal;现在只能把半成品先拿出来暂时给他们用了,以后再慢慢改进; JAVA版目前已实现跟C# ...
- Java基础知识强化之网络编程笔记24:Android网络通信之 AndroidAsync(基于nio的异步通信库)
1. AndroidAsync AndroidAsync 是一个基于nio的异步socket ,http(客户端服务器端),websocket,socket.io库,AndroidAsync 是一 ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 【历史】JavaScript和Java没啥关系!————JavaScript简史
文章的开始先上张图: 图片拍摄自北京图书大厦,代表着现在国内应该是绝大部分书店的现状--Javascript书籍放在Java类当中.甚至很多业内人也一直认为Javascript是Java语言在浏览器内 ...
- 3.开发Java消息驱动bean实例代码
java消息服务(JMS)是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互.应用程序A发送一条消息到消息服务器的某个目的地(Destination),然后消 ...
- JMS(Java消息服务)入门教程
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...
随机推荐
- c# error
部署iis c# 连sqlserver 用IIS发布之后,网页出错.提示为:异常详细信息: System.Data.SqlClient.SqlException: 用户 'NT AUTHORITY\I ...
- 剑指架构师系列-Nginx的安装与使用
Nginx可以干许多事情,在这里我们主要使用Nginx的反向代理与负载均衡功能. 1.Nginx的下载安装 在安装Nginx前需要安装如下软件: GCC Nginx是C写的,需要用GCC编译 PCR ...
- C++笔记007:易犯错误模型——类中为什么需要成员函数
先看源码,在VS2010环境下无法编译通过,在VS2013环境下可以编译通过,并且可以运行,只是运行结果并不是我们期待的结果. 最初通过MyCircle类定义对象c1时,为对象分配内存空间,r没有初始 ...
- JSON 封装函数
var eventUtil = { addHandler:function(element,type,handler) { //添加句柄 if(element.addEventListener) { ...
- ACM KMP 格式输入导致TLE
在写 Oulipo POJ - 3461 时候遇上的奇怪的问题 在格式输入上不一样,提交的时候返回TLE,两段代码如下: A#include<iostream> #include< ...
- Node.js OS 模块
Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模块: var os = require("os") 方法 序号 方法 & 描述 1 os ...
- 百度地图JS 搜索悬浮窗功能
这个需求的效果类似下面的截图,主要还是利用百度地图中自定义控件的功能,挺简单的.文档地址在这 http://lbsyun.baidu.com/index.php?title=jspopular 效果图 ...
- Redis之(一)初识Redis
1.Redis概述 我们知道,内存是电脑主板上的存储部件,用于存储当前正在使用的数据和程序,CPU可以与内存直接沟通,所以访问速速非常高:而外存数据必须加载到内存以后程序才能使用.如果把CPU当做一个 ...
- Connection Reset By Peer 解析
linux网络编程 Connection reset by peer错误服务器向客户端发送了数据,客户端没有接收就关闭了,服务器read就会发生Connection reset by peer错误.我 ...
- Activtiy完全解析(二、layout的inflate过程)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52457893 本文出自:[openXu的博客] 在上一篇文章<Activtiy完全 ...