diff --git a/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java b/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java new file mode 100644 index 0000000..81f58cd --- /dev/null +++ b/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java @@ -0,0 +1,42 @@ +package com.example.mina.client.aeroflex; + +import com.example.mina.client.base.AbstractClient; +import com.example.mina.client.base.AbstractVirtualBoxClientHandler; +import org.apache.mina.filter.codec.ProtocolCodecFactory; + +/** + * @author dy + * @date 2021/3/10 + */ +public class AeroflexClient extends AbstractClient { + + public AeroflexClient(ProtocolCodecFactory protocolCodecFactory, + AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler) { + super(protocolCodecFactory, abstractVirtualBoxClientHandler); + } + + @Override + protected void getBoxName() { + + } + + @Override + public boolean setAttenuation(int row, int col, int attenuation) { + return false; + } + + @Override + public int getAttenuation(int row, int col) { + return 0; + } + + @Override + public Boolean reset() { + return null; + } + + @Override + public int[][] getAll() { + return new int[0][]; + } +} diff --git a/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java b/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java new file mode 100644 index 0000000..0706004 --- /dev/null +++ b/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java @@ -0,0 +1,14 @@ +package com.example.mina.client.aeroflex; + +import com.example.mina.client.base.AbstractVirtualBoxClientHandler; +import com.example.mina.client.entity.Command; + +/** + * @author dy + * @date 2021/3/10 + */ +public class AeroflexClientHandler extends AbstractVirtualBoxClientHandler { + public AeroflexClientHandler(Command command) { + super(new Command("AeroflexClient", new byte[4])); + } +} diff --git a/src/main/java/com/example/mina/client/base/AbstractClient.java b/src/main/java/com/example/mina/client/base/AbstractClient.java new file mode 100644 index 0000000..4309c73 --- /dev/null +++ b/src/main/java/com/example/mina/client/base/AbstractClient.java @@ -0,0 +1,57 @@ +package com.example.mina.client.base; + +import org.apache.mina.core.service.IoConnector; +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.apache.mina.transport.socket.nio.NioSocketConnector; + +import java.net.InetSocketAddress; + +/** + * @author dy + * @date 2021/3/10 + */ +public abstract class AbstractClient { + + private final ProtocolCodecFactory protocolCodecFactory; + + private final AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler; + + protected AbstractClient(ProtocolCodecFactory protocolCodecFactory, + AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler) { + this.protocolCodecFactory = protocolCodecFactory; + this.abstractVirtualBoxClientHandler = abstractVirtualBoxClientHandler; + } + + protected abstract void getBoxName(); + + public void start(String host, int port) { + //1、创建客户端IoService + IoConnector connector = new NioSocketConnector(); + //客户端链接超时时间 + connector.setConnectTimeoutMillis(30000); + //2、客户端过滤器 + connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory)); + //3、客户端IoHandler,发生消息 + connector.setHandler(abstractVirtualBoxClientHandler); + //连接服务端 + connector.connect(new InetSocketAddress(host, port)); + } + + public boolean isConnected() { + return false; + } + + public void close() { + + } + + abstract public boolean setAttenuation(int row, int col, int attenuation); + + abstract public int getAttenuation(int row, int col); + + abstract public Boolean reset(); + + abstract public int[][] getAll(); + +} diff --git a/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java b/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java index bb5b0df..8fb41dc 100644 --- a/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java +++ b/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java @@ -1,14 +1,75 @@ package com.example.mina.client.base; +import com.example.mina.client.entity.Command; +import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.service.IoHandlerAdapter; +import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; +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; public abstract class AbstractVirtualBoxClientHandler extends IoHandlerAdapter { + protected Command command; + + public AbstractVirtualBoxClientHandler(Command command) { + this.command = command; + } + + @Override + public void exceptionCaught(IoSession session, Throwable throwable) { + System.out.println("客户端exceptionCaught被调用!"); + throwable.printStackTrace(); + } + + @Override + public void messageReceived(IoSession session, Object message) { + System.out.println("客户端messageReceived被调用!"); + System.out.println("client端接收信息:" + message.toString()); + } + + @Override + public void messageSent(IoSession session, Object message) { + System.out.println("客户端messageSent被调用!"); + System.out.println("client端发送信息:" + message.toString()); + } + + @Override + public void inputClosed(IoSession session) { + System.out.println("客户端inputClosed被调用!"); + System.out.println("client端:" + session.getId() + " 关闭输入"); + } + + @Override + public void sessionClosed(IoSession session) { + System.out.println("客户端sessionClosed被调用!"); + System.out.println("client端与:" + session.getRemoteAddress().toString() + " 关闭连接"); + System.exit(0); + } + + @Override + public void sessionCreated(IoSession session) { + System.out.println("客户端sessionCreated被调用!"); + System.out.println("client端与:" + session.getRemoteAddress().toString() + " 建立连接"); + } + + @Override + public void sessionIdle(IoSession session, IdleStatus status) { + System.out.println("客户端sessionIdle被调用!"); + System.out.println("client端闲置连接:会话 " + session.getId() + " 被触发 " + session.getIdleCount(status) + " 次"); + } + @Override - public void sessionCreated(IoSession session) throws Exception { - System.out.println("客户端创建成功"); + public void sessionOpened(IoSession session) { + session.write(command.getBytes()); + System.out.println("客户端sessionOpened被调用!"); + System.out.println("client端打开连接"); } } diff --git a/src/main/java/com/example/mina/client/coder/ByteDecoder.java b/src/main/java/com/example/mina/client/coder/ByteDecoder.java new file mode 100644 index 0000000..ab119bb --- /dev/null +++ b/src/main/java/com/example/mina/client/coder/ByteDecoder.java @@ -0,0 +1,29 @@ +package com.example.mina.client.coder; + +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/client/coder/ByteEnCoder.java b/src/main/java/com/example/mina/client/coder/ByteEnCoder.java new file mode 100644 index 0000000..e2a50f9 --- /dev/null +++ b/src/main/java/com/example/mina/client/coder/ByteEnCoder.java @@ -0,0 +1,39 @@ +package com.example.mina.client.coder; + +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(bytes.length); + buffer.setAutoExpand(true); + + // 将数据放入缓冲IoBuffer + buffer.put(bytes); + // 写状态切换到读状态 + buffer.flip(); + + out.write(buffer); +// out.flush(); +// +// buffer.free(); + } + +} diff --git a/src/main/java/com/example/mina/client/coder/ByteFactory.java b/src/main/java/com/example/mina/client/coder/ByteFactory.java new file mode 100644 index 0000000..32e47ed --- /dev/null +++ b/src/main/java/com/example/mina/client/coder/ByteFactory.java @@ -0,0 +1,34 @@ +package com.example.mina.client.coder; + +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/client/entity/Command.java b/src/main/java/com/example/mina/client/entity/Command.java new file mode 100644 index 0000000..04db4de --- /dev/null +++ b/src/main/java/com/example/mina/client/entity/Command.java @@ -0,0 +1,38 @@ +package com.example.mina.client.entity; + +import com.example.mina.server.util.LogUtils; + +/** + * @author dy + * @date 2021/03/10 + */ +public class Command { + private String description; + private byte[] bytes; + + public Command(String description, byte[] bytes) { + this.description = description; + this.bytes = bytes; + } + + @Override + public String toString() { + return description + " " + LogUtils.toHexString(bytes); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public byte[] getBytes() { + return bytes; + } + + public void setBytes(byte[] bytes) { + this.bytes = bytes; + } +} diff --git a/src/main/java/com/example/mina/client/test/MinaClient.java b/src/main/java/com/example/mina/client/test/MinaClient.java index 9b7624f..4609bfb 100644 --- a/src/main/java/com/example/mina/client/test/MinaClient.java +++ b/src/main/java/com/example/mina/client/test/MinaClient.java @@ -1,49 +1,40 @@ package com.example.mina.client.test; -import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; -import org.apache.mina.core.future.ConnectFuture; -import org.apache.mina.core.service.IoConnector; -import org.apache.mina.core.session.IoSession; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.mina.filter.codec.prefixedstring.PrefixedStringCodecFactory; -import org.apache.mina.filter.codec.textline.TextLineCodecFactory; -import org.apache.mina.filter.logging.LoggingFilter; -import org.apache.mina.transport.socket.nio.NioSocketConnector; - -import java.net.InetSocketAddress; -import java.nio.charset.Charset; -import java.util.Scanner; +import com.example.mina.client.aeroflex.AeroflexClient; +import com.example.mina.client.aeroflex.AeroflexClientHandler; +import com.example.mina.client.coder.ByteFactory; +import com.example.mina.client.entity.Command; public class MinaClient { - - public static void main(String[] args) - { - //Create TCP/IP connection - NioSocketConnector connector = new NioSocketConnector(); - - //创建接受数据的过滤器 - DefaultIoFilterChainBuilder chain = connector.getFilterChain(); - - //设定这个过滤器将一行一行(/r/n)的读取数据 - chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory())); - - //客户端的消息处理器:一个SamplMinaServerHander对象 - connector.setHandler(new ClientHandler()); - - //set connect timeout - connector.setConnectTimeout(30); - - //连接到服务器: - ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9104)); - - //Wait for the connection attempt to be finished. - cf.awaitUninterruptibly(); - - cf.getSession().getCloseFuture().awaitUninterruptibly(); - - connector.dispose(); + public static void main(String[] args) { +// //Create TCP/IP connection +// NioSocketConnector connector = new NioSocketConnector(); +// +// //创建接受数据的过滤器 +// DefaultIoFilterChainBuilder chain = connector.getFilterChain(); +// +// //设定这个过滤器将一行一行(/r/n)的读取数据 +// chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory())); +// +// //客户端的消息处理器:一个SamplMinaServerHander对象 +// connector.setHandler(new ClientHandler()); +// +// //set connect timeout +// connector.setConnectTimeout(30); +// +// //连接到服务器: +// ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9104)); +// +// //Wait for the connection attempt to be finished. +// cf.awaitUninterruptibly(); +// +// cf.getSession().getCloseFuture().awaitUninterruptibly(); +// +// connector.dispose(); + new AeroflexClient(new ByteFactory(), new AeroflexClientHandler(new Command("AeroflexClient", new byte[4]))) + .start("localhost", 9100); } -- libgit2 0.21.2