Commit c2886db39b38feb8e569a836cbe3c3f7a0eda6ac

Authored by dy
1 parent 2e6f208c
Exists in develop

feat: 客户端代码初版

src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java 0 → 100644
... ... @@ -0,0 +1,42 @@
  1 +package com.example.mina.client.aeroflex;
  2 +
  3 +import com.example.mina.client.base.AbstractClient;
  4 +import com.example.mina.client.base.AbstractVirtualBoxClientHandler;
  5 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
  6 +
  7 +/**
  8 + * @author dy
  9 + * @date 2021/3/10
  10 + */
  11 +public class AeroflexClient extends AbstractClient {
  12 +
  13 + public AeroflexClient(ProtocolCodecFactory protocolCodecFactory,
  14 + AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler) {
  15 + super(protocolCodecFactory, abstractVirtualBoxClientHandler);
  16 + }
  17 +
  18 + @Override
  19 + protected void getBoxName() {
  20 +
  21 + }
  22 +
  23 + @Override
  24 + public boolean setAttenuation(int row, int col, int attenuation) {
  25 + return false;
  26 + }
  27 +
  28 + @Override
  29 + public int getAttenuation(int row, int col) {
  30 + return 0;
  31 + }
  32 +
  33 + @Override
  34 + public Boolean reset() {
  35 + return null;
  36 + }
  37 +
  38 + @Override
  39 + public int[][] getAll() {
  40 + return new int[0][];
  41 + }
  42 +}
... ...
src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +package com.example.mina.client.aeroflex;
  2 +
  3 +import com.example.mina.client.base.AbstractVirtualBoxClientHandler;
  4 +import com.example.mina.client.entity.Command;
  5 +
  6 +/**
  7 + * @author dy
  8 + * @date 2021/3/10
  9 + */
  10 +public class AeroflexClientHandler extends AbstractVirtualBoxClientHandler {
  11 + public AeroflexClientHandler(Command command) {
  12 + super(new Command("AeroflexClient", new byte[4]));
  13 + }
  14 +}
... ...
src/main/java/com/example/mina/client/base/AbstractClient.java 0 → 100644
... ... @@ -0,0 +1,57 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +import org.apache.mina.core.service.IoConnector;
  4 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
  5 +import org.apache.mina.filter.codec.ProtocolCodecFilter;
  6 +import org.apache.mina.transport.socket.nio.NioSocketConnector;
  7 +
  8 +import java.net.InetSocketAddress;
  9 +
  10 +/**
  11 + * @author dy
  12 + * @date 2021/3/10
  13 + */
  14 +public abstract class AbstractClient {
  15 +
  16 + private final ProtocolCodecFactory protocolCodecFactory;
  17 +
  18 + private final AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler;
  19 +
  20 + protected AbstractClient(ProtocolCodecFactory protocolCodecFactory,
  21 + AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler) {
  22 + this.protocolCodecFactory = protocolCodecFactory;
  23 + this.abstractVirtualBoxClientHandler = abstractVirtualBoxClientHandler;
  24 + }
  25 +
  26 + protected abstract void getBoxName();
  27 +
  28 + public void start(String host, int port) {
  29 + //1、创建客户端IoService
  30 + IoConnector connector = new NioSocketConnector();
  31 + //客户端链接超时时间
  32 + connector.setConnectTimeoutMillis(30000);
  33 + //2、客户端过滤器
  34 + connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory));
  35 + //3、客户端IoHandler,发生消息
  36 + connector.setHandler(abstractVirtualBoxClientHandler);
  37 + //连接服务端
  38 + connector.connect(new InetSocketAddress(host, port));
  39 + }
  40 +
  41 + public boolean isConnected() {
  42 + return false;
  43 + }
  44 +
  45 + public void close() {
  46 +
  47 + }
  48 +
  49 + abstract public boolean setAttenuation(int row, int col, int attenuation);
  50 +
  51 + abstract public int getAttenuation(int row, int col);
  52 +
  53 + abstract public Boolean reset();
  54 +
  55 + abstract public int[][] getAll();
  56 +
  57 +}
... ...
src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java
1 1 package com.example.mina.client.base;
2 2  
3 3  
  4 +import com.example.mina.client.entity.Command;
  5 +import org.apache.mina.core.service.IoConnector;
4 6 import org.apache.mina.core.service.IoHandlerAdapter;
  7 +import org.apache.mina.core.session.IdleStatus;
5 8 import org.apache.mina.core.session.IoSession;
  9 +import org.apache.mina.filter.codec.ProtocolCodecFilter;
  10 +import org.apache.mina.filter.codec.textline.LineDelimiter;
  11 +import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  12 +import org.apache.mina.transport.socket.nio.NioSocketConnector;
  13 +
  14 +import java.net.InetSocketAddress;
  15 +import java.nio.charset.Charset;
