一、修改pom.xml文件。
1.1 因为我们需要把Mina核心和相应的日志jar包放进项目中。
<!-- mina核心 -->
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>2.0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-filter-compression</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.13</version>
</dependency>
把上面的依赖添加之后,pom.xml会报错:Missing artifact org.apache.mina:mina-core:bundle:2.0.4
这个时候,需要在pom.xml中加个插件。
<!-- 加上这个插件。不然会报错Missing artifact org.apache.mina:mina-core:bundle:2.0.4 -->
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
</plugin>
到这里,pom.xml内容本次就修改完了。
二、添加服务器和客户端之间传递的实体类
2.1 抽象父类AbstractMessage
/**
* 服务器接受的消息(即客户端发送的消息)和服务器返回的消息(即客户端接收的消息)的父类。
* @author king_fu
*
*/
public abstract class AbstractMessage implements Serializable {
static final long serialVersionUID = 1L;
private int sequence;
public int getSequence() {
return sequence;
}
public void setSequence(int sequence) {
this.sequence = sequence;
}
}
2.2 服务器接受的消息(即客户端发送的消息
/**
* 服务器接受的消息(即客户端发送的消息)
* @author king_fu
*
*/
public class Message extends AbstractMessage {
/**
* 序列化
*/
private static final long serialVersionUID = 3982238087285303145L;
private int value;
public Message() {
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
// it is a good practice to create toString() method on message classes.
return getSequence() + ":value(" + value + ')';
}
}
2.3 服务器返回的消息(即客户端接收的消息)
/**
* 服务器返回的消息(即客户端接收的消息)
*
* @author king_fu
*
*/
public class ResultMessage extends AbstractMessage {
/**
* 序列化
*/
private static final long serialVersionUID = 2120629824004587146L;
private boolean ok;
private int value;
public ResultMessage() {
}
public boolean isOk() {
return ok;
}
public void setOk(boolean ok) {
this.ok = ok;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
if (ok) {
return getSequence() + ":RESULT(" + value + ')';
} else {
return getSequence() + ":RESULT(ERROR)";
}
}
}
所以经过了上面的三个小步骤。创建了客户端和服务器传递的实体类。一个父类,两个子类。
三、服务器处理类FileUploadServerHandle
这个处理类是在服务器接收到了客户端发来的消息时,对客户端的消息进行处理。
/**
* 这个处理类是在服务器接收到了客户端发来的消息时,对客户端的消息进行处理。
*
* @author king_fu
*
*/
public class FileUploadServerHandler extends IoHandlerAdapter {
private final static Logger LOGGER = LoggerFactory
.getLogger(FileUploadServerHandler.class);
@Override
public void sessionOpened(IoSession session) {
// 设置空闲时间为10秒
session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
}
@Override
public void messageReceived(IoSession session, Object message) {
// message为客户端发来的消息。
Message am = (Message) message;
ResultMessage rm = new ResultMessage();
rm.setSequence(am.getSequence());
rm.setOk(true);
rm.setValue(new Random().nextInt(10));
session.write(rm);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) {
LOGGER.info("空闲中");
session.close(true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
LOGGER.info(cause.getMessage());
session.close(true);
}
}
/**
* 服务器类。开启服务。
* @author king_fu
*
*/
public class Server {
private static final int SERVER_PORT = 8080;
// 是否是自定义的消息。实现接口MessageDecoder。
private static final boolean USE_CUSTOM_CODEC = true;
public static void main(String[] args) throws Throwable {
NioSocketAcceptor acceptor = new NioSocketAcceptor();
if (USE_CUSTOM_CODEC) {
acceptor.getFilterChain()
.addLast(
"codec",
new ProtocolCodecFilter(
// 自定义解码工厂。
new UploadFileProtocolCodecFactory(true)));
} else {
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(
// 使用核心自带的解码。
new ObjectSerializationCodecFactory()));
}
acceptor.getFilterChain().addLast("logger", new LoggingFilter()); //日志过滤链
acceptor.setHandler(new FileUploadServerHandle()); // 客户端传过来的Message服务器处理。
acceptor.bind(new InetSocketAddress(SERVER_PORT)); // 绑定监听的端口。
System.out.println("监听端口 " + SERVER_PORT);
}
}
五、自定义解码工厂UploadFileProtocolCodecFactory
这里先留空,下一章节再进行添加。
所以这个类的情况现在是这样的。不然你们是启动不了的。嘿嘿嘿
/**
* 自定义解码工厂。判断是否是服务器还是客户端。
* @author king_fu
*
*/
public class UploadFileProtocolCodecFactory extends DemuxingProtocolCodecFactory {
public UploadFileProtocolCodecFactory(boolean isServer) {
}
}
六、可以启动了。运行Server类
七、今天就先到这里了~~~
最新代码在github上。欢迎fork。
项目名:MinaFile