上一篇实现了一个简单的服务端程序。
现在来实现一个客户端程序
程序功能:
客户端发送一个字符串给服务端, 服务端返回当前时间给客户端。
基于上一文中的项目 ,首先加入两个对象,分别是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() ; //加入编码/解码Filter connector.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() ; } }
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 + "\"给服务端成功"); } //当接收到服务端发送来的消息时,会触发该方法 @Override public void messageReceived(IoSession session, Object message) throws Exception { ResultMessageVO msg = (ResultMessageVO)message ; System.out.println("收到服务端回复,内容:" + msg.getMessage()); session.close(false) ; } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { session.close(false) ; //当发送异常,就关闭session } }
然后,先启动服务端程序。
再启动客户端程序。 就能看到程序效果了