J2ME中多线程网络连接编程的分析,与设计。
注意。本文引用http://www.j2medev.com网上一些内容,只是出于文章的连贯性,请见谅
引言
J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,它与J2SE、J2EE并称。J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话、可视电话、数字机顶盒和汽车导航系统等等。即J2ME是为消费电子产品和手持设备量身定制的Java专用版本。
J2ME的出现使开发跨平台的消费类电子产品的应用软件成为可能。Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。它提供了基于HTTP的高级Internet协议,使移动电话能以Client/Server方式直接访问Internet的全部信息,从而使得不同的Client访问不同的资源。
在将来的无线通信时代中,大量的网络应用程序将被开发出来去满足无线移动通讯的要求,而要充分的发挥无线移动通讯设备的通信能力,J2ME网络编程就变得尤为重要。那么为了高效地进行网络编程,就要利用Java语言的多线程编程机制。
下面我将给出代码来怎么才可以设计一个好的多线程连网。多线程在设计中的地位是很高的,也是比较难设计好的,没经验的人很容易就使程序产生死锁,崩溃等(在下现在还经常这样^_^)
我的例子是基于socket。
1。数据发送线程SenderTask,
package org.wuhua.net;
import java.io.IOException;
import java.io.OutputStream;
/**
* <b>类名:SenderTask.java</b> </br> 编写日期: 2006-7-16 <br/> 程序功能描述?
* 发??命令线程??如果OputStream 出现异常,则断开?有连?<br/> 断开 Demo: <br/> Bug: <br/>
*
* 程序变更日期 ?<br/> 变更作? ?<br/> 变更说明 ?<br/>
*
* @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
*/
public class SenderTask implements Runnable {
public OutputStream os;
private String message;
private boolean stop = false;
SenderTask(OutputStream os) {
this.os = os;
}
/**
* 发送指令,具体的指令格式,可以按照自己定义的规则。
*
* @param _msg
*/
public synchronized void send(String _msg) {
message = _msg;
notify(); // 执行运行
}
/**
* 执行,监听客户发送指令,如果指令不为null则工作?, 否则暂停工作直到有客户发送指令为?止才工作,
*/
public synchronized void run() {
try {
runImpl();
} catch (Throwable tw) {
tw.printStackTrace();
}
}
private void runImpl() throws IOException {
while (true) {
if (stop)
break;
// If no client to deal, wait until one connects
if (message == null) {
try {
wait();
} catch (Exception e) {
}
}
wirte();
}
}
/**
* 具体发?送指令的实现
*
* @throws IOException
*
*/
private void wirte() throws IOException {
os.write(message.getBytes());
os.flush();
message = null; // 指令为空,等待下一个指?,
}
public synchronized void stop() {
stop = true;
if (os != null) {
try {
os.close();
os = null;
} catch (IOException e) {
e.printStackTrace();
}
}
notify();
}
}
2。IncepterTask。负责接收从数据传送过来的数据,并且根据服务器要求,做自己的工作,代码:
1 楼 wuhua 2006-10-30 一般用socket编程,一般都涉及到交互问题,所以网络断开重连的设计很重要。
2 楼 cuihz.hibernate 2006-11-23 不错,收下先!!
谢谢 3 楼 wuhua 2006-11-24 其实我在发现上面的程序出现了点问题,
就是 length = in.readShort(); 读取长度的时候有问题。
因为我上面的解决方案并不是同样的,
这里读取长度是在服务器发送数据时候指定的,如果不指定长度的话,则会有问题,
希望大家可以找到一个,如果再未知道数据长度的情况下读取数据流,有什么好的办法可以正当的结束。