我在测试中使用mina udp,服务器和客户端都在同一台计算机上,客户端和服务器运行时没有抛出异常,但是服务器无法接收消息。 代码是
public class SmsClient extends IoHandlerAdapter {
private final static Logger logger = LoggerFactory.getLogger("sms");
private IoSession session;
private IoConnector connector;
public SmsClient(final String phone, final String content) {
connector = new NioDatagramConnector();
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
chain.addLast("myChin", new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"))));
chain.addLast("logger", new LoggingFilter());
connector.setHandler(this);
String ip = "127.0.0.1";
String port = "8080";
ConnectFuture connFuture = connector.connect(new InetSocketAddress(ip,
Integer.valueOf(port)));
connFuture.awaitUninterruptibly();
connFuture.addListener(new IoFutureListener<ConnectFuture>() {
public void operationComplete(ConnectFuture future) {
if (future.isConnected()) {
session = future.getSession();
try {
sendData(phone, content);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
throw new Exception("connect failed....");
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
private void sendData(String phone, String content)
throws InterruptedException {
String s = "K&" + phone + "&" + content;
logger.info(s);
Charset c = Charset.forName("utf-8");
byte[] b = s.getBytes(c);
IoBuffer buffer = IoBuffer.allocate(b.length, false);
buffer.put(b);
buffer.flip();
session.write(buffer);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
cause.printStackTrace();
System.out.println("exceptionCaught.................");
session.close(true);
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("messageReceived................."+message);
}
public static void main(String[] args) {
new SmsClient("18610413435", "hiii");
}
}
公共类SmsServer实现了IoHandler {
public void initUDPServer(){
NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
DatagramSessionConfig dcfg = acceptor.getSessionConfig();
try {
acceptor.setHandler(this);
acceptor.bind(new InetSocketAddress(8080));
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("encode", new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"))
));
chain.addLast("logger", new LoggingFilter());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sessionCreated(IoSession session) throws Exception {
SocketAddress remoteAddress = session.getRemoteAddress();
}
public void messageReceived(IoSession session, Object message)
throws Exception {
SocketAddress remoteAddress = session.getRemoteAddress();
System.out.println(message);
if (message instanceof IoBuffer) {
IoBuffer buffer = (IoBuffer) message;
String sendContent = "hello";
byte[]b = sendContent.getBytes(Charset.forName("utf-8"));
IoBuffer ioBuffer = IoBuffer.allocate(sendContent.length(),false);
ioBuffer.put(b);
ioBuffer.flip();
session.write(ioBuffer, remoteAddress);
}
}
public static void main(String[] args) {
new SmsServer().initUDPServer();
}
}
你可以帮我找一下错误的代码吗? 感谢您的任何建议和帮助!答案 0 :(得分:0)
要使此示例有效,请从SmsServer类的方法initUDPServer()中删除ProtocolCodecFilter行:
chain.addLast("encode", new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"))
));
并从SmsClient类的构造函数中删除ProtocolCodecFilter行:
chain.addLast("myChin", new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"))));
通过此修改,这是客户端日志:
2015-10-18 19:01:26,021 0 [NioProcessor-2] INFO LoggingFilter - CREATED
2015-10-18 19:01:26,022 1 [NioProcessor-2] INFO LoggingFilter - OPENED
2015-10-18 19:01:26,023 2 [主要] INFO短信 - K&amp; 18610413435&amp; hiii
2015-10-18 19:01:26,031 10 [NioProcessor-2] INFO LoggingFilter - SENT:HeapBuffer [pos = 0 lim = 18 cap = 18:4B 26 31 38 36 31 30 34 31 33 34 33 35 26 68 69 ...]
2015-10-18 19:01:26,052 31 [NioProcessor-2] INFO LoggingFilter - RECEIVED:HeapBuffer [pos = 0 lim = 5 cap = 2048:68 65 6C 6C 6F] messageReceived ................. HeapBuffer [pos = 0 lim = 5 cap = 2048:68 65 6C 6C 6F]
这是服务器日志:
2015-10-18 19:01:26,046 0 [NioDatagramAcceptor-1] INFO LoggingFilter - CREATED
2015-10-18 19:01:26,048 2 [NioDatagramAcceptor-1] INFO LoggingFilter - OPENED
2015-10-18 19:01:26,049 3 [NioDatagramAcceptor-1] INFO LoggingFilter - RECEIVED:HeapBuffer [pos = 0 lim = 18 cap = 2048:4B 26 31 38 36 31 30 34 31 33 34 33 35 26 68 69 ...] HeapBuffer [pos = 0 lim = 18 cap = 2048:4B 26 31 38 36 31 30 34 31 33 34 33 35 26 68 69 ...]
2015-10-18 19:01:26,051 5 [NioDatagramAcceptor-1] INFO LoggingFilter - SENT:HeapBuffer [pos = 0 lim = 5 cap = 5:68 65 6C 6C 6F] 2015-10-18 19:02:26,053 60007 [ExpiringMapExpirer-1] INFO LoggingFilter - CLOSED