From 7561cc8b647006fe4637ea8bd91f9699be363e8e Mon Sep 17 00:00:00 2001 From: 杜云山 <870666625@qq.com> Date: Fri, 5 Mar 2021 15:52:06 +0800 Subject: [PATCH] feat: 完成一个 --- src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java | 32 ++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/base/AeroflexDataBuffer.java | 27 +++++++++++++++++++++++++++ src/main/java/com/example/mina/base/Entry.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/base/HardwareDataBuffer.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/box1/Box1Decoder.java | 9 +++++++++ src/main/java/com/example/mina/box1/Box1Encoder.java | 9 +++++++++ src/main/java/com/example/mina/box1/Box1Handler.java | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/config/Box1Configuration.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/config/Box2Configuration.java | 9 +++++++++ src/main/java/com/example/mina/config/ConfigMina.java | 97 ------------------------------------------------------------------------------------------------- src/main/java/com/example/mina/config/SecurityConfig.java | 27 --------------------------- src/main/java/com/example/mina/controller/RouterController.java | 41 ----------------------------------------- src/main/java/com/example/mina/entity/AttenuationVO.java | 9 +++++++++ src/main/java/com/example/mina/entity/Message.java | 9 +++++++++ src/main/java/com/example/mina/http/HttpSimulator.java | 136 ---------------------------------------------------------------------------------------------------------------------------------------- src/main/java/com/example/mina/mina/client/MinaClient.java | 40 ---------------------------------------- src/main/java/com/example/mina/mina/client/MinaClientHandler.java | 39 --------------------------------------- src/main/java/com/example/mina/mina/code/ByteDecoder.java | 29 ----------------------------- src/main/java/com/example/mina/mina/code/ByteEnCoder.java | 37 ------------------------------------- src/main/java/com/example/mina/mina/code/ByteFactory.java | 34 ---------------------------------- src/main/java/com/example/mina/mina/server/MinaServer.java | 92 -------------------------------------------------------------------------------------------- src/main/java/com/example/mina/mina/server/MinaServerHandler.java | 141 --------------------------------------------------------------------------------------------------------------------------------------------- src/main/java/com/example/mina/util/StrUtil.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 23 files changed, 511 insertions(+), 713 deletions(-) create mode 100644 src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java create mode 100644 src/main/java/com/example/mina/base/AeroflexDataBuffer.java create mode 100644 src/main/java/com/example/mina/base/Entry.java create mode 100644 src/main/java/com/example/mina/base/HardwareDataBuffer.java create mode 100644 src/main/java/com/example/mina/box1/Box1Decoder.java create mode 100644 src/main/java/com/example/mina/box1/Box1Encoder.java create mode 100644 src/main/java/com/example/mina/box1/Box1Handler.java create mode 100644 src/main/java/com/example/mina/config/Box1Configuration.java create mode 100644 src/main/java/com/example/mina/config/Box2Configuration.java delete mode 100644 src/main/java/com/example/mina/config/ConfigMina.java delete mode 100644 src/main/java/com/example/mina/config/SecurityConfig.java delete mode 100644 src/main/java/com/example/mina/controller/RouterController.java create mode 100644 src/main/java/com/example/mina/entity/AttenuationVO.java create mode 100644 src/main/java/com/example/mina/entity/Message.java delete mode 100644 src/main/java/com/example/mina/http/HttpSimulator.java delete mode 100644 src/main/java/com/example/mina/mina/client/MinaClient.java delete mode 100644 src/main/java/com/example/mina/mina/client/MinaClientHandler.java delete mode 100644 src/main/java/com/example/mina/mina/code/ByteDecoder.java delete mode 100644 src/main/java/com/example/mina/mina/code/ByteEnCoder.java delete mode 100644 src/main/java/com/example/mina/mina/code/ByteFactory.java delete mode 100644 src/main/java/com/example/mina/mina/server/MinaServer.java delete mode 100644 src/main/java/com/example/mina/mina/server/MinaServerHandler.java create mode 100644 src/main/java/com/example/mina/util/StrUtil.java diff --git a/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java b/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java new file mode 100644 index 0000000..6758f92 --- /dev/null +++ b/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java @@ -0,0 +1,32 @@ +package com.example.mina.base; + +import org.apache.mina.core.service.IoHandlerAdapter; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +public abstract class AbstractVirtualBoxHandler extends IoHandlerAdapter { + + /** + * 存储衰减值的矩阵 + */ + protected int[][] matrix; + + protected int type; + + protected int row = 10; + + protected int maxAttenuate = 99; + + /** + * 初始化矩阵以及该设备的一些参数 + */ + protected abstract void initMatrix(); + + /** + * 处理消息 + */ + protected abstract void handleMessage(); + +} diff --git a/src/main/java/com/example/mina/base/AeroflexDataBuffer.java b/src/main/java/com/example/mina/base/AeroflexDataBuffer.java new file mode 100644 index 0000000..89a46f2 --- /dev/null +++ b/src/main/java/com/example/mina/base/AeroflexDataBuffer.java @@ -0,0 +1,27 @@ +package com.example.mina.base; + +/** + * @author 杜云山 + * @date 2021/03/05 + */ +public class AeroflexDataBuffer extends HardwareDataBuffer { + + public AeroflexDataBuffer(int row, int maxAtten) { + super(row, row, row, maxAtten); + + matrix_data = new Entry[row][row]; + offset_data = new Entry[row]; + + for (int i = 0; i < row; i++) { + for (int k = 0; k < row; k++) { + matrix_data[i][k] = new Entry(i, k, "kk", maxAtten, false); + } + } + + for (int i = 0; i < row; i++) { + offset_data[i] = new Entry(i, 0, "rr", maxAtten, false); + } + + } + +} diff --git a/src/main/java/com/example/mina/base/Entry.java b/src/main/java/com/example/mina/base/Entry.java new file mode 100644 index 0000000..b87c3e5 --- /dev/null +++ b/src/main/java/com/example/mina/base/Entry.java @@ -0,0 +1,60 @@ +package com.example.mina.base; + +/** + * @author 杜云山 + * @date 2021/03/05 + */ +public class Entry { + + private final int row; + + private final int col; + + private final String name; + + private int value; + + private final boolean booked; + + private final long timestamp; + + public static final Entry EMPTY = new Entry(0, 0, null, 0, false); + + public Entry(int row, int col, String name, int value, boolean booked) { + this.row = row; + this.col = col; + this.name = name; + this.value = value; + this.booked = booked; + this.timestamp = System.nanoTime(); + } + + public int getRow() { + return row; + } + + public int getCol() { + return col; + } + + public String getName() { + return name; + } + + public int getValue() { + return value; + } + + public boolean isBooked() { + return booked; + } + + public void setValue(int v) { + this.value = v; + } + + public long getTimestamp() { + return this.timestamp; + } + +} diff --git a/src/main/java/com/example/mina/base/HardwareDataBuffer.java b/src/main/java/com/example/mina/base/HardwareDataBuffer.java new file mode 100644 index 0000000..a7ce176 --- /dev/null +++ b/src/main/java/com/example/mina/base/HardwareDataBuffer.java @@ -0,0 +1,86 @@ +package com.example.mina.base; + +public class HardwareDataBuffer { + + protected int maxRow; + protected int maxCol; + protected int maxOffset; + + protected int maxAtten; + + + protected Entry[][] matrix_data; + protected Entry[] offset_data; + + public HardwareDataBuffer() {} + + public HardwareDataBuffer(int row, int col, int offset, int maxAtten){ + this.maxRow = row; + this.maxCol = col; + this.maxOffset = offset; + this.maxAtten = maxAtten; + } + + + /** + * Set cross point attenuation value. Actually that is not correct. + * In case of LTE device, this is a ON/OFF status (0,1) + * + * @param row the row index. *** starts from 1 *** + * @param col the col index. *** starts from 1 *** + * @param val the attenuation value + */ + public synchronized void setAttenuation(int row, int col, int val){ + + if(val != -1 && (row < 1 || row > maxRow || col < 1 || col > maxCol)) { + //Logger.atError().log("HardwareDataBuffer: setAttenuation(int row, int col, int val) " + row + "/" + col + "/" + val); + return; + } + if(val == -1) val = maxAtten; + matrix_data[row - 1][col -1 ] = new Entry(row -1 , col -1 , "rr", val, false);; + } + + + public int getAttenuation(int row, int col){ + return matrix_data[row - 1][col -1 ].getValue(); + } + + public synchronized void setOffset(int row,int val){ + if(row < 1 || row > maxOffset){ + //rfmazeLogger.atError().log("HardwareDataBuffer: setOffset(int row, int val) " + row + "/" + val); + return; + } + offset_data[row - 1] = new Entry(row -1 , 0 , "rr", val, false);; + } + + public int getOffset(int row){ + return offset_data[row - 1].getValue(); + } + + + public Entry[] getOffset_data() { + return offset_data; + } + + public Entry[][] getMatrix_data() { + return matrix_data; + } + + public int getMaxRow(){ + return maxRow; + } + + public int getMaxCol(){ + return maxCol; + } + + public int getMaxOffset() { + return maxOffset; + } + + public int getMaxAtten() { + return maxAtten; + } + + +} diff --git a/src/main/java/com/example/mina/box1/Box1Decoder.java b/src/main/java/com/example/mina/box1/Box1Decoder.java new file mode 100644 index 0000000..20c272c --- /dev/null +++ b/src/main/java/com/example/mina/box1/Box1Decoder.java @@ -0,0 +1,9 @@ +package com.example.mina.box1; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +public class Box1Decoder { + +} diff --git a/src/main/java/com/example/mina/box1/Box1Encoder.java b/src/main/java/com/example/mina/box1/Box1Encoder.java new file mode 100644 index 0000000..a397fc6 --- /dev/null +++ b/src/main/java/com/example/mina/box1/Box1Encoder.java @@ -0,0 +1,9 @@ +package com.example.mina.box1; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +public class Box1Encoder { + +} diff --git a/src/main/java/com/example/mina/box1/Box1Handler.java b/src/main/java/com/example/mina/box1/Box1Handler.java new file mode 100644 index 0000000..8336055 --- /dev/null +++ b/src/main/java/com/example/mina/box1/Box1Handler.java @@ -0,0 +1,139 @@ +package com.example.mina.box1; + +import com.example.mina.base.AbstractVirtualBoxHandler; +import com.example.mina.base.AeroflexDataBuffer; +import com.example.mina.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +@Slf4j +public class Box1Handler extends AbstractVirtualBoxHandler { + + + private static final byte[] ERROR = "ERROR".getBytes(); + + private static final byte[] NONE = "OK".getBytes(); + + private AeroflexDataBuffer dataBuffer; + + public Box1Handler() { + this.initMatrix(); + } + + @Override + protected void initMatrix() { + + int row = 10; + int col = 1; + int maxAtten = 888; + + dataBuffer = new AeroflexDataBuffer(row, maxAtten); + } + + @Override + protected void handleMessage() { + + } + + @Override + public void messageReceived(IoSession session, Object message) { + + IoBuffer ioBuffer = (IoBuffer) message; + byte[] bytes = new byte[ioBuffer.limit()]; + ioBuffer.get(bytes, ioBuffer.position(), ioBuffer.limit()); + + byte[] result = handleCommand(bytes, bytes.length); + + session.write(IoBuffer.wrap(result)); + } + + @Override + public void sessionCreated(IoSession session) { + + log.info("---server session created"); + } + + @Override + public void sessionOpened(IoSession session) { + + log.info("---server session Opened"); + } + + @Override + public void sessionClosed(IoSession session) { + + log.info("---server session Closed"); + } + + @Override + public void messageSent(IoSession session, Object message) { + + log.info("---发送数据成功了。。。{}", message); + } + + + protected byte[] handleCommand(byte[] cmd, int len) { + String command = new String(cmd).trim(); + +// LogUtils.println("AeroflexVirtualBoxService::handleCommand receive : ", command); + + if (command.startsWith("ATTN ALL MAX")) {//set all to max + for (int i = 1; i < dataBuffer.getMaxRow(); i++) { + dataBuffer.setOffset(i, dataBuffer.getMaxAtten()); + } + + return NONE; + } else if (command.startsWith("ATTN?")) {//get + String[] sss = command.split(" "); + if (sss.length >= 2) { +// LogUtils.println(sss[0], sss[1]); + + int row = StrUtil.toInt(sss[1]); + if (row >= 0 && row <= dataBuffer.getMaxRow()) { + String str = String.valueOf(dataBuffer.getOffset(row)); +// LogUtils.println("AeroflexVirtualBoxService::handleCommand return : ", str); + return str.getBytes(); + } + } + + return ERROR; + } else if (command.startsWith("ATTN")) {//Set, Follow by ATTN? +// LogUtils.println("command.startsWith(\"ATTN\")"); + String[] aa = command.split(";"); + +// LogUtils.println(aa[0], aa[1]); + + String[] sss = aa[0].split(" "); + StrUtil.printArray(sss); + + if (sss.length >= 3) { + int row = StrUtil.toInt(sss[1]); + int val = StrUtil.toInt(sss[2]); + + System.out.println(row + "/" + val); + + if (row >= 0 && row <= dataBuffer.getMaxRow()) { + if (val >= 0 && val <= dataBuffer.getMaxAtten()) { + dataBuffer.setOffset(row, val); + + String str = String.valueOf(dataBuffer.getOffset(row)); +// LogUtils.println("handleCommand return =====> ", str); + return str.getBytes(); + } + } + } + + return ERROR; + + } else { + return ERROR; + } + + } + +} diff --git a/src/main/java/com/example/mina/config/Box1Configuration.java b/src/main/java/com/example/mina/config/Box1Configuration.java new file mode 100644 index 0000000..0b13a2a --- /dev/null +++ b/src/main/java/com/example/mina/config/Box1Configuration.java @@ -0,0 +1,48 @@ +package com.example.mina.config; + +import com.example.mina.box1.Box1Handler; +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.core.service.IoAcceptor; +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; +import java.net.InetSocketAddress; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +@Slf4j +@Configuration +public class Box1Configuration { + + /** + * 开启mina的server服务 + */ + @Bean + public IoAcceptor ioAcceptor() throws IOException { + + NioSocketAcceptor acceptor = new NioSocketAcceptor(); + acceptor.setHandler(new Box1Handler()); + acceptor.setReuseAddress(true); + acceptor.bind(new InetSocketAddress(9090)); + + return acceptor; + + } + + @Bean + public IoAcceptor ioAcceptor999() throws IOException { + + NioSocketAcceptor acceptor = new NioSocketAcceptor(); + acceptor.setHandler(new Box1Handler()); + acceptor.setReuseAddress(true); + acceptor.bind(new InetSocketAddress(9999)); + + return acceptor; + + } + +} diff --git a/src/main/java/com/example/mina/config/Box2Configuration.java b/src/main/java/com/example/mina/config/Box2Configuration.java new file mode 100644 index 0000000..8890df0 --- /dev/null +++ b/src/main/java/com/example/mina/config/Box2Configuration.java @@ -0,0 +1,9 @@ +package com.example.mina.config; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +public class Box2Configuration { + +} diff --git a/src/main/java/com/example/mina/config/ConfigMina.java b/src/main/java/com/example/mina/config/ConfigMina.java deleted file mode 100644 index 88248a5..0000000 --- a/src/main/java/com/example/mina/config/ConfigMina.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.example.mina.config; - -import com.example.mina.mina.code.ByteFactory; -import com.example.mina.mina.server.MinaServerHandler; -import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; -import org.apache.mina.core.service.IoAcceptor; -import org.apache.mina.core.session.IdleStatus; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.mina.filter.executor.ExecutorFilter; -import org.apache.mina.filter.logging.LoggingFilter; -import org.apache.mina.transport.socket.nio.NioSocketAcceptor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.io.IOException; -import java.net.InetSocketAddress; - -/** - * @author dy - * @date 2021/3/3 - */ -@Configuration -public class ConfigMina { - - /** - * 配置mina的多线程过滤器 - * - * @return - */ - @Bean - public ExecutorFilter executorFilter() { - //设置初始化线程数,最大线程数 - ExecutorFilter executorFilter = new ExecutorFilter(10, 20); - return executorFilter; - } - - /** - * 配置mina的转码过滤器 - * - * @return - */ - @Bean - public ProtocolCodecFilter protocolCodecFilter() { -// TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), -// LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); - - - //TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); - ProtocolCodecFilter pcf = new ProtocolCodecFilter(new ByteFactory()); - //ProtocolCodecFilter pcf = new ProtocolCodecFilter(factory); - return pcf; - } - - /** - * 配置mina的日志过滤器 - * - * @return - */ - @Bean - public LoggingFilter loggingFilter() { - return new LoggingFilter(); - } - - /** - * 将过滤器注入到mina的链式管理器中 - * - * @return - */ - @Bean - public DefaultIoFilterChainBuilder defaultIoFilterChainBuilder() { - DefaultIoFilterChainBuilder def = new DefaultIoFilterChainBuilder(); - def.addLast("executor", executorFilter()); - def.addLast("logger", loggingFilter()); - def.addLast("protocol", protocolCodecFilter()); - return def; - } - - /** - * 开启mina的server服务,并设置对应的参数 - * - * @return - * @throws IOException - */ - @Bean - public IoAcceptor ioAcceptor() throws IOException { - IoAcceptor nio = new NioSocketAcceptor(); - //设置缓冲区大小 - nio.getSessionConfig().setReadBufferSize(2048); - //设置空闲状态时间,10秒没操作就进入空闲状态 - nio.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); - nio.setFilterChainBuilder(defaultIoFilterChainBuilder()); - nio.setHandler(new MinaServerHandler()); - nio.bind(new InetSocketAddress(9098)); - return nio; - } - -} diff --git a/src/main/java/com/example/mina/config/SecurityConfig.java b/src/main/java/com/example/mina/config/SecurityConfig.java deleted file mode 100644 index e78b952..0000000 --- a/src/main/java/com/example/mina/config/SecurityConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.example.mina.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -/** - * @author dy - * @date 2021/2/25 - */ -@Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - // 首页所有人都可以访问,功能也只有对应有权限的人才能访问到 - // 请求授权的规则 - -// http.authorizeRequests() -// .antMatchers("/").permitAll() -// .antMatchers("/level1/**").hasRole("vip1") -// .antMatchers("/level2/**").hasRole("vip2") -// .antMatchers("/level3/**").hasRole("vip3"); - // 开启自动配置的登录功能 - http.formLogin(); - } -} diff --git a/src/main/java/com/example/mina/controller/RouterController.java b/src/main/java/com/example/mina/controller/RouterController.java deleted file mode 100644 index 45f9a82..0000000 --- a/src/main/java/com/example/mina/controller/RouterController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.mina.controller; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -/** - * @author dy - * @date 2021/2/22 - */ -@Controller -@Slf4j -public class RouterController { - - @GetMapping({"/", "/index"}) - public String index() { - log.info("是否进入程序"); - return "/index"; - } - - @GetMapping("/toLogin") - public String toLogin() { - return "views/login"; - } - - @GetMapping("/level1/{id}") - public String level1(@PathVariable("id") int id) { - return "views/level1/" + id; - } - - @GetMapping("/level2/{id}") - public String level2(@PathVariable("id") int id) { - return "views/level2/" + id; - } - - @GetMapping("/level3/{id}") - public String level3(@PathVariable("id") int id) { - return "views/level3/" + id; - } -} diff --git a/src/main/java/com/example/mina/entity/AttenuationVO.java b/src/main/java/com/example/mina/entity/AttenuationVO.java new file mode 100644 index 0000000..aa7e766 --- /dev/null +++ b/src/main/java/com/example/mina/entity/AttenuationVO.java @@ -0,0 +1,9 @@ +package com.example.mina.entity; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +public class AttenuationVO { + +} diff --git a/src/main/java/com/example/mina/entity/Message.java b/src/main/java/com/example/mina/entity/Message.java new file mode 100644 index 0000000..8f5463a --- /dev/null +++ b/src/main/java/com/example/mina/entity/Message.java @@ -0,0 +1,9 @@ +package com.example.mina.entity; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +public class Message { + +} diff --git a/src/main/java/com/example/mina/http/HttpSimulator.java b/src/main/java/com/example/mina/http/HttpSimulator.java deleted file mode 100644 index 5c9951f..0000000 --- a/src/main/java/com/example/mina/http/HttpSimulator.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.example.mina.http; - -import java.io.*; -import java.net.InetSocketAddress; -import java.net.Socket; - -/** - * @author dy - * @date 2021/3/4 - */ -public class HttpSimulator { - - private Socket socket; - - private int port = 80; - - private String host = "localhost"; - - private String request = ""; // HTTP请求消息 - - private boolean isPost, isHead; - - - public void run() throws Exception { - BufferedReader reader = new BufferedReader(new InputStreamReader( - System.in)); - while (true) // 开始大循环 - { - try { - if (!readHostAndPort(reader)) { - break; - } - readHttpRequest(reader); - sendHttpRequest(); - readHttpResponse(reader); - - } catch (Exception e) { - System.out.println("err:" + e.getMessage()); - - } - - } - - } - - - public static void main(String[] args) throws Exception { - new HttpSimulator().run(); - - } - - private boolean readHostAndPort(BufferedReader consoleReader) - throws Exception { - System.out.print("host:port>"); - String[] ss = null; - String s = consoleReader.readLine(); - if (s.equals("q")) { - return false; - } else { - ss = s.split("[:]"); - if (!ss[0].equals("")) { - host = ss[0]; - } - if (ss.length > 1) { - port = Integer.parseInt(ss[1]); - } - System.out.println(host + ":" + String.valueOf(port)); - return true; - } - } - - private void readHttpRequest(BufferedReader consoleReader) - throws Exception { - System.out.println("请输入HTTP请求:"); - String s = consoleReader.readLine(); - request = s + "\r\n"; - boolean isPost = s.substring(0, 4).equals("POST"); - boolean isHead = s.substring(0, 4).equals("HEAD"); - while (!(s = consoleReader.readLine()).equals("")) { - request = request + s + "\r\n"; - } - request = request + "\r\n"; - if (isPost) { - System.out.println("请输入POST方法的内容:"); - s = consoleReader.readLine(); - request = request + s; - } - } - - private void sendHttpRequest() throws Exception { - socket = new Socket(); - socket.setSoTimeout(10 * 1000); - System.out.println("正在连接服务器"); - socket.connect(new InetSocketAddress(host, port), 10 * 1000); - System.out.println("服务器连接成功!"); - OutputStream out = socket.getOutputStream(); - OutputStreamWriter writer = new OutputStreamWriter(out); - writer.write(request); - writer.flush(); - } - - private void readHttpResponse(BufferedReader consoleReader) { - String s = ""; - try { - InputStream in = socket.getInputStream(); - InputStreamReader inReader = new InputStreamReader(in); - BufferedReader socketReader = new BufferedReader(inReader); - System.out.println("---------HTTP头---------"); - boolean b = true; // true: 未读取消息头 false: 已经读取消息头 - while ((s = socketReader.readLine()) != null) { - if (s.equals("") && b == true && !isHead) { - System.out.println("------------------------"); - b = false; - System.out.print("是否显示HTTP的内容(Y/N):"); - String choice = consoleReader.readLine(); - if (choice.equals("Y") || choice.equals("y")) { - System.out.println("---------HTTP内容---------"); - continue; - } else { - break; - } - } else { - System.out.println(s); - } - } - } catch (Exception e) { - System.out.println("err:" + e.getMessage()); - } finally { - try { - socket.close(); - } catch (Exception e) { - } - } - System.out.println("------------------------"); - } -} diff --git a/src/main/java/com/example/mina/mina/client/MinaClient.java b/src/main/java/com/example/mina/mina/client/MinaClient.java deleted file mode 100644 index 5fc8f64..0000000 --- a/src/main/java/com/example/mina/mina/client/MinaClient.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.example.mina.mina.client; - -import org.apache.mina.core.service.IoConnector; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.mina.filter.codec.textline.LineDelimiter; -import org.apache.mina.filter.codec.textline.TextLineCodecFactory; -import org.apache.mina.transport.socket.nio.NioSocketConnector; - -import java.net.InetSocketAddress; -import java.nio.charset.Charset; - -/** - * @author dy - * @date 2021/3/3 - */ -public class MinaClient { - - public static void main(String[] args) { - //1、创建客户端IoService - IoConnector connector = new NioSocketConnector(); - //客户端链接超时时间 - connector.setConnectTimeoutMillis(30000); - //2、客户端过滤器 - connector.getFilterChain().addLast("test", - new ProtocolCodecFilter( - new TextLineCodecFactory( - Charset.forName("UTF-8"), - LineDelimiter.WINDOWS.getValue(), - LineDelimiter.WINDOWS.getValue() - ) - ) - ); - //3、客户端IoHandler,发生消息 - connector.setHandler(new MinaClientHandler("2")); - //连接服务端 - connector.connect(new InetSocketAddress("localhost", 9098)); - - } - -} diff --git a/src/main/java/com/example/mina/mina/client/MinaClientHandler.java b/src/main/java/com/example/mina/mina/client/MinaClientHandler.java deleted file mode 100644 index b4f9f05..0000000 --- a/src/main/java/com/example/mina/mina/client/MinaClientHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.mina.mina.client; - -import org.apache.mina.core.service.IoHandlerAdapter; -import org.apache.mina.core.session.IoSession; - -/** - * @author dy - * @date 2021/3/3 - */ -public class MinaClientHandler extends IoHandlerAdapter { - - private final String values; - - public MinaClientHandler(String values) { - this.values = values; - } - - @Override - public void sessionOpened(IoSession session) { - session.write(values); -// //调用IoService的dispose方法关闭线程,这样每次调用client方法发送数据之后就会关闭client -// IoService service = session.getService(); -// service.dispose(); - - } - - /** - * 接收服务器端反馈消息 - * - * @param session - * @param message - * @throws Exception - */ - @Override - public void messageReceived(IoSession session, Object message) throws Exception { - System.out.println("收到服务器响应消息:" + message); - } - -} diff --git a/src/main/java/com/example/mina/mina/code/ByteDecoder.java b/src/main/java/com/example/mina/mina/code/ByteDecoder.java deleted file mode 100644 index a373b5d..0000000 --- a/src/main/java/com/example/mina/mina/code/ByteDecoder.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.mina.mina.code; - -import org.apache.mina.core.buffer.IoBuffer; -import org.apache.mina.core.session.IoSession; -import org.apache.mina.filter.codec.ProtocolDecoder; -import org.apache.mina.filter.codec.ProtocolDecoderAdapter; -import org.apache.mina.filter.codec.ProtocolDecoderOutput; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author dy - * @date 2021/3/3 - */ -public class ByteDecoder extends ProtocolDecoderAdapter { - //打印日志信息 - private final static Logger log = LoggerFactory - .getLogger(ProtocolDecoder.class); - - @Override - public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { - int limit = in.limit(); - byte[] bytes = new byte[limit]; - - in.get(bytes); - - out.write(bytes); - } -} diff --git a/src/main/java/com/example/mina/mina/code/ByteEnCoder.java b/src/main/java/com/example/mina/mina/code/ByteEnCoder.java deleted file mode 100644 index 05d8aad..0000000 --- a/src/main/java/com/example/mina/mina/code/ByteEnCoder.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.example.mina.mina.code; - -import org.apache.mina.core.buffer.IoBuffer; -import org.apache.mina.core.session.IoSession; -import org.apache.mina.filter.codec.ProtocolEncoder; -import org.apache.mina.filter.codec.ProtocolEncoderAdapter; -import org.apache.mina.filter.codec.ProtocolEncoderOutput; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author dy - * @date 2021/3/3 - */ -public class ByteEnCoder extends ProtocolEncoderAdapter { - //用于打印日志信息 - private final static Logger log = LoggerFactory - .getLogger(ProtocolEncoder.class); - - //编码 将数据包转成字节数组 - @Override - public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { - byte[] bytes = (byte[]) message; - - IoBuffer buffer = IoBuffer.allocate(256); - buffer.setAutoExpand(true); - - buffer.put(bytes); - buffer.flip(); - - out.write(buffer); - out.flush(); - - buffer.free(); - } - -} diff --git a/src/main/java/com/example/mina/mina/code/ByteFactory.java b/src/main/java/com/example/mina/mina/code/ByteFactory.java deleted file mode 100644 index 926ceb7..0000000 --- a/src/main/java/com/example/mina/mina/code/ByteFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.mina.mina.code; - -import org.apache.mina.core.session.IoSession; -import org.apache.mina.filter.codec.ProtocolCodecFactory; -import org.apache.mina.filter.codec.ProtocolDecoder; -import org.apache.mina.filter.codec.ProtocolEncoder; - -/** - * @author dy - * @date 2021/3/3 - */ -public class ByteFactory implements ProtocolCodecFactory { - private final ByteDecoder decoder; - private final ByteEnCoder encoder; - - //构造 - public ByteFactory() { - encoder = new ByteEnCoder(); - decoder = new ByteDecoder(); - } - - @Override - public ProtocolDecoder getDecoder(IoSession arg0) throws Exception { - // TODO Auto-generated method stub - return decoder; - } - - @Override - public ProtocolEncoder getEncoder(IoSession arg0) throws Exception { - // TODO Auto-generated method stub - return encoder; - } - -} diff --git a/src/main/java/com/example/mina/mina/server/MinaServer.java b/src/main/java/com/example/mina/mina/server/MinaServer.java deleted file mode 100644 index 132c063..0000000 --- a/src/main/java/com/example/mina/mina/server/MinaServer.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.example.mina.mina.server; - -import com.example.mina.mina.code.ByteFactory; -import org.apache.mina.core.service.IoAcceptor; -import org.apache.mina.core.session.IdleStatus; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.mina.filter.codec.textline.LineDelimiter; -import org.apache.mina.filter.codec.textline.TextLineCodecFactory; -import org.apache.mina.filter.executor.ExecutorFilter; -import org.apache.mina.filter.logging.LogLevel; -import org.apache.mina.filter.logging.LoggingFilter; -import org.apache.mina.transport.socket.nio.NioSocketAcceptor; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.charset.Charset; - -/** - * @author dy - * @date 2021/3/3 - */ -public class MinaServer { - - public static ExecutorFilter executorFilter() { - //设置初始化线程数,最大线程数 - ExecutorFilter executorFilter = new ExecutorFilter(10, 20); - return executorFilter; - } - - public static LoggingFilter loggingFilter() { - return new LoggingFilter(); - } - - public static ProtocolCodecFilter protocolCodecFilter() { -// TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), -// LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); - - - //TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); - ProtocolCodecFilter pcf = new ProtocolCodecFilter(new ByteFactory()); - //ProtocolCodecFilter pcf = new ProtocolCodecFilter(factory); - return pcf; - } - - public static void main(String[] args) throws IOException { - /*IoAcceptor nio = new NioSocketAcceptor(); - //设置缓冲区大小 - nio.getSessionConfig().setReadBufferSize(2048); - //设置空闲状态时间,10秒没操作就进入空闲状态 - nio.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); - - DefaultIoFilterChainBuilder def = new DefaultIoFilterChainBuilder(); - def.addLast("executor", executorFilter()); - def.addLast("logger", loggingFilter()); - def.addLast("protocol", protocolCodecFilter()); - - nio.setFilterChainBuilder(def); - nio.setHandler(new MinaServerHandler()); - nio.bind(new InetSocketAddress(9098));*/ - - - - - - //1、创建IoService,拥有监听是否有客户端链接 - IoAcceptor acceptor = new NioSocketAcceptor(); - //设置缓冲区大小 - acceptor.getSessionConfig().setReadBufferSize(2048); - //设置空闲状态时间,10秒没操作就进入空闲状态 - acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); - - //创建日志过滤器,mina内部使用的是slf4j日志,加入日志之后可以查看mina的运行细节信息 - LoggingFilter log = new LoggingFilter(); - log.setSessionOpenedLogLevel(LogLevel.INFO); - acceptor.getFilterChain().addLast("logger", log); - - //2、实现过滤器 - //acceptor.getFilterChain().addLast("protocol", protocolCodecFilter()); - acceptor.getFilterChain().addLast("protocol", - new ProtocolCodecFilter( - new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()) - ) - ); - //3、实现IoHandler,并注册到IoService - acceptor.setHandler(new MinaServerHandler()); - //绑定端口,绑定之前必须设置handler实现类 - acceptor.bind(new InetSocketAddress(9098)); - - - } - -} diff --git a/src/main/java/com/example/mina/mina/server/MinaServerHandler.java b/src/main/java/com/example/mina/mina/server/MinaServerHandler.java deleted file mode 100644 index fc0be42..0000000 --- a/src/main/java/com/example/mina/mina/server/MinaServerHandler.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.example.mina.mina.server; - -import org.apache.mina.core.service.IoHandlerAdapter; -import org.apache.mina.core.session.IoSession; - -import java.io.ByteArrayOutputStream; -import java.io.ObjectOutputStream; -import java.net.SocketAddress; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -/** - * @author dy - * @date 2021/3/3 - */ -public class MinaServerHandler extends IoHandlerAdapter { - - @Override - public void messageReceived(IoSession session, Object message) throws Exception { -// String command = new String(ObjectToByte(message)).trim(); -// -// if (command.startsWith("ATTN ALL MAX")) {//set all to max -// for (int i = 1; i < dataBuffer.getMaxRow(); i++) { -// dataBuffer.setOffset(i, dataBuffer.getMaxAtten()); -// } -// -// return NONE; -// } else if (command.startsWith("ATTN?")) {//get -// String[] sss = command.split(" "); -// if (sss.length >= 2) { -// LogUtils.println(sss[0], sss[1]); -// -// int row = StrUtil.toInt(sss[1]); -// if (row >= 0 && row <= dataBuffer.getMaxRow()) { -// String str = String.valueOf(dataBuffer.getOffset(row)); -// LogUtils.println("AeroflexVirtualBoxService::handleCommand return : ", str); -// return str.getBytes(); -// } -// } -// -// return ERROR; -// } else if (command.startsWith("ATTN")) {//Set, Follow by ATTN? -// LogUtils.println("command.startsWith(\"ATTN\")"); -// String[] aa = command.split(";"); -// -// LogUtils.println(aa[0], aa[1]); -// -// String[] sss = aa[0].split(" "); -// StrUtil.printArray(sss); -// -// if (sss.length >= 3) { -// int row = StrUtil.toInt(sss[1]); -// int val = StrUtil.toInt(sss[2]); -// -// System.out.println(row + "/" + val); -// -// -// if (row >= 0 && row <= dataBuffer.getMaxRow()) { -// if (val >= 0 && val <= dataBuffer.getMaxAtten()) { -// dataBuffer.setOffset(row, val); -// -// String str = String.valueOf(dataBuffer.getOffset(row)); -// LogUtils.println("handleCommand return =====> ", str); -// return str.getBytes(); -// } -// } -// } - - //业务代码在这里编写处理 - String str = new String((byte[])message); - System.out.println("The message received is [" + str + "]"); - //获取客户端的连接地址 - SocketAddress socketAddress = session.getRemoteAddress(); - System.out.println(socketAddress); - String send = "消息已处理,你可以去玩了。。。"; - //响应给对应客户端信息 - session.write(send.getBytes()); - session.closeNow(); -// // 此处关闭session后客户端无法接收到服务器反馈的消息 -// if (str.endsWith("quit")) { -// //注意:在这里调用close方法之后,只是关闭当前的tcp连接,server端还正常运行, -// //需要调用IoService的dispose方法才能关闭server端,client端同理 -// -// return; -// } - } - - @Override - public void sessionCreated(IoSession session) throws Exception { - System.out.println("server session created"); - super.sessionCreated(session); - } - - @Override - public void sessionOpened(IoSession session) throws Exception { - System.out.println("server session Opened"); - super.sessionOpened(session); - } - - @Override - public void sessionClosed(IoSession session) throws Exception { - System.out.println("server session Closed"); - super.sessionClosed(session); - } - - /** - * 在IoHandlerAdapter中有一个messageSent的方法,但是重写这个方法之后,不会发送数据,该方法只有数据发送成功之后才会调用, - * 所以在 messageReceived 方法中使用 session.write("消息已处理,你可以去玩了。。。"); 给客户端响应数据 - * - * @param session - * @param message - * @throws Exception - */ - @Override - public void messageSent(IoSession session, Object message) throws Exception { - // TODO Auto-generated method stub - System.out.println("发送数据成功了。。。" + message); - // session.write("testSent"); - super.messageSent(session, message); - } - - private byte[] ObjectToByte(Object obj) { - byte[] bytes = null; - try { - // object to bytearray - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - ObjectOutputStream oo = new ObjectOutputStream(bo); - oo.writeObject(obj); - - bytes = bo.toByteArray(); - - bo.close(); - oo.close(); - } catch (Exception e) { - System.out.println("translation" + e.getMessage()); - e.printStackTrace(); - } - return bytes; - } - -} diff --git a/src/main/java/com/example/mina/util/StrUtil.java b/src/main/java/com/example/mina/util/StrUtil.java new file mode 100644 index 0000000..f771ee3 --- /dev/null +++ b/src/main/java/com/example/mina/util/StrUtil.java @@ -0,0 +1,74 @@ +package com.example.mina.util; + +public class StrUtil { + + private static final String[] EMPTY_ARRAY = new String[0]; + + public static void main(String[] args) { + System.out.println(toInt("93")); + +// System.out.println(parseCommaInts("2a")); + + } + + public static int[] parseCommaInts(String str) { + if (str == null) { + return new int[0]; + } + + String[] ss = str.split(","); + int[] ids = new int[ss.length]; + + int count = 0; + for (int i = 0; i < ss.length; i++) { + int p = toInt(ss[i]); + ids[i] = p; + if (p >= 0) { + count++; + } + } + + if (count < ss.length) { + int[] ids2 = new int[count]; + count = 0; + for (int i = 0; i < ss.length; i++) { + if (ids[i] >= 0) { + ids2[count++] = ids[i]; + } + } + + ids = ids2; + } + + return ids; + } + + public static int toInt(String s) { + if (isEmpty(s)) { + return -1; + } + + try { + float f = Float.parseFloat(s.trim()); + return (int) f; + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + + } + + public static void printArray(String[] ssss) { + if (ssss == null) { + System.out.println(" -- NULL --"); + } + for (String s : ssss) { + System.out.println(s); + } + } + + public static boolean isEmpty(String s) { + return s == null || s.trim().isEmpty(); + } + +} -- libgit2 0.21.2