上一篇实现了一个简单的服务端程序。
现在来实现一个客户端程序
程序功能:
客户端发送一个字符串给服务端, 服务端返回当前时间给客户端。
基于上一文中的项目 ,首先加入两个对象,分别是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() ;
}
}
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 + "\"给服务端成功");
}
//当接收到服务端发送来的消息时,会触发该方法
@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
}
}
然后,先启动服务端程序。
再启动客户端程序。 就能看到程序效果了