博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nio 序列化
阅读量:4477 次
发布时间:2019-06-08

本文共 7356 字,大约阅读时间需要 24 分钟。

1.序列化
public class SerializeUtils
{
public byte[] serialize(T t) {
byte[] bytes = null; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = null; try {
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(t); bytes = byteArrayOutputStream.toByteArray(); } catch (IOException e) {
System.out.println("Serialize error"); } finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close(); } catch (IOException e) {
System.out.println("Close ObjectOutputStream error"); } } try {
byteArrayOutputStream.close(); } catch (IOException e) {
System.out.println("Close ObjectOutputStream error"); } } return bytes; } public Object unserialize(byte[] bytes) {
Object object = null; ByteArrayInputStream byteArrayInputStream = null; ObjectInputStream objectInputStream = null; try {
byteArrayInputStream = new ByteArrayInputStream(bytes); objectInputStream = new ObjectInputStream(byteArrayInputStream); object = objectInputStream.readObject(); } catch (Exception e) {
System.out.println("UnSerialize error"); } finally {
if (objectInputStream != null) {
try {
objectInputStream.close(); } catch (IOException e) {
System.out.println("Close ObjectInputStream error"); } } if (byteArrayInputStream != null) {
try {
byteArrayInputStream.close(); } catch (IOException e) {
System.out.println("Close ByteArrayInputStream error"); } } } return object; } }
2.client
public class Client implements Runnable {
private Selector selector; SerializeUtils serializeUtils = new SerializeUtils(); public Client() throws IOException {
SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); selector = Selector.open(); socketChannel.connect(new InetSocketAddress("127.0.0.1", 9128)); socketChannel.register(selector, SelectionKey.OP_CONNECT); } private boolean connect(SelectionKey selectionKey) throws IOException {
SocketChannel socketChannel = (SocketChannel)selectionKey.channel(); socketChannel.configureBlocking(false); if(socketChannel.isConnectionPending()){
socketChannel.finishConnect(); } UserInfo userInfo = new UserInfo(); userInfo.setPassword("12222"); userInfo.setUserName("Joe"); userInfo.setUserId(1L); byte[] arr = serializeUtils.serialize(userInfo); // TLVMessage tlvMessage = new TLVMessage(); // tlvMessage.setType(1); // tlvMessage.setLength(arr.length); // tlvMessage.setValue(arr); // byte[] result = serializeUtils.serialize(tlvMessage); byte[] typeArray = ByteBuffer.allocate(4).putInt(1).array(); byte[] lenArray = ByteBuffer.allocate(4).putInt(arr.length).array(); ByteBuffer byteBuffer = ByteBuffer.allocate(arr.length + 8); byteBuffer.put(typeArray); byteBuffer.put(lenArray); byteBuffer.put(arr); byteBuffer.flip(); socketChannel.write(byteBuffer); System.out.println("write hello"); return true; } @Override public void run() {
while (true){
try {
selector.select(); Iterator
iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()){
SelectionKey selectionKey = iterator.next(); if(selectionKey.isConnectable()){
while(!connect(selectionKey)){
System.out.println("reconnect"); } } iterator.remove(); } } catch (IOException e) {
e.printStackTrace(); } } } public static void main(String[] args) throws IOException {
new Thread(new Client()).start(); } }
3. server
 
public class Server implements Runnable {
private Selector selector; SerializeUtils serializeUtils = new SerializeUtils(); public Server() throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); selector = Selector.open(); serverSocketChannel.bind(new InetSocketAddress(9128)); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); } public void accept(SelectionKey selectionKey) throws IOException {
ServerSocketChannel serverSocketChannel = (ServerSocketChannel)selectionKey.channel(); SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); } public void read(SelectionKey selectionKey) throws IOException {
SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); socketChannel.configureBlocking(false); ByteBuffer typeBuffer = ByteBuffer.allocate(1024); socketChannel.read(typeBuffer); typeBuffer.flip(); byte[] head = new byte[4]; typeBuffer.get(head); ByteBuffer wrap = ByteBuffer.wrap(head); System.out.println(wrap.getInt()); byte[] length = new byte[4]; typeBuffer.get(length); ByteBuffer wrapLen = ByteBuffer.wrap(length); byte[] body = new byte[wrapLen.getInt()]; typeBuffer.get(body); UserInfo userInfo = (UserInfo)serializeUtils.unserialize(body); System.out.println(userInfo.getUserName()); System.out.println("read data from client"); } @Override public void run() {
while(true){
try {
selector.select(); Set
sets = selector.selectedKeys(); Iterator
iterator = sets.iterator(); while (iterator.hasNext()){
SelectionKey selectionKey = iterator.next(); iterator.remove(); if(selectionKey.isAcceptable()){
accept(selectionKey); } if(selectionKey.isReadable()){
read(selectionKey); } } } catch (IOException e) {
e.printStackTrace(); } } } public static void main(String[] args) throws IOException {
new Thread(new Server()).start(); } }
 

 

转载于:https://www.cnblogs.com/sidesky/p/10617454.html

你可能感兴趣的文章
Web应用增加struts2支持
查看>>
java程序——凯撒加密
查看>>
Windows Store App之数据存储
查看>>
English class 82 The Importance of traveling
查看>>
python用递归函数解汉诺塔游戏
查看>>
Redis与Python交互
查看>>
Maximum-SubsequenceSum
查看>>
常用的一些shell变量
查看>>
Android无法删除项目+导入项目报错
查看>>
poj 2349(最小生成树应用)
查看>>
python接口自动化测试二十五:执行所有用例,并生成HTML测试报告
查看>>
c# 指定的存储区提供程序在配置中找不到,或者无效
查看>>
最简陋的python数据
查看>>
第一堂java web课
查看>>
操作系统简介
查看>>
第1周小组博客作业--1703班06组
查看>>
vue项目中icon图标的完美引入
查看>>
C语言指针
查看>>
Java的安装
查看>>
0920 JSON数据 蓝懿
查看>>