开发学院WEB开发Jsp 教程:在J2ME中基于UDP协议编程 阅读

教程:在J2ME中基于UDP协议编程

 2008-01-05 19:41:16 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫鎾绘偐閹绘帞鈧參姊哄Ч鍥х仼闁诲繑鑹鹃悾鐑藉蓟閵夛妇鍘甸梺瑙勵問閸犳牠銆傛總鍛婄厱閹艰揪绱曟牎闂侀潧娲ょ€氫即鐛幒妤€绠f繝闈涘暙娴滈箖鏌i姀鈶跺湱澹曟繝姘厵闁绘劦鍓氶悘杈ㄤ繆閹绘帞澧涚紒缁樼洴瀹曞崬螖閸愬啠鍓濈换娑樼暆婵犱胶鏁栫紓浣介哺閹瑰洤鐣烽幒鎴僵闁瑰吀鐒﹂悗鎼佹⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩缁狀垶鏌涢幇闈涙灈鐎瑰憡绻冮妵鍕箻鐎靛摜鐣奸梺纭咁潐濞茬喎顫忕紒妯肩懝闁逞屽墮宀h儻顦查悡銈夋煏閸繃鍋繛宸簻鎯熼梺瀹犳〃閼冲爼宕濋敃鈧—鍐Χ閸℃鐟愰梺鐓庡暱閻栧ジ宕烘繝鍥у嵆闁靛骏绱曢崢顏堟⒑閹肩偛鍔楅柡鍛⊕缁傛帟顦寸紒杈ㄥ笚濞煎繘鍩℃担閿嬵潟闂備浇妗ㄩ悞锕傚箲閸ヮ剙鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹  闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨堕妴鍐川閺夋垹鍘洪悗骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栨牎闂佽瀵掗崜鐔奉潖閾忓湱纾兼俊顖氭惈椤秴顪冮妶鍡楀闁告鍥х叀濠㈣泛谩閻斿吋鐓ラ悗锝庡厴閸嬫挻绻濆顓涙嫼閻熸粎澧楃敮鎺撶娴煎瓨鐓曢柟鎯ь嚟閳藉鏌嶇紒妯荤叆妞ゎ偅绻堥幊婊呭枈濡顏归梻鍌欑閹诧紕绮欓幋锔哄亼闁哄鍨熼弸鏃堟煛閸愶絽浜剧紓浣虹帛缁嬫挻绂掗敃鍌氱<婵﹩鍓﹂悗鎶芥⒒娴e摜锛嶇紒顕呭灦楠炴垿宕堕鍌氱ウ闁诲函缍嗘禍鏍绩娴犲鐓欓梺顓ㄧ畱婢ь垱銇勯弬鍨偓瑙勭┍婵犲洦鍊锋い蹇撳閸嬫捇寮借濞兼牕鈹戦悩瀹犲闁稿被鍔庨幉姝岀疀濞戞ḿ鐤呴梺鍦檸閸犳寮查幖浣圭叆闁绘洖鍊圭€氾拷
核心提示:在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以在J2ME中基于UDP协议开发联网应用程序,教程:在J2ME中基于UDP协议编程,在MIDP2.0中,添加了UDPDatagramConnection这个接口,以便服务器端向客户端发送数据,package com.sieme

  在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类。
  
  package com.siemens.datagramtest;
  
  import javax.microedition.io.Datagram;
  import javax.microedition.io.DatagramConnection;
  
  public class Sender extends Thread
  {
  
    PRivate DatagramConnection dc;
  
    private String address;
  
    private String message;
  
    public Sender(DatagramConnection dc)
    {
      this.dc = dc;
      start();
    }
  
    public synchronized void send(String addr, String msg)
    {
      address = addr;
      message = msg;
      notify();
    }
  
    public synchronized void run()
    {
  
      while (true)
      {
  
        // If no client to deal, wait until one connects
        if (message == null)
        {
          try
          {
            wait();
          } catch (InterruptedException e)
          {
          }
        }
  
        try
        {
          byte[] bytes = message.getBytes();
          Datagram dg = null;
          // Are we a sender thread for the client ? If so then there's
          // no address parameter
          if (address == null)
          {
            dg = dc.newDatagram(bytes, bytes.length);
          } else
          {
            dg = dc.newDatagram(bytes, bytes.length, address);
            System.out.println(address);
          }
          dc.send(dg);
        } catch (Exception ioe)
        {
          ioe.printStackTrace();
        }
  
        // Completed client handling, return handler to pool and
        // mark for wait
        message = null;
      }
    }
  
  }
  注重联网的时候我们应该在另外一个线程中而不是在主线程中。
  
  服务器端的目的就是启动后监听指定的端口,当客户端连接过来后接受数据并记录下客户端的地址,以便服务器端向客户端发送数据。
  package com.siemens.datagramtest;
  
  import java.io.IOException;
  
  import javax.microedition.io.Connector;
  import javax.microedition.io.Datagram;
  import javax.microedition.io.DatagramConnection;
  import javax.microedition.io.UDPDatagramConnection;
  import javax.microedition.lcdui.Alert;
  import javax.microedition.lcdui.AlertType;
  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.lcdui.StringItem;
  import javax.microedition.lcdui.TextField;
  
  public class Server implements Runnable, CommandListener
  {
  
    private DatagramMIDlet parent;
  
    private Display display;
  
    private Form f;
  
    private StringItem si;
  
    private TextField tf;
  
    private Command sendCommand = new Command("Send", Command.ITEM, 1);
  
    Sender sender;
  
    private String address;
  
    public Server(DatagramMIDlet m)
    {
      parent = m;
      display = Display.getDisplay(parent);
      f = new Form("Datagram Server");
      si = new StringItem("Status:", " ");
      tf = new TextField("Send:", "", 30, TextField.ANY);
      f.append(si);
      f.append(tf);
      f.addCommand(sendCommand);
      f.setCommandListener(this);
      display.setCurrent(f);
    }
  
    public void start()
    {
  
      Thread t = new Thread(this);
      t.start();
    }
  
    public void run()
    {
      try
      {
  
        si.setText("Waiting for connection");
        DatagramConnection dc =(DatagramConnection)Connector.open("datagram://:5555");
  
  
        sender = new Sender(dc);
  
        while (true)
        {
          Datagram dg = dc.newDatagram(100);
          dc.receive(dg);
          address = dg.getAddress();
          si.setText("Message received - "
              + new String(dg.getData(), 0, dg.getLength()));
  
        }
  
      } catch (IOException ioe)
      {
        Alert a = new Alert("Server", "Port 5000 is already taken.", null,
            AlertType.ERROR);
        a.setTimeout(Alert.FOREVER);
        a.setCommandListener(this);
        display.setCurrent(a);
      } catch (Exception e)
      {
        e.printStackTrace();
      }
    }
  
    public void commandAction(Command c, Displayable s)
    {
      if (c == sendCommand && !parent.isPaused())
      {
        if (address == null)
        {
          si.setText("No destination address");
        } else
        {
          sender.send(address, tf.getString());
        }
      }
      if (c == Alert.DISMISS_COMMAND)
      {
        parent.destroyApp(true);
        parent.notifyDestroyed();
      }
    }
  
    public void stop()
    {
    }
  
  }
  
  客户端代码则是建立连接后向服务器端发送数据,并等待接受服务器返回的数据。
  package com.siemens.datagramtest;
  
  import java.io.IOException;
  
  import javax.microedition.io.ConnectionNotFoundException;
  import javax.microedition.io.Connector;
  import javax.microedition.io.Datagram;
  import javax.microedition.io.DatagramConnection;
  import javax.microedition.lcdui.Alert;
  import javax.microedition.lcdui.AlertType;
  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.lcdui.StringItem;
  import javax.microedition.lcdui.TextField;
  
  public class Client implements Runnable, CommandListener
  {
  
    private Da

Tags:教程 JME 基于

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接