Apache Mina UDP服务
客户端
package com.cnblogs.javalouvre;
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.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioDatagramConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.mina.filter.codec.textline.LineDelimiter.WINDOWS;
public class Client {
private static final Logger log = LoggerFactory.getLogger(Client.class);
private static final String HOST = "127.0.0.1";
private static final int PORT = 5678;
public static void main(String[] args) {
final NioDatagramConnector connector = new NioDatagramConnector();
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(UTF_8, WINDOWS.getValue(), WINDOWS.getValue())));
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.setHandler(new IoHandlerAdapter() {
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
log.error("客户端处理消息异常: {}", cause.getMessage());
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
log.info("客户端收到消息:{}", message);
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
log.info("客户端发送消息:{}", message);
}
@Override
public void sessionOpened(IoSession session) throws Exception {
log.info("session已打开");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
log.info("session已关闭");
}
});
final ConnectFuture future = connector.connect(new InetSocketAddress(HOST, PORT));
// 阻塞直到和服务端连接成功
future.awaitUninterruptibly();
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in, UTF_8));
try {
String text;
while (!(text = br.readLine()).equalsIgnoreCase("quit")) {
future.getSession().write(text);
}
connector.dispose();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
package com.cnblogs.javalouvre;
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.DatagramSessionConfig;
import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.InetSocketAddress;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.mina.filter.codec.textline.LineDelimiter.WINDOWS;
public class Server {
private static final Logger log = LoggerFactory.getLogger(Server.class);
private final static int PORT = 5678;
public static void main(String[] args) {
final NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
// 编码解码过滤器
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(UTF_8, WINDOWS.getValue(), WINDOWS.getValue())));
// 日志过滤器
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
// 获取socket会话配置
final DatagramSessionConfig sessionConfig = acceptor.getSessionConfig();
// 设置缓存大小
sessionConfig.setReadBufferSize(1024);
// 设置读写空闲时间相同,都为10秒
sessionConfig.setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 注册处理器
acceptor.setHandler(new IoHandlerAdapter() {
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
log.info("服务端接收消息:{}", message);
session.write("COPY THAT.");
}
});
try {
// 绑定端口
acceptor.bind(new InetSocketAddress(PORT));
} catch (IOException e) {
e.printStackTrace();
}
log.info("端口 {} 启动成功", PORT);
}
}
-----------------------------------------------------------------------------------------------------------
薔薇猛虎皆成個性,陽光雨露俱是天恩!
薔薇猛虎皆成個性,陽光雨露俱是天恩!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)