apache mina框架服務器端與socket客戶端通訊問題?(求代碼)


如題,比如客戶端發送的消息中存在中文,服務器端應該如何寫呢?

6 个解决方案

#1


簡單的說,利用ProtocolCodecFilter進行解碼,獲得你需要的信息。必定任何消息傳遞過來得到的都是byte數組。
當然這只是玩玩,如果問題復雜。客戶端有可能出現分包發送,也就是存在這樣的代碼out.write(msg)出現兩次以上。注意這里客戶端可以是任何socket不一定是nio。那么你就需要處理數據的完整性了。必定nio是不阻塞的。有就會有事件響應,不處理就無限循環,直到你處理完成。

#2



IoAcceptor acceptor = new NioSocketAcceptor();     
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); 

我是這樣處理的,但是在客戶端傳送中文字符測試,拋出異常如下:

org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.charset.MalformedInputException: Input length = 1 (Hexdump: 0D 0A)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:180)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:414)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:49)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:832)
at org.apache.mina.filter.logging.LoggingFilter.messageReceived(LoggingFilter.java:95)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:414)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:49)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:832)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$HeadFilter.messageReceived(DefaultIoFilterChain.java:616)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:414)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:408)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:498)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:460)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:452)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:55)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Worker.run(AbstractPollingIoProcessor.java:775)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(Unknown Source)
at org.apache.mina.core.buffer.AbstractIoBuffer.getString(AbstractIoBuffer.java:1122)
at org.apache.mina.filter.codec.textline.TextLineDecoder.decodeAuto(TextLineDecoder.java:207)
at org.apache.mina.filter.codec.textline.TextLineDecoder.decode(TextLineDecoder.java:138)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:170)
... 19 more

#3


我此問題是在Windows命令窗口輸入的中文字符進行測試,我想應該是Windows命令行窗口不會對傳輸的數據進行UTF-8編碼吧,唉,還有那位仁兄能這方便完善點的代碼貼出來大家共享呀,這方面的資料真的太少了。畢竟開源的嘛,不能讓后輩在走彎路了。

#4


TMD,搜索了兩天居然搜索不到在socket作為客戶端發送信息到mina2.0服務器端出現亂碼的的列子,最后自己動手解決了。也沒做任何壓力測試,供大家參考下。
    因為是socket客戶端,所以沒用過濾器,接收信息中的解析如下:

public void messageReceived(IoSession session, Object message)
throws Exception {
IoBuffer buffer = (IoBuffer)message;
BufferedReader in=null;
in=new BufferedReader(new InputStreamReader(buffer.asInputStream()));  
String str =in.readLine();
in.close();
System.out.println("服務器收到客戶端發送的數據為:" + str);
}

#5


IoAcceptor acceptor = new NioSocketAcceptor();     
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory())); 
把指定編碼去掉我測試了能顯示中文

#6


如果只是對傳輸字符串,換成
connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
就可以了。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com