Android网络编程吐糟一

本文探讨了在Android客户端使用nio进行socket编程时遇到的汉字乱码问题,并详细解释了问题根源及解决方案。

客户端采用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.

内容概要:本资源聚焦于配电网在发生故障后的两阶段鲁棒恢复研究,旨在提升电力系统在不确定性条件下的恢复能力与运行可靠性。研究采用两阶段优化方法,第阶段进行预恢复决策,如网络重构、分布式电源出力调整等,以最小化预期损失;第二阶段则针对实际发生的故障场景实施校正控制,利用鲁棒优化理论应对负荷波动、新能源出力不确定性等因素,确保恢复方案的可行性与强健性。资源提供了完整的Matlab代码实现,复现了相关顶刊研究成果,便于使用者深入理解模型构建、算法求解及仿真分析全过程。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员及电力行业工程师。; 使用场景及目标:① 学习并掌握配电网故障恢复的先进优化方法,特别是两阶段鲁棒优化模型的构建与应用;② 复现和验证顶刊论文中的算法,为自身科研工作提供技术参考和代码基础;③ 将所学方法拓展应用于微电网、主动配电网等新型电力系统的可靠性评估与优化调度研究。; 阅读建议:学习者应结合提供的Matlab代码,仔细研读模型的数学公式与求解逻辑,重点关注不确定性建模、两阶段决策变量的设定以及鲁棒对等转换技巧。建议在掌握基础案例后,尝试修改参数或引入新的约束条件进行扩展研究,以深化理解并提升创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值