客户端采用tcp连接的方式建立及时消息通道,Android客户端采用nio做socket编程,汉字出现乱码,同样的代码在pc上不会出现乱码,结果一到android上就出现了乱码。
代码如下:
<pre name="code" class="java">public class Connector {
private SocketChannel socketChannel = null;
private Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder()
.onMalformedInput(CodingErrorAction.IGNORE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
private Thread t;
public void connect(String host, int port) throws Exception {
if (socketChannel == null) {
socketChannel = SocketChannel.open();
}
SocketAddress socketAddress = new InetSocketAddress(host, port);
System.out.println(socketChannel.connect(socketAddress));
}
public void startReceiveThread(){
t=new Thread(new Runnable(){
@Override
public void run() {
System.out.println("ready for read:");
Connector.this.receiveData();
}});
t.start();
}
public boolean sendData(String data) throws IOException {
byte[] bytes = data.getBytes(Charset.forName("UTF-8"));
ByteBuffer buffer = ByteBuffer.wrap(bytes);
socketChannel.write(buffer);
return true;
}
private void receiveData() {
try {
ByteBuffer buffer = ByteBuffer.allocate(13);
CharBuffer charBuffer = CharBuffer.allocate(buffer.capacity());
StringBuilder strBuffer = new StringBuilder();
int len = 0;
while ((len = socketChannel.read(buffer)) != -1) {
if (len == 0)
continue;
buffer.flip();
decoder.reset();
decoder.decode(buffer, charBuffer, false);
char[] charArr = new char[charBuffer.position()];
charBuffer.flip();
charBuffer.get(charArr);
int readCharCount = charArr.length;
if (readCharCount == 0) {
continue;
}
strBuffer.append(charArr);
parserMsg(strBuffer);
charBuffer.compact();
buffer.compact();
}
} catch (Exception e) {
}
}
private void parserMsg(StringBuilder strBuffer){
//TODO: 从字符串中截取单条消息
}
}
最后通过调试发现,问题出在:
decoder.reset();
在pc上无论是否执行这句代码,都不会乱码;Android却不能执行这句代码。
坑啊,Coding once, debuging everywhere.