在J2ME中实现基于UDP协议通讯程序
在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以在J2ME中基于UDP协议开发联网应用程序。在MIDP2.0中,添加了UDPDatagramConnection这个接口,他扩展了DatagramConnection并添加了两个方法getLocalAddress()和getLocalPort()。我们知道UDP服务是不可靠的,如果你希望开发更可靠的联网应用的话可以采用SocketConnection,因为TCP服务是面向连接且可靠的。我们还必须清楚地一点是以上所说的各种连接方式都不是MIDP规范中规定必须实现的。因此在使用之前请参考特定设备的开发文档。MIDP中只有Http连接是必须支持的。
同样,我们要获得DatagramConnection的话,必须通过Connector的open方法,其中的URL应该满足如下的形式。
datagram://localhost:5555 这样的话表示建立了一个客户端模式的连接。在指定ip:localhost和指定端口:5555
datagram://:5555 这样建立的是一个服务器端模式的连接,在本地的5555端口。
建立连接后,我们可以通过DatagramConnection的newDatagram()方法构造一个Datagram,然后调用DatagramConnection的send()方法。这样数据报将会发送到指定的接受方。例如你可以构建这个一个负责发送数据的Sender类。
?
客户端代码则是建立连接后向服务器端发送数据,并等待接受服务器返回的数据。
?
本文的代码取自WTK demo中的例子,您可以参考demo中的源代码!下面给出MIDlet的代码
import javax.microedition.lcdui.Choice;import javax.microedition.lcdui.ChoiceGroup;import javax.microedition.lcdui.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Form;import javax.microedition.midlet.MIDlet;public class DatagramMIDlet extends MIDlet implements CommandListener{ private static final String SERVER = "Server"; private static final String CLIENT = "Client"; private static final String[] names = { SERVER, CLIENT }; private static Display display; private Form f; ChoiceGroup cg; private boolean isPaused; private Command exitCommand = new Command("Exit", Command.EXIT, 1); private Command startCommand = new Command("Start", Command.ITEM, 1); public DatagramMIDlet() { display = Display.getDisplay(this); f = new Form("Datagram Demo"); cg = new ChoiceGroup("Please select peer", Choice.EXCLUSIVE, names, null); f.append(cg); f.addCommand(exitCommand); f.addCommand(startCommand); f.setCommandListener(this); display.setCurrent(f); } public static Display getDisplay() { return display; } public boolean isPaused() { return isPaused; } public void startApp() { isPaused = false; } public void pauseApp() { isPaused = true; } public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable s) { if (c == exitCommand) { destroyApp(true); notifyDestroyed(); } else if (c == startCommand) { String name = cg.getString(cg.getSelectedIndex()); if (name.equals(SERVER)) { Server server = new Server(this); server.start(); } else { Client client = new Client(this); client.start(); } } }}?