mina长连接ConnectGameServer 类

package mi.magic.io;

import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;

import mi.magic.util.OceanGlobals;
import mi.magic.util.SocketLineMap;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.ReadFuture;
import org.apache.mina.core.future.WriteFuture;
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.lawrence.io.SocketData;
import cn.lawrence.io.SocketResultData;

public class ConnectGameServer {
	private NioSocketConnector connector;
	private ConnectFuture cf;
	private IoSession session;
	private final String HOST;
	public ConnectGameServer(String HOST){
		this.HOST = HOST;
//		createConnect();
	}
	public void createConnect() {
		if(cf == null){
			int PORT = OceanGlobals.getInt("gamePort");
			if( connector==null){
				connector = new NioSocketConnector();
			}
			connector.getSessionConfig().setReadBufferSize(2048);
			connector.setConnectTimeoutCheckInterval(2000);
			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();// 等待连接创建完成
		}
	}

	/**
	 * 
	 * @param id
	 * @param hasReturn
	 *            是否有返回值
	 * @param descation
	 *            调用方法接口
	 * @param args
	 *            参数
	 */
	public SocketResultData sendData(int id, boolean hasReturn,
			String descation, String method, Object[] args) {
		if (session == null) {
//			createConnect();
			session = ConnectFutrueUntil.getIoSession(HOST);
		}
//		if(!connector.isDisposed()){
//			System.out.println("connector.isDisposed()");
//			createConnect();
//		}
//		if(!connector.isActive()){
//			System.out.println("connector.isActive()");
//			createConnect();
//		}
//		if(connector.)
//		if(!cf.isConnected()){
//			int PORT = OceanGlobals.getInt("gamePort");
//			Object obj = connector.connect(new InetSocketAddress(HOST, PORT));// 连结到服务器
//			if (obj instanceof ConnectFuture) {
//				cf = (ConnectFuture) obj;
//			}else{
//				System.out.println("返回值改变!!!!!!!");
//			}
//			// Wait for the connection attempt to be finished.
//			cf.awaitUninterruptibly();// 等待连接创建完成
//		}
		SocketData data = new SocketData();
		data.id = id;
		data.hasReturn = hasReturn;
		data.descation = descation;
		data.method = method;
		data.args = args;
//		cf.awaitUninterruptibly();// 等待连接创建完成
		
//		System.out.println("连接创建完成"+cf.isConnected()+cf.isCanceled()+cf.isDone());
//		if(!cf.isDone()){
//			connector.dispose();    //不关闭的话会运行一段时间后抛出,too many open files异常,导致无法连接  
//            throw new java.lang.NullPointerException("cf断开"); 
//		}
//		session = cf.getSession();// 获得session
		session.getConfig().setUseReadOperation(true);
	    WriteFuture writeFuture = session.write(data);
	    writeFuture.awaitUninterruptibly(); // 等待发送数据操作完成
	    ReadFuture readFuture = session.read();
	    readFuture.awaitUninterruptibly(); // 等待处理结果
	    SocketResultData resultData = (SocketResultData) readFuture.getMessage();
	    
//	    cf.cancel();
//	    System.out.println("cf.isConnected()->"+cf.isConnected());
//	    session.close(true);
//	    session.getCloseFuture().setClosed();
//	    System.out.println("cf.isConnected()->"+cf.isConnected());
//	    System.out.println("session.isClosing()->"+session.isClosing()+"\t"+"session.isConnected()->"+session.isConnected());
		
	    // 同步操作
//		session.write(data);
//		SocketResultData resultData = new SocketResultData();
//		SocketLineMap.addLine(resultData, id);
//		try {
//			synchronized (resultData) {
//				while(true){
//					resultData.wait(10);
//					if(resultData.isHasReturnResult()) break;
//				}
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		} finally {
//			SocketLineMap.removeLine(id);
//		}
	    
		return resultData;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值