6 16  
7 17 public abstract class AbstractVirtualBoxClientHandler extends IoHandlerAdapter {
8 18  
  19 + protected Command command;
  20 +
  21 + public AbstractVirtualBoxClientHandler(Command command) {
  22 + this.command = command;
  23 + }
  24 +
  25 + @Override
  26 + public void exceptionCaught(IoSession session, Throwable throwable) {
  27 + System.out.println("客户端exceptionCaught被调用!");
  28 + throwable.printStackTrace();
  29 + }
  30 +
  31 + @Override
  32 + public void messageReceived(IoSession session, Object message) {
  33 + System.out.println("客户端messageReceived被调用!");
  34 + System.out.println("client端接收信息:" + message.toString());
  35 + }
  36 +
  37 + @Override
  38 + public void messageSent(IoSession session, Object message) {
  39 + System.out.println("客户端messageSent被调用!");
  40 + System.out.println("client端发送信息:" + message.toString());
  41 + }
  42 +
  43 + @Override
  44 + public void inputClosed(IoSession session) {
  45 + System.out.println("客户端inputClosed被调用!");
  46 + System.out.println("client端:" + session.getId() + " 关闭输入");
  47 + }
  48 +
  49 + @Override
  50 + public void sessionClosed(IoSession session) {
  51 + System.out.println("客户端sessionClosed被调用!");
  52 + System.out.println("client端与:" + session.getRemoteAddress().toString() + " 关闭连接");
  53 + System.exit(0);
  54 + }
  55 +
  56 + @Override
  57 + public void sessionCreated(IoSession session) {
  58 + System.out.println("客户端sessionCreated被调用!");
  59 + System.out.println("client端与:" + session.getRemoteAddress().toString() + " 建立连接");
  60 + }
  61 +
  62 + @Override
  63 + public void sessionIdle(IoSession session, IdleStatus status) {
  64 + System.out.println("客户端sessionIdle被调用!");
  65 + System.out.println("client端闲置连接:会话 " + session.getId() + " 被触发 " + session.getIdleCount(status) + " 次");
  66 + }
  67 +
9 68 @Override
10   - public void sessionCreated(IoSession session) throws Exception {
11   - System.out.println("客户端创建成功");
  69 + public void sessionOpened(IoSession session) {
  70 + session.write(command.getBytes());
  71 + System.out.println("客户端sessionOpened被调用!");
  72 + System.out.println("client端打开连接");
12 73 }
13 74  
14 75 }
... ...
src/main/java/com/example/mina/client/coder/ByteDecoder.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +package com.example.mina.client.coder;
  2 +
  3 +import org.apache.mina.core.buffer.IoBuffer;
  4 +import org.apache.mina.core.session.IoSession;
  5 +import org.apache.mina.filter.codec.ProtocolDecoder;
  6 +import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
  7 +import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  8 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +
  11 +/**
  12 + * @author dy
  13 + * @date 2021/3/3
  14 + */
  15 +public class ByteDecoder extends ProtocolDecoderAdapter {
  16 + //打印日志信息
  17 + private final static Logger log = LoggerFactory
  18 + .getLogger(ProtocolDecoder.class);
  19 +
  20 + @Override
  21 + public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
  22 + int limit = in.limit();
  23 + byte[] bytes = new byte[limit];
  24 +
  25 + in.get(bytes);
  26 +
  27 + out.write(bytes);
  28 + }
  29 +}
... ...
src/main/java/com/example/mina/client/coder/ByteEnCoder.java 0 → 100644
... ... @@ -0,0 +1,39 @@
  1 +package com.example.mina.client.coder;
  2 +
  3 +import org.apache.mina.core.buffer.IoBuffer;
  4 +import org.apache.mina.core.session.IoSession;
  5 +import org.apache.mina.filter.codec.ProtocolEncoder;
  6 +import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
  7 +import org.apache.mina.filter.codec.ProtocolEncoderOutput;
  8 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +
  11 +/**
  12 + * @author dy
  13 + * @date 2021/3/3
  14 + */
  15 +public class ByteEnCoder extends ProtocolEncoderAdapter {
  16 + //用于打印日志信息
  17 + private final static Logger log = LoggerFactory
  18 + .getLogger(ProtocolEncoder.class);
  19 +
  20 + //编码 将数据包转成字节数组
  21 + @Override
  22 + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
  23 + byte[] bytes = (byte[]) message;
  24 +
  25 + IoBuffer buffer = IoBuffer.allocate(bytes.length);
  26 + buffer.setAutoExpand(true);
  27 +
  28 + // 将数据放入缓冲IoBuffer
  29 + buffer.put(bytes);
  30 + // 写状态切换到读状态
  31 + buffer.flip();
  32 +
  33 + out.write(buffer);
  34 +// out.flush();
  35 +//
  36 +// buffer.free();
  37 + }
  38 +
  39 +}
