首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

在J2ME中兑现基于UDP协议通讯程序

2012-09-18 
在J2ME中实现基于UDP协议通讯程序  在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以

在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();      }    }  }}

?

热点排行