Apache MINA鏄疉pache緇勭粐鐨勪竴涓紭縐鐨勯」鐩侻INA鏄疢ultipurpose Infrastructure for NetworkApplications鐨勭緝鍐欍傚畠鏄竴涓綉緇滃簲鐢ㄧ▼搴忔鏋訛紝鐢ㄦ潵甯姪鐢ㄦ埛闈炲父鏂逛究鍦板紑鍙戦珮鎬ц兘鍜岄珮鍙潬鎬х殑緗戠粶搴旂敤紼嬪簭銆傚湪鏈枃涓粙緇嶄簡 濡備綍閫氳繃Apache Mina2.0鏉ュ疄鐜癟CP鍗忚闀胯繛鎺ュ拰鐭繛鎺ュ簲鐢ㄣ?br />
2銆佺郴緇熶粙緇?br />
2.1緋葷粺妗嗘灦
鏁翠釜緋葷粺鐢變袱涓湇鍔$紼嬪簭鍜屼袱涓鎴風紼嬪簭緇勬垚銆傚垎鍒疄鐜癟CP闀胯繛鎺ュ拰鐭繛鎺ラ氫俊銆?br />
緋葷粺涓氬姟閫昏緫鏄竴涓鎴風涓庢湇鍔$寤虹珛闀胯繛鎺ワ紝涓涓鎴風涓庢湇鍔$寤虹珛鐭繛鎺ャ傛暟鎹粠鐭繛鎺ュ鎴風緇忚繃鏈嶅姟绔彂閫佸埌闀胯繛鎺ュ鎴風錛屽茍浠庨暱榪炴帴瀹㈡埛绔帴鏀跺搷搴旀暟鎹傚綋鏀跺埌鍝嶅簲鏁版嵁鍚庢柇寮榪炴帴銆?br />
緋葷粺鏋舵瀯鍥懼涓嬶細
2.2澶勭悊嫻佺▼
緋葷粺澶勭悊嫻佺▼濡備笅錛?br />
1錛? 鍚姩鏈嶅姟绔▼搴忥紝鐩戝惉8001鍜?002绔彛銆?br />
2錛? 闀胯繛鎺ュ鎴風鍚戞湇鍔$8002绔彛寤虹珛榪炴帴錛屾湇鍔$灝嗚繛鎺ュ璞′繚瀛樺埌鍏變韓鍐呭瓨涓傜敱浜庨噰鐢ㄩ暱榪炴帴鏂瑰紡錛岃繛鎺ュ璞℃槸鍞竴鐨勩?br />
3錛? 鐭繛鎺ュ鎴風鍚戞湇鍔$8001绔彛寤虹珛榪炴帴銆傚緩绔嬭繛鎺ュ悗鍒涘緩涓涓繛鎺ュ璞°?br />
4錛? 鐭繛鎺ュ鎴風榪炴帴鎴愬姛鍚庡彂閫佹暟鎹傛湇鍔$鎺ユ敹鍒版暟鎹悗浠庡叡浜唴瀛樹腑寰楀埌闀胯繛鎺ユ柟寮忕殑榪炴帴瀵硅薄錛屼嬌鐢ㄦ瀵硅薄鍚戦暱榪炴帴瀹㈡埛绔彂閫佹暟鎹傚彂閫佸墠灝嗙煭榪炴帴瀵硅薄璁句負闀胯繛鎺ュ璞$殑灞炴у箋?br />
5錛? 闀胯繛鎺ュ鎴風鎺ユ敹鍒版暟鎹悗榪斿洖鍝嶅簲鏁版嵁銆傛湇鍔$浠庨暱榪炴帴瀵硅薄鐨勫睘鎬т腑鍙栧緱鐭繛鎺ュ璞★紝閫氳繃姝ゅ璞″皢鍝嶅簲鏁版嵁鍙戦佺粰鐭繛鎺ュ鎴風銆?br />
6錛? 鐭繛鎺ュ鎴風鏀跺埌鍝嶅簲鏁版嵁鍚庯紝鍏抽棴榪炴帴銆?br />
3銆佹湇鍔$紼嬪簭
3.1闀胯繛鎺ユ湇鍔$
鏈嶅姟鍚姩
public class MinaLongConnServer {
private static final int PORT = 8002;
public void start()throws IOException{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setHandler(new MinaLongConnServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listeningon port " + PORT);
}
}
//娑堟伅澶勭悊
public class MinaLongConnServerHandler extends IoHandlerAdapter {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
@Override
public void sessionOpened(IoSession session) {
InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();
String clientIp = remoteAddress.getAddress().getHostAddress();
logger.info("LongConnect Server opened Session ID ="+String.valueOf(session.getId()));
logger.info("鎺ユ敹鏉ヨ嚜瀹㈡埛绔?nbsp;:" + clientIp + "鐨勮繛鎺?");
Initialization init = Initialization.getInstance();
HashMap<String, IoSession> clientMap =init.getClientMap();
clientMap.put(clientIp, session);
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the long connect server..");
String expression = message.toString();
logger.info("Message is:" + expression);
IoSession shortConnSession =(IoSession) session.getAttribute("shortConnSession");
logger.info("ShortConnect Server Session ID ="+String.valueOf(shortConnSession.getId()));
shortConnSession.write(expression);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) {
logger.info("Disconnectingthe idle.");
// disconnect an idle client
session.close(true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// close the connection onexceptional situation
logger.warn(cause.getMessage(), cause);
session.close(true);
}
}
3.2鐭繛鎺ユ湇鍔$
鏈嶅姟鍚姩
public class MinaShortConnServer {
private static final int PORT = 8001;
public void start()throws IOException{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setHandler(new MinaShortConnServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listeningon port " + PORT);
}
}
娑堟伅澶勭悊
public class MinaShortConnServerHandler
extends IoHandlerAdapter {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
@Override
public void sessionOpened(IoSession session) {
InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();
logger.info(remoteAddress.getAddress().getHostAddress());
logger.info(String.valueOf(session.getId()));
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the short connect server

");
String expression = message.toString();
Initialization init = Initialization.getInstance();
HashMap<String, IoSession> clientMap =init.getClientMap();
if (clientMap ==
null || clientMap.size() == 0) {
session.write("error");
}
else {
IoSession longConnSession =
null;
Iterator<String> iterator =clientMap.keySet().iterator();
String key = "";
while (iterator.hasNext()) {
key = iterator.next();
longConnSession = clientMap.get(key);
}
logger.info("ShortConnect Server Session ID :"+String.valueOf(session.getId()));
logger.info("LongConnect Server Session ID :"+String.valueOf(longConnSession.getId()));
longConnSession.setAttribute("shortConnSession",session);
longConnSession.write(expression);
}
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) {
logger.info("Disconnectingthe idle.");
// disconnect an idle client
session.close(
true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// close the connection onexceptional situation
logger.warn(cause.getMessage(), cause);
session.close(
true);
}
}
4銆佸鎴風紼嬪簭
4.1闀胯繛鎺ュ鎴風
浣跨敤java.net.Socket鏉ュ疄鐜板悜鏈嶅姟绔緩绔嬭繛鎺ャ係ocket寤虹珛鍚庝竴鐩翠繚鎸佽繛鎺ワ紝浠庢湇鍔$鎺ユ敹鍒版暟鎹寘鍚庣洿鎺ュ皢鍘熸枃榪斿洖銆?br />
public class TcpKeepAliveClient {
private String ip;
private int port;
private static Socket socket = null;
private static int timeout = 50 * 1000;
public TcpKeepAliveClient(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void receiveAndSend() throws IOException {
InputStream input = null;
OutputStream output = null;
try {
if (socket == null || socket.isClosed() || !socket.isConnected()) {
socket = new Socket();
InetSocketAddress addr = new InetSocketAddress(ip, port);
socket.connect(addr, timeout);
socket.setSoTimeout(timeout);
System.out.println("TcpKeepAliveClientnew ");
}
input = socket.getInputStream();
output = socket.getOutputStream();
// read body
byte[] receiveBytes = {};// 鏀跺埌鐨勫寘瀛楄妭鏁扮粍
while (true) {
if (input.available() > 0) {
receiveBytes = new byte[input.available()];
input.read(receiveBytes);
// send
System.out.println("TcpKeepAliveClientsend date :" + new String(receiveBytes));
output.write(receiveBytes, 0, receiveBytes.length);
output.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("TcpClientnew socket error");
}
}
public static void main(String[] args) throws Exception {
TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002);
client.receiveAndSend();
}
}
4.2鐭繛鎺ュ鎴風
鏈嶅姟鍚姩
public class MinaShortClient {
private static final int PORT = 8001;
public static void main(String[] args) throws IOException,InterruptedException {
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
connector.setHandler(new MinaShortClientHandler());
for (int i = 1; i <= 10; i++) {
ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT));
future.awaitUninterruptibly();
IoSession session =future.getSession();
session.write(i);
session.getCloseFuture().awaitUninterruptibly();
System.out.println("result=" + session.getAttribute("result"));
}
connector.dispose();
}
}
娑堟伅澶勭悊
public class MinaShortClientHandler extends IoHandlerAdapter{
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
public MinaShortClientHandler() {
}
@Override
public void sessionOpened(IoSession session) {
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the client..");
logger.info("Message is:" + message.toString());
session.setAttribute("result", message.toString());
session.close(true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
session.close(true);
}
}
5銆佹葷粨
閫氳繃鏈枃涓殑渚嬪瓙錛孉pache Mina鍦ㄦ湇鍔$鍙疄鐜癟CP鍗忚闀胯繛鎺ュ拰鐭繛鎺ャ傚湪瀹㈡埛绔彧瀹炵幇浜嗙煭榪炴帴妯″紡錛岄暱榪炴帴妯″紡涔熸槸鍙互瀹炵幇鐨勶紙鍦ㄦ湰鏂囦腑榪樻槸閲囩敤浼犵粺鐨刯ava Socket鏂瑰紡錛夈備袱涓湇鍔$涔嬮棿閫氳繃鍏變韓鍐呭瓨鐨勬柟寮忔潵浼犻掕繛鎺ュ璞′篃璁告湁鏇村ソ鐨勫疄鐜版柟寮忋?img src ="http://m.tkk7.com/paulwong/aggbug/399155.html" width = "1" height = "1" />
]]>