package mi.magic.service.impl;
import java.net.InetSocketAddress;
import mi.magic.service.ConnectService;
import mi.magic.util.SamplMinaClientHandler;
import mi.magic.util.SocketLineMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;
import cn.ijimu.commons.util.SimpleLogUtils;
import cn.lawrence.io.SocketData;
import cn.lawrence.io.SocketResultData;
public class ConnectServiceImpl implements ConnectService {
static {
SimpleLogUtils.config();
}
private static Log LOG = LogFactory.getLog(ConnectServiceImpl.class);
public static final String HOST = "localhost";// 服务器地址
public static final int PORT = 5656; // 服务器端口号
private NioSocketConnector connector;
private ConnectFuture cf;
private IoSession session;
public void createConnect() {
connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("objectFilter",
new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
// 设定服务器端的消息处理器:一个SamplMinaServerHandler对象,
connector.setHandler(new SamplMinaClientHandler());
cf = connector.connect(new InetSocketAddress(HOST, PORT));// 连结到服务器
// Wait for the connection attempt to be finished.
cf.awaitUninterruptibly();// 等待连接创建完成
LOG.info("客户端启动");
}
public SocketResultData sendData(int id, boolean hasReturn,
String descation, String method, Object[] args) {
if (cf == null) {
createConnect();
}
SocketData data = new SocketData();
data.id = id;
data.hasReturn = hasReturn;
data.descation = descation;
data.method = method;
data.args = args;
session = cf.getSession();// 获得session
// 同步操作
session.write(data);
SocketResultData resultData = new SocketResultData(id);
SocketLineMap.addLine(resultData, id);
try {
synchronized (resultData) {
while(true)
{
resultData.wait(10);
if(resultData.isReturnResult()) break;
}
// resultData.wait(10);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
SocketLineMap.removeLine(id);
}
// session.close(true);
// if(!cf.isConnected()){
// connector.dispose();
// }
return resultData;
//异步操作
// session.getConfig().setUseReadOperation(true);
// WriteFuture writeFuture = session.write(data);
// writeFuture.awaitUninterruptibly(); // 等待发送数据操作完成
// ReadFuture readFuture = session.read();
// readFuture.awaitUninterruptibly(); // 等待处理结果
// SocketResultData socketResultData = (SocketResultData) readFuture
// .getMessage();
// session.getConfig().setUseReadOperation(false);
// session.close(true);
// return socketResultData;
// connector.dispose();
}
}