`
wuhua
  • 浏览: 2099390 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

J2ME中多线程网络连接编程的分析,与设计。

    博客分类:
  • 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。负责接收从数据传送过来的数据,并且根据服务器要求,做自己的工作,代码:


package org.wuhua.net;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream; 
/**
 * <b>类名:CheckForm.java</b> </br> 编写日期: 2006-7-18 <br/>
 * 程序功能描述:检测从服务器上传过来的数据,并判断是否需要弹出窗口显示给用户,并更新相关的信息 <br/>
 * 此程序的操作网络的核心类,负责网络,跟一些消息��辑处理<br/> Demo: <br/>
 * 
 * Bug: <br/>
 * 
 * 程序变更日期 �<br/> 变更作� �<br/> 变更说明 �<br/>
 * 
 * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
 */
public class IncepterTask implements Runnable  {
	private DataInputStream in;
 	private boolean stop;
	private byte[] content = null;
	IncepterTask(InputStream _in) {
		in = new DataInputStream(_in);	
	}
	/**
	 * 程序启动后不停的获取数据,并根据数据的类型做相应的工作
	 */
	public synchronized void run() {
		try{	 
			runImpl();
		}catch(Throwable tw){
			tw.printStackTrace();
			 
		}
		
	}

	private void runImpl() throws IOException {
		while (true) {
			if (stop)
				break;
			
			while (true) {
				readMessage();

				if (content == null)
					continue;			
				
				executeIncepter( );
 
			}
		}
	}
	
	//获取数据后的具体工作
	private void executeIncepter() {
		// TODO Auto-generated method stub
		
	}
	/**
	 * 读取数据
	 * 
	 * @throws IOException
	 */
	private void readMessage() throws IOException {

		content = null;
		int length = 0;
		int offer = 0;

		// 如果没数据则阻塞在这�,等啊等啊等啊.
		length = in.readShort();

		if (length < 0)
			length = length + 65536;
		content = new byte[length];
		while (true) {
			int i = in.read(content, offer, length - offer);
			offer += i;
			if (offer == length)
				break;
		}
	}
 
	public synchronized void stop() {
		stop = true;
		if(in != null){
			try {
				in.close();
				in = null;
			} catch (IOException e) {
				 
				e.printStackTrace();
			}
		}
			
		notify();
		 
	}
}


1。Client类,负责打开连接以及管理,接收数据,与发送数据线程。
package org.wuhua.net;
import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.SocketConnection;
public class Client {
	static SocketConnection sc; 
	static IncepterTask it;
	static SenderTask st;
	
	static int restart;
	public static boolean IS_START = false;
 
	private Client() {
		try {
			sc = (SocketConnection) Connector.open(
					"socket://127。0。0。1:1232", 3, false); 
			
			
			it = new IncepterTask(sc.openInputStream());
			new Thread(it).start(); //启动拦截数据线程
			
			st = new SenderTask(sc.openOutputStream());
			new Thread(st).start();//启动数据发送线程
			IS_START = true;
			
		} catch (Exception e) {
			 
			IS_START = false;
			 
		}
	}
	
	public  static void start(){
		new Client();		
	}
	
	public static void stop() {
		try {
			if (sc != null)
				sc.close();
			if(it != null)
				it.stop();
			if(st != null)
				st.stop();
		} catch (IOException e) {
			 
		}
		sc = null;	
		st = null;
		it = null;
	}

	/**
	 * 发送指令
	 */

	public static void sendDictate(String type) {

		try {
			st.send(type);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}


以上是连接网络的基本框架,如果需要加些功能可以很好的利用这些代码


  


  
分享到:
评论
3 楼 wuhua 2006-11-24  
其实我在发现上面的程序出现了点问题,
就是 length = in.readShort();  读取长度的时候有问题。
因为我上面的解决方案并不是同样的,
这里读取长度是在服务器发送数据时候指定的,如果不指定长度的话,则会有问题,

希望大家可以找到一个,如果再未知道数据长度的情况下读取数据流,有什么好的办法可以正当的结束。
2 楼 cuihz.hibernate 2006-11-23  
不错,收下先!!
谢谢
1 楼 wuhua 2006-10-30  
一般用socket编程,一般都涉及到交互问题,所以网络断开重连的设计很重要。

相关推荐

    tengge py for s60编程教程

    2.3线程的挂起与释放 2.4查看系统信息 2.5数学计算 2.6让手机说话 2.7文字格式的处理 2.8文本的保存与读取 2.9修改左右键名称 3.0折叠界面 3.1对字符串操作的函数 3.2启动程序和程序列表 3.3对列表操作的函数 3.4...

    Java语言程序设计(理论基础部分)ppt

    序号 课件章节 ...8 第七章 多线程与异常处理 9 第八章 数据流(1) 10 第八章 数据流(2) 11 第九章 网络编程 12 第十章 Java数据库连接 13 第十一章 数据结构及算法分析 14 第十二章 J2ME基础

    h_JAVA 2应用编程150例.rar

    实例67 实现C/S多线程 198 实例68 客户端程序 200 实例69 服务器端程序 201 实例70 C/S结构聊天室 203 实例71 基于C/S的小游戏 209 实例72 应用C/S数据库 237 实例73 实现客户端程序 242 实例74 实现一个简单的代理...

    java应用软件程序设计

    195 第6章 Java C/S结构编程 197 实例67 实现C/S多线程 198 实例68 客户端程序 200 实例69 服务器端程序 201 实例70 C/S结构聊天室 203 实例71 基于C/S的小游戏 209 实例72 应用C/S数据库 237...

    java慕课uooc答案

    Java 语言支持多线程编程,可以提高程序的并发性和响应性。Java 语言的线程可以通过 Thread 类或 Runnable 接口来实现。 Java 语言的线程可以应用于网络通信、数据库操作等领域。 10. Java 网络编程 Java 语言...

    JAVA上百实例源码以及开源项目源代码

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java入门.docx

    用户可以产生分布式的客户机和服务器,在这个过程中,网络编程软件应用的分布式运载工具。 Java发展史 Java语言由詹姆斯·高斯林发明于1990年,命名为Oak,后改名为Java。公司:sun公司→Oracle(2011.7.28)。Java...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

    java必了解的六大问题

    *第三阶段:java API:输入输出,多线程,网络编程,反射注解等,java的精华部分; *第四阶段:数据库SQL基础,包括增删改查操作以及多表查询; *第五阶段:JDBC编程:包括JDBC原理,JDBC连接库,JDBC API,...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Java 面试题 word文档

    23. 谈谈 java 多线程 24. 谈谈文件加密技术 25. 软件开发生命周期 26. 路由协议种类及特点 27. java 的 awt 和 swing 组件的 GUI 设计的关键 28. 对于 java 流的认识 29. 简述一下 awt 与 swing 区别。 30. 简述 ...

    JAVA面试题最全集

    请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一...

Global site tag (gtag.js) - Google Analytics