Commit c2886db39b38feb8e569a836cbe3c3f7a0eda6ac
1 parent
2e6f208c
Exists in
develop
feat: 客户端代码初版
Showing
9 changed files
with
347 additions
and
42 deletions
Show diff stats
src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java
0 → 100644
@@ -0,0 +1,42 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 | package com.example.mina.client.base; | 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 | import org.apache.mina.core.service.IoHandlerAdapter; | 6 | import org.apache.mina.core.service.IoHandlerAdapter; |
7 | +import org.apache.mina.core.session.IdleStatus; | ||
5 | import org.apache.mina.core.session.IoSession; | 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 | public abstract class AbstractVirtualBoxClientHandler extends IoHandlerAdapter { | 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 | @Override | 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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 | package com.example.mina.client.test; | 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 | public class MinaClient { | 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 | } |