龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

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

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以在J2ME中基于UDP协议开发联网应用程序。在MIDP2.0中,添加了UDPDatagramConnection这个接口,他扩展了DatagramConnection并添加了两

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

  }

  注重联网的时候我们应该在另外一个线程中而不是在主线程中。 三层交换技术 交换机与路由器密码恢复 交换机的选购 路由器设置专题 路由故障处理手册 数字化校园网解决方案


  服务器端的目的就是启动后监听指定的端口,当客户端连接过来后接受数据并记录下客户端的地址,以便服务器端向客户端发送数据。

  
  

精彩图集

赞助商链接