... ...
src/main/java/com/example/mina/client/coder/ByteFactory.java 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +package com.example.mina.client.coder;
  2 +
  3 +import org.apache.mina.core.session.IoSession;
  4 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
  5 +import org.apache.mina.filter.codec.ProtocolDecoder;
  6 +import org.apache.mina.filter.codec.ProtocolEncoder;
  7 +
  8 +/**
  9 + * @author dy
  10 + * @date 2021/3/3
  11 + */
  12 +public class ByteFactory implements ProtocolCodecFactory {
  13 + private final ByteDecoder decoder;
  14 + private final ByteEnCoder encoder;
  15 +
  16 + //构造
  17 + public ByteFactory() {
  18 + encoder = new ByteEnCoder();
  19 + decoder = new ByteDecoder();
  20 + }
  21 +
  22 + @Override
  23 + public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {
  24 + // TODO Auto-generated method stub
  25 + return decoder;
  26 + }
  27 +
  28 + @Override
  29 + public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {
  30 + // TODO Auto-generated method stub
  31 + return encoder;
  32 + }
  33 +
  34 +}
... ...
src/main/java/com/example/mina/client/entity/Command.java 0 → 100644
... ... @@ -0,0 +1,38 @@
  1 +package com.example.mina.client.entity;
  2 +
  3 +import com.example.mina.server.util.LogUtils;
  4 +
  5 +/**
  6 + * @author dy
  7 + * @date 2021/03/10
  8 + */
  9 +public class Command {
  10 + private String description;
  11 + private byte[] bytes;
  12 +
  13 + public Command(String description, byte[] bytes) {
  14 + this.description = description;
  15 + this.bytes = bytes;
  16 + }
  17 +
  18 + @Override
  19 + public String toString() {
  20 + return description + " " + LogUtils.toHexString(bytes);
  21 + }
  22 +
  23 + public String getDescription() {
  24 + return description;
  25 + }
  26 +
  27 + public void setDescription(String description) {
  28 + this.description = description;
  29 + }
  30 +
  31 + public byte[] getBytes() {
  32 + return bytes;
  33 + }
  34 +
  35 + public void setBytes(byte[] bytes) {
  36 + this.bytes = bytes;
  37 + }
  38 +}
... ...
src/main/java/com/example/mina/client/test/MinaClient.java
1 1 package com.example.mina.client.test;
2 2  
3   -import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
4   -import org.apache.mina.core.future.ConnectFuture;
5   -import org.apache.mina.core.service.IoConnector;
6   -import org.apache.mina.core.session.IoSession;
7   -import org.apache.mina.filter.codec.ProtocolCodecFilter;
8   -import org.apache.mina.filter.codec.prefixedstring.PrefixedStringCodecFactory;
9   -import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
10   -import org.apache.mina.filter.logging.LoggingFilter;
11   -import org.apache.mina.transport.socket.nio.NioSocketConnector;
12   -
13   -import java.net.InetSocketAddress;
14   -import java.nio.charset.Charset;
15   -import java.util.Scanner;
  3 +import com.example.mina.client.aeroflex.AeroflexClient;
  4 +import com.example.mina.client.aeroflex.AeroflexClientHandler;
  5 +import com.example.mina.client.coder.ByteFactory;
  6 +import com.example.mina.client.entity.Command;
16 7  
17 8 public class MinaClient {
18 9  
19 10  
20   -
21   - public static void main(String[] args)
22   - {
23   - //Create TCP/IP connection
24   - NioSocketConnector connector = new NioSocketConnector();
25   -
26   - //创建接受数据的过滤器
27   - DefaultIoFilterChainBuilder chain = connector.getFilterChain();
28   -
29   - //设定这个过滤器将一行一行(/r/n)的读取数据
30   - chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));
31   -
32   - //客户端的消息处理器:一个SamplMinaServerHander对象
33   - connector.setHandler(new ClientHandler());
34   -
35   - //set connect timeout
36   - connector.setConnectTimeout(30);
37   -
38   - //连接到服务器:
39   - ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9104));
40   -
41   - //Wait for the connection attempt to be finished.
42   - cf.awaitUninterruptibly();
43   -
44   - cf.getSession().getCloseFuture().awaitUninterruptibly();
45   -
46   - connector.dispose();
  11 + public static void main(String[] args) {
  12 +// //Create TCP/IP connection
  13 +// NioSocketConnector connector = new NioSocketConnector();
  14 +//
  15 +// //创建接受数据的过滤器
  16 +// DefaultIoFilterChainBuilder chain = connector.getFilterChain();
  17 +//
  18 +// //设定这个过滤器将一行一行(/r/n)的读取数据
  19 +// chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));
  20 +//
  21 +// //客户端的消息处理器:一个SamplMinaServerHander对象
  22 +// connector.setHandler(new ClientHandler());
  23 +//
  24 +// //set connect timeout
  25 +// connector.setConnectTimeout(30);
  26 +//
  27 +// //连接到服务器:
  28 +// ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9104));
  29 +//
  30 +// //Wait for the connection attempt to be finished.
  31 +// cf.awaitUninterruptibly();
  32 +//
  33 +// cf.getSession().getCloseFuture().awaitUninterruptibly();
  34 +//
  35 +// connector.dispose();
  36 + new AeroflexClient(new ByteFactory(), new AeroflexClientHandler(new Command("AeroflexClient", new byte[4])))
  37 + .start("localhost", 9100);
47 38  
48 39  
49 40 }
... ...