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 @@ |
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 | } | ... | ... |