本次建立一个普通工程,也可以使用maven。
jar包引入:
只需要引入图上4个jar即可。
Mina客户端代码:
package com.hbk.mina;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MinaClient {
public static void main(String[] args) {
// 创建TCP/IP连接
NioSocketConnector connection = new NioSocketConnector();
// 创建接受收据的过滤器
DefaultIoFilterChainBuilder chain = connection.getFilterChain();
// 往过滤器链的最后加入一个一行一行读取数据的过滤器
chain.addLast("mychin", new ProtocolCodecFilter(new TextLineCodecFactory()));
// 客户端消息处理器
connection.setHandler(new MinaClientHandler());
// 设置超时时间
connection.setConnectTimeout(5000);
// 连接到服务器
ConnectFuture cf = connection.connect(new InetSocketAddress("localhost", 8080));
// 等待连接完成
cf.awaitUninterruptibly();
cf.getSession().getCloseFuture().awaitUninterruptibly();
connection.dispose();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
客户端业务处理
package com.hbk.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class MinaClientHandler extends IoHandlerAdapter {
// 当客户端连接进入时
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incomming 客户端: " + session.getRemoteAddress());
session.write("i am coming");
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
System.out.println("客户端发送信息异常....");
}
// 当客户端发送消息到达时
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("服务器返回的数据:" + message.toString());
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("客户端与服务端断开连接.....");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("one Client Connection" + session.getRemoteAddress());
session.write("我来了······");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
服务端
package com.hbk.mina;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
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.NioSocketAcceptor;
public class MinaServer {
// 服务器监听端口
private static final int PORT = 8080;
public static void main(String[] args) {
// 服务器端的主要对象
IoAcceptor acceptor = new NioSocketAcceptor();
// 设置过滤器
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
// 协议解析,采用mina现成的UTF-8字符串处理方式
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
// 设置消息处理类(创建、关闭Session,可读可写等等,继承自接口IoHandler)
acceptor.setHandler(new TimeServerHandler());
// 设置接受缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 读写通道无任何操作就进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
try {
// 服务器开始监听
acceptor.bind( new InetSocketAddress(PORT) );
}catch(Exception e){
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
服务端处理类
package com.hbk.mina;
import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class TimeServerHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
cause.printStackTrace();
}
/*
* 这个方法是目前这个类里最主要的, 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端 如果是quit,则关闭客户端连接
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String str = message.toString();
if (str.trim().equalsIgnoreCase("quit")) {
session.close();
return;
}
Date date = new Date();
System.out.println("hello" + str + session.getRemoteAddress() + date.toString());
session.write("huangbaokang");
System.out.println("Message written...");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
// TODO Auto-generated method stub
super.sessionClosed(session);
System.out.println("客户端与服务端断开连接.....");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
测试运行: