📄 connector.java
字号:
package com.ec.generalserver;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Connector extends Thread
{
private Acceptor acceptor;
private Selector selector;
private AppFactory app_creator;
private int conn_timeout = -1; //秒为单位
private HashMap session_map = new HashMap();
public Connector(Acceptor acptor,AppFactory appfactry)
{
acceptor = acptor;
app_creator = appfactry;
};
public void setConnTimeout(int timeout)
{
conn_timeout = timeout;
}
public void init() throws Exception
{
acceptor.init();
}
public void run()
{
try
{
selector = Selector.open();
acceptor.register(selector);
} catch (Exception e1)
{
e1.printStackTrace();
return;
}
while(true)
{
try
{
selector.select(1000*30); // 半分钟check一次
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();
while( it.hasNext() )
{
SelectionKey key = (SelectionKey) it.next();
it.remove();
if ( key.isAcceptable() )
{
Connection conn = acceptor.comeConnection();
if ( conn != null )
{
AppProcessor processor = app_creator.CreateApp();
conn.updateAccess(System.currentTimeMillis());
conn.registor(selector);
conn.setConnector(this);
session_map.put(conn,processor);
}
}
if ( key.isReadable() )
{
Connection conn = (Connection)key.attachment();
conn.updateAccess(System.currentTimeMillis());
AppProcessor processor = (AppProcessor)session_map.get(conn);
processor.doProcess(conn);
}
}
checkConnStatus();
}
catch(ConnectionProcessException e)
{
e.printStackTrace();
try
{
e.connection.close();
} catch (Exception e1)
{
e1.printStackTrace();
}
}
catch(Exception e)
{
e.printStackTrace();
}
} // while
}
public void checkConnStatus() throws Exception
{
if( conn_timeout < 0 )
return;
Set conn_set = session_map.keySet();
Iterator it = conn_set.iterator();
while( it.hasNext() )
{
Connection conn = (Connection)it.next();
if ( conn.isTimeout(conn_timeout*1000) )
{
System.out.println("connection timeout,close");
conn.close();
}
}
}
public void remove(Connection conn)
{
session_map.remove(conn);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -