前期准備
1、下載
http://mina.apache.org/
2、將依賴包添加到工程目錄下(在工程目錄下創建libs(directory目錄))
3、將 slf4j-api-1.7.26.jar 和 mina-core-2.0.21.jar 依賴包添加到libs目錄下
4、給這兩個文件和工程綁定關系,方法:選中兩個文件,右擊,選擇 Add as Library
代碼實現
服務端
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.service.IoHandlerAdapter;
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.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import java.io.*;
import java.net.InetSocketAddress;
public class Server{
public static void main(String[] args) {
//創建一個非堵塞的Server(Socker),[NIO模式]
SocketAcceptor acceptor = new NioSocketAcceptor();
//創建一個過濾器對象
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//設定一個過濾器,一行一行的讀取數據(/r/n)
//chain.addLast("myChain",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));//表示傳數據的數據是一個對象;
chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));
//設置服務器的消息處理器
acceptor.setHandler(new MinaServerHandle());
int port = 8080; //服務器的端口號
try {
//綁定端口,並且啟動服務器,立刻返回,不會堵塞
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("MINA服務器已經開啟,端口號:"+port);
}
}
//服務器端的消息處理器
class MinaServerHandle extends IoHandlerAdapter {
//會話開始
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println(session.getRemoteAddress()+"已連接");//獲取客戶端連接的ip地址
}
//會話結束
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("會話結束");
}
//接受消息
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
System.out.println(message); //接受消息
session.write("hellow");
}
}
客戶端1
1.可以使用window自帶的telnet工具和服務器連接,並進行通信
首先打開Telnet,在控制面板中,打開程序和功能,在打開 (打開或關閉windows 功能),選中Telnet 客戶端 ,確定
測試:控制台上輸入 telnet localhost(服務器的ip地址) 8080(服務器的端口) ,即可
客戶端2
2.自己寫客戶端程序
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
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.transport.socket.nio.NioSocketConnector;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class client {
public static void main(String[] args) {
NioSocketConnector conn = new NioSocketConnector();
DefaultIoFilterChainBuilder chain = conn.getFilterChain();
chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));
conn.setHandler(new MinaClientHandle());
conn.setConnectTimeoutCheckInterval(3000);
//連接服務器
ConnectFuture cf = conn.connect(new InetSocketAddress("localhost", 8080));
cf.awaitUninterruptibly(); //等待連接成功;
Scanner input = new Scanner(System.in);
while (true){
System.out.println("輸入消息");
String msg = input.nextLine();
cf.getSession().write(msg);
}
//等待服務器關閉連接
//cf.getSession().getCloseFuture().awaitUninterruptibly();
//conn.dispose();
}
}
class MinaClientHandle extends IoHandlerAdapter {
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("已連接");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("已關閉");
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
System.out.println("服務器返回消息:"+message);
}
}
