【MinaFile】【二】编写Mina服务器端

一、修改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);
	}
}



四、编写服务器主类Server

/**
 * 服务器类。开启服务。
 * @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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值