科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在J2ME中实现基于UDP协议通讯程序

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以在J2ME中基于UDP协议开发联网应用程序.

作者:mingjava 来源:J2ME开发网 2007年12月28日

关键字: J2ME 实现 UDP协议 通讯程序

  • 评论
  • 分享微博
  • 分享邮件
在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以在J2ME中基于UDP协议开发联网应用程序。在MIDP2.0中,添加了UDPDatagramConnection这个接口,他扩展了DatagramConnection并添加了两个方法getLocalAddress()和getLocalPort()。我们知道UDP服务是不可靠的,如果你希望开发更可靠的联网应用的话可以采用SocketConnection,因为TCP服务是面向连接且可靠的。我们还必须清楚地一点是以上所说的各种连接方式都不是MIDP规范中规定必须实现的。因此在使用之前请参考特定设备的开发文档。MIDP中只有Http连接是必须支持的。

  同样,我们要获得DatagramConnection的话,必须通过Connector的open方法,其中的URL应该满足如下的形式。
  1. datagram://localhost:5555 这样的话表示建立了一个客户端模式的连接。在指定ip:localhost和指定端口:5555
  2. 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;
    }
  }

}

  注意联网的时候我们应该在另外一个线程中而不是在主线程中。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章