Mina学习笔记(二) 简单客户端实例

来源:互联网 发布:js防水液体怎么用 编辑:程序博客网 时间:2024/05/16 14:33

上一篇实现了一个简单的服务端程序。

现在来实现一个客户端程序 

程序功能:

客户端发送一个字符串给服务端, 服务端返回当前时间给客户端。


基于上一文中的项目 ,首先加入两个对象,分别是SendMessageVO、ResultMessageVO

package com.zf.mina.test01;import java.io.Serializable;/** * 客户端发送给服务端的对象 * @author Administrator * */public class SendMessageVO implements Serializable{private static final long serialVersionUID = -7845817716564707395L;private String value ;public SendMessageVO(String value) {super();this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}


package com.zf.mina.test01;import java.io.Serializable;/** * 服务端返回给客户端的对象 * @author Administrator * */public class ResultMessageVO implements Serializable{private static final long serialVersionUID = -5859798424107423872L;private String message ;public ResultMessageVO(String message) {super();this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}



然后修改上一文中的MinaTimeServer与TimeServerHandler

将MinaTimeServer中的编码转换器设置为 ObjectSerializationCodecFactory,即:

acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));


然后将TimeServerHandler中的messageReceived方法的实现做一下修改

/** * 当接收到客户端发来的消息时,此方法会被触发 */public void messageReceived(IoSession session, Object message)throws Exception {SendMessageVO msg = (SendMessageVO)message ; //获取客户端发来的消息if(msg.getValue().trim().equalsIgnoreCase("quit")){session.close(false) ;System.out.println("Session closed");return ;}System.out.println("收到客户端消息:" + msg.getValue());Date date = new Date() ;ResultMessageVO result = new ResultMessageVO(date.toLocaleString()) ;session.write(result) ; //将消息发送给客户端System.out.println("Message wittern...");}


接下来编写编写客户端主程序

package com.zf.mina.test01;import java.net.InetSocketAddress;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MinaTimeClient {public static void main(String[] args) {//首先创建一个NioSocketConnector 用于链接服务端NioSocketConnector connector = new NioSocketConnector() ;//加入编码/解码Filterconnector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())) ;//设置IO处理器connector.setHandler(new ClientSessionHandler("is_zhoufeng")) ;//链接服务端ConnectFuture connectFuture =connector.connect(new InetSocketAddress("localhost", 8080)) ;//阻塞等待,知道链接服务器成功,或被中断connectFuture.awaitUninterruptibly() ;IoSession session = connectFuture.getSession() ;//阻塞,知道session关闭session.getCloseFuture().awaitUninterruptibly() ;//关闭链接connector.dispose() ;}}

IO事件处理器

package com.zf.mina.test01;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;/** * 处理客户端IO事件 * @author Administrator * */public class ClientSessionHandler extends IoHandlerAdapter {//要发送给服务端的消息private final String value  ;public ClientSessionHandler(String value){this.value = value ;}//当与服务端链接成功时Session会被创建,同时会触发该方法public void sessionOpened(IoSession session) throws Exception {//发送消息给服务端session.write(new SendMessageVO(value)) ;System.out.println("发送消息\"" + value + "\"给服务端成功");}//当接收到服务端发送来的消息时,会触发该方法@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {ResultMessageVO msg = (ResultMessageVO)message ;System.out.println("收到服务端回复,内容:" + msg.getMessage()); session.close(false) ;}@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {session.close(false) ;//当发送异常,就关闭session}}


然后,先启动服务端程序。

再启动客户端程序。 就能看到程序效果了

0 0
原创粉丝点击