服务端代码:
1.Main.java
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Server server = new Server();
boolean flag = server.start();
if(flag) System.out.println("服务端开始");
}
}
2.Server.java
import java.net.InetSocketAddress;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class Server {
static final int PORT = 20087;
NioSocketAcceptor acceptor = null;
public Server() {
}
public boolean start() {
//创建一个非阻塞的server端的Socket
acceptor = new NioSocketAcceptor();
acceptor.getSessionConfig().setUseReadOperation(true);
//绑定过滤器
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
//必须要设置ExecutorFilter,否则无法messageReceived中向客户端反馈同步消息会在wfutrue.awaitUninterruptibly()处长期挂起
//同时客户端要设置connector.getSessionConfig().setUseReadOperation(true);
acceptor.getFilterChain().addLast("exceutor", new ExecutorFilter());
//设置为非延迟发送,为true则不组装成打包发送,收到东西马上发出
acceptor.getSessionConfig().setTcpNoDelay(true);
//绑定处理类
acceptor.setHandler(new ServerHandler2());
try {
//绑定端口
acceptor.bind(new InetSocketAddress(PORT));
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
3.ServerHandler2.java
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class ServerHandler2 extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable throwable)
throws Exception {
System.out.println("发生异常: " +throwable.getMessage());
session.close(true);
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
IoBuffer ioBuffer = (IoBuffer)message;
int limit = ioBuffer.limit();
System.out.println("limit = "+ limit);
byte[] b = new byte[6];
ioBuffer.get(b);
String msg=new String(b);
byte[] bb = new byte[limit-6];
ioBuffer.get(bb);
String msg2=new String(bb);
System.out.println("收到客户端发来的消息为: [" + msg+msg2+"]");
brodcast(session);
}
private void brodcast(IoSession session) {
System.out.println("回复客户端");
byte[] returnStr = "收到".getBytes();
//将测试消息会送给客户端
IoBuffer returnMsg = IoBuffer.wrap(returnStr);
WriteFuture wfutrue =session.write(returnMsg);
wfutrue.awaitUninterruptibly();
if(wfutrue.isWritten()){
System.out.println("服务端回复完毕");
}else{
System.out.println("服务端回复失败");
}
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println(session.getRemoteAddress() + "is Disconnection");
session = null;
}
@Override
public void sessionCreated(IoSession session) throws Exception {
// TODO Auto-generated method stub
}
/**
* 当一个客户端连接进入时
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incoming client: " + session.getRemoteAddress());
}
}
=========================
客户端代码1:
1.Main.java
public class Main {
/**
* Mina NIO client 连接 Mina NIO server
*/
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}
2.Client.java
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.ReadFuture;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class Client {
public void start() {
//创建一个非阻塞的客户端程序
NioSocketConnector connector = new NioSocketConnector();
//必须要配置
connector.getSessionConfig().setUseReadOperation(true);
connector.getFilterChain().addLast("logger", new LoggingFilter());
//设置为非延迟发送,为true则不组装成打包发送,收到东西马上发出
connector.getSessionConfig().setTcpNoDelay(true);
//添加业务逻辑处理类
connector.setHandler(new ClientHandler());
String hostName = "127.0.0.1";
try {
InetAddress ipAddress = InetAddress.getByName(hostName);
int port = 20087;
//创建连接
ConnectFuture confuture = connector.connect(new InetSocketAddress(ipAddress, port));
//等待连接创建完成
confuture.awaitUninterruptibly();
if(confuture.isConnected()){
System.out.println("客户端启动");
IoSession session = confuture.getSession();
byte[] arr = "hello world".getBytes();
IoBuffer returnMsg = IoBuffer.wrap(arr);
WriteFuture wfuture = session.write(returnMsg);
wfuture.awaitUninterruptibly();
if(wfuture.isWritten()){
System.out.println("客户端发送成功, 等待服务端反馈信息");
ReadFuture readFuture = session.read();
readFuture.awaitUninterruptibly();
//是否响应成功
if(readFuture.isRead()){
//获取消息
Object message = readFuture.getMessage();
IoBuffer ioBuffer = (IoBuffer)message;
byte[] b = new byte[ioBuffer.limit()];
ioBuffer.get(b);
String msg=new String(b);
System.out.println("服务端反馈:["+msg+"]");
}
}else{
System.out.println("客户端发送失败");
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
3.ClientHandler.java
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class ClientHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable throwable)
throws Exception {
System.out.println("发生异常: "+throwable.getMessage());
session.close(true);
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
IoBuffer ioBuffer = (IoBuffer)message;
byte[] b = new byte[ioBuffer.limit()];
ioBuffer.get(b);
String msg=new String(b);
System.out.println("收到客户端发来的消息为" + " " + msg);
//将测试消息会送给客户端
IoBuffer returnMsg = IoBuffer.wrap("收到".getBytes());
WriteFuture wfutrue =session.write(returnMsg);
wfutrue.awaitUninterruptibly();
if(wfutrue.isWritten()){
System.out.println("服务端回复完毕");
}else{
System.out.println("服务端回复失败");
}
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println(session.getRemoteAddress() + "is Disconnection");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
// TODO Auto-generated method stub
}
/**
* 当一个客户端连接进入时
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incoming client: " + session.getRemoteAddress());
}
}
=========================
客户端代码2:
1.Main.java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Main {
/**
* 非NIO client 连接 Mina NIO server
*/
public static void main(String[] args) {
try {
InetAddress ipAddress = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(ipAddress, 20087);
if(socket.isConnected() && !socket.isClosed()){
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.write("hello world2".getBytes());
dos.flush();
System.out.println("C->S: 发送完毕");
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true){
byte[] bb = new byte[6];
dis.readFully(bb);
System.out.println("C<-S = "+new String(bb));
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
========================
客户端代码3:
1.Main.java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SocketChannel;
public class Main {
/**
* NIO Client 连接 Mina NIO server 测试
*/
public static void main(String[] args) {
try {
SocketChannel socketChannel = SocketChannel.open();
InetSocketAddress ia = new InetSocketAddress("127.0.0.1",20087);
socketChannel.connect(ia);
System.out.println("与服务器的连接建立成功");
Socket socket = socketChannel.socket();
if(socket.isConnected() && !socket.isClosed()){
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.write("hello world2".getBytes());
dos.flush();
System.out.println("C->S: 发送完毕");
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true){
byte[] bb = new byte[6];
dis.readFully(bb);
System.out.println("C<-S = "+new String(bb));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
先运行服务端main.java, 再运行客户端main.java