版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/88245926
Java Socket框架Apache MINA:简单套接字客户端读http网页数据
Apache MINA是Apache发展出来的一套Java Socket编程解决方案,基于Java NIO。Apache MINA相对比较简洁,易于快速部署和上手。
Apache MINA官方首页:http://mina.apache.org/
本文基于Apache MINA 2.0.20。
用Apache MINA实现一个简单的例子:做一个Apache MINA的Socket客户端,通过Socket套接字读取百度首页(www.baidu.com)的数据内容。代码如下:
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MINATest {
private String mURL = "www.baidu.com";
public static void main(String[] args) {
try {
MINATest test = new MINATest();
} catch (Exception e) {
e.printStackTrace();
}
}
public MINATest() throws Exception {
NioSocketConnector connector = new NioSocketConnector();
// 过滤链。
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
// 处理。
connector.setHandler(new SocketClientHandler());
InetAddress inetAddress = InetAddress.getByName(mURL);
InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress.getHostAddress(), 80);
// 连接。
ConnectFuture connect = connector.connect(inetSocketAddress);
}
public class SocketClientHandler extends IoHandlerAdapter {
// 会话创建。
@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
System.out.println("#sessionCreated#");
}
// 会话打开时触发(第一次连接时先触发sessionCreated函数,后触发本函数)。
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("#sessionOpened#");
session.write(doGet(mURL));
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
super.messageSent(session, message);
System.out.println("#messageSent#");
System.out.println("=============");
System.out.println(message.toString());
System.out.println("=============");
}
// 接收到消息时触发。
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
// System.out.println("messageReceived");
System.out.print(message.toString());
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("\n#sessionClosed#");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
super.sessionIdle(session, status);
System.out.println("#sessionIdle#");
}
}
private String doGet(String s) {
StringBuilder sb = new StringBuilder();
sb.append("GET / HTTP/1.1\r\n");
sb.append("Host: " + s + "\r\n");
//sb.append("\r\n");
return sb.toString();
}
}
运行后输出结果: