时间:2015-01-27 19:11 来源: 我爱IT技术网 编辑:52微风
为了测试socket通讯,用apache的MINA做了一个Echo服务器,同时支持tcp和udp,分别监听50012和50013端口 代码如下: EchoHandler.java
package com.echo;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
public class EchoHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause)throws Exception {
//System.out.println(String.format("session[%d] 有错误发生:%s", new Object[]{session.getId(), cause}));
session.close(true);
}
@Override
public void messageReceived(IoSession session, Object message)throws Exception {
System.out.println(String.format("session[%d] ->%s", new Object[]{session.getId(), message}));
session.write(message);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println(String.format("session[%d] 已关闭", new Object[]{session.getId()}));
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println(String.format("session[%d] 被创建", new Object[]{session.getId()}));
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)throws Exception {
System.out.println(String.format("session[%d] 处于空闲", new Object[]{session.getId()}));
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println(String.format("session[%d] 被打开", new Object[]{session.getId()}));
}
}
Main.java
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.DatagramAcceptor;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import com.echo.EchoHandler;
public class Main {
private static final int TCP_PORT= 50012;
private static final int UDP_PORT= 50013;
public static void main(String[] args) throws Exception {
SocketAcceptor tcp_acceptor = new NioSocketAcceptor();
tcp_acceptor.setReuseAddress(true);
DefaultIoFilterChainBuilder tcp_chain = tcp_acceptor.getFilterChain();
tcp_chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
tcp_acceptor.setHandler(new EchoHandler());
tcp_acceptor.bind(new InetSocketAddress(TCP_PORT));
System.out.println(String.format("在端口%d开始监听TCP通讯", new Object[]{TCP_PORT}));
DatagramAcceptor udp_acceptor = new NioDatagramAcceptor();
DefaultIoFilterChainBuilder udp_chain = udp_acceptor.getFilterChain();
udp_chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
udp_acceptor.setHandler(new EchoHandler());
udp_acceptor.bind(new InetSocketAddress(UDP_PORT));
System.out.println(String.format("在端口%d开始监听UDP通讯", new Object[]{UDP_PORT}));
for (;;) {
//System.out.println("R: " + acceptor.getStatistics().getReadBytesThroughput() +", W: " + acceptor.getStatistics().getWrittenBytesThroughput());
Thread.sleep(3000);
}
}
}
运行起来提示
在端口50012开始监听TCP通讯 在端口50013开始监听UDP通讯随后可以用telnet测试50012端口
jim@jim-laptop:~$ telnet 192.168.1.6 50012 Trying 192.168.1.6... Connected to 192.168.1.6. Escape character is '^]'. alldf alldf服务器反馈信息
在端口50012开始监听TCP通讯 在端口50013开始监听UDP通讯 session[1] 被创建 session[1] 被打开 session[1] ->alldf从结果上看,服务器正确的收到了数据并把串返回了终端 测试UDP通讯可以使用nc(linux自带nc,windows下需要在网上找找) 命令如下
jim@jim-laptop:~$ nc 192.168.1.6 50013 -u
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
