免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2475 | 回复: 0
打印 上一主题 下一主题

API JSR-205 JSR-102 整理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-29 14:26 |只看该作者 |倒序浏览
开发手机程序,最能想到的就是对SMS(Short Messaging Service), MMS(Multimedia Messaging Service),Email的支持。
对于SMS, MMS,sun官方已经出了个jsr-205,jsr-102规范对其进行了完善的支持。
一。前言

学习 Java™ Micro Edition(Java ME)无线消息 API。这个专栏将从几个简单的代码示例开始,随后讨论它为企业开发人员带来的各种机会。
移动电话最常见的一个特性就是消息传递。文本消息或短消息(SMS)自引入之初,已经变得越来越流行。当然,多媒体消息(MMS)又为其增加了图片、声音和视频等多媒体内容。

在 MMS 刚出现时,有些专家预言它会取代 SMS,如果它的价格不是这么高的话,这个预言确实有可能会成为现实。即便如此,这种能在手机之间传递多媒体内容的功能还是渐受青睐。最近手机电子邮件的 成功,意味着未来手机消息传递的主要形式可能是电子邮件,但是要到那一步还有很长的一段路要走。

二。无线消息
JSR-205 中定义的无线消息 API(WMA)2.0 是用于无线消息的一组可选 API。WMA 的连接基于通用连接框架,该框架是在基于 CLDC 的 Java ME 架构中进行通信的基础。WMA 2.0 向后兼容 WMA 1.1,添加了对发送和接收多媒体消息的支持。换句话说,无线消息 API 提供了无线通信的高级抽象。它将传输层完全隐藏,因而所要做的工作只是创建消息、发送消息和接收消息。
WMA 支持文本消息、小区广播和多媒体消息。文本消息很简单,大多数人都知道它是什么。SMS 消息极为流行,而且已经成为日常生活的一部分。WMA 支持发送和接收文本消息。发送非常简单:只需定义目标地址和文本,文本被称为净荷(payload)。接收稍微复杂些,因为需要应用程序能够侦听进入的消息。在下面的示例中将看到如何读取进入的消息。


消息内容

二进制消息顾名思义就是带有二进制内容的消息。内容可以是要传递给应用程序或者从应用程序传递给其他客户机或服务器的任何内容。多部分消息可以包含多块媒体,例如文本、音频和视频。

小区广播可能是最不为人所知的消息类型。小区广播服务是一种数据服务,在这种服务中,消息由基站广播,由侦听这个基站的每个移动站接收。这个服务是单向的,这意味着 WMA 只能用来接收这类消息。

发送和接收

发送文本消息很简单。步骤如下:

设置手机号码(地址)。
用 Connector 接口创建 MessageConnection。
创建新消息,并把它的类型转换成 TextMessage。
设置净荷。
通过调用 send() 方法并向方法传递 Message 实例,发送消息。
发送的消息中包含的发送人信息,与正常发送消息时的相同。显示了使用 Java ME WMA 发送消息的代码。


java 代码

try {   
  String addr = ?ms://+358401234567?   
  MessageConnection conn = (MessageConnection) Connector.open(addr);   
  TextMessage msg =   
   (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);   
  msg.setPayloadText(?his is a test message!?;   
  conn.send(msg);   
} catch (Exception e) {   
...   
}   


接收文本消息略微复杂,但也不是太复杂。在一个端口上打开 MessageConnection (在这个示例中是 5432)并从 MessageConnection 读取进入的消息。可以用 instanceof 测试消息的类型。要接收有消息进入的通知,应用程序必须实现 MessageListener 接口,所以要编写比  更复杂一些的代码,才能让它真正工作。
java 代码

try {   
  String addr = ?ms://:5432?   
  MessageConnection conn = (MessageConnection) Connector.open(addr);   
  Message msg = null;   
  while (someExitCondition) {   
    msg = conn.receive();   
    if (msg instanceof TextMessage) {   
           TextMessage tmsg = (TextMessage)msg;   
           String receivedText = tmsg.getPayloadText();   
           // respond with the same text with ?hanks.?   
     tmsg.setPayloadText(?hanks?;   
     conn.send(tmsg);   
    } else {   
       // Received message was not a text message, but e.g. binary   
       ...   
    }   
  } // end while   
  } catch (Exception e) {   
   ...   
}   

发送二进制消息与发送文本消息很相似。首先需要把数据放在字节数组中,然后创建 MessageConnection(如 清单 3 BINARY_MESSAGE。
java 代码
try {   
  String str = "Hello!";   
  byte[] msg = str.getBytes();   
  String addr = "sms://+358401234567";   
  MessageConnection conn = (MessageConnection) Connector.open(addr);   
      
  BinaryMessage bm = (BinaryMessage)mc.newMessage   
                     (MessageConnection.BINARY_MESSAGE);   
  if (url!= null)   
    bm.setAddress(url);   
    bm.setPayloadData(msg);   
    conn.send(bm);   
    }   
  catch(Exception e) {   
}   


三类消息传递

WMA 消息的传递可以分成:服务器到手机、手机到服务器和手机到手机。

在服务器到手机 消息传递中,CRM 应用程序可以向手机应用程序发送数据,手机应用程序可以接收数据并用对用户友好的方式呈现数据。在手机到服务器 的消息传递中,手机应用程序可以向服务器发送数据(HTTP 连接也可以做这项工作,但 HTTP 连接不可能总是存在)。在手机到手机 的消息传递中,用户可以向好友的手机发送应用程序数据或游戏数据,进行游戏项目交换及其他操作。

上面大部分文字摘自 www.ibm.com/developerworks/cn/java/wi-arch32.html   

整理成一个工具类

java 代码

public final static void sendTextMessage(String phone, String text)   
    throws IOException {   
        checkPhoneNumber(phone);   
        MessageConnection conn = (MessageConnection) Connector.open("sms://"   
                + phone);   
        TextMessage msg = (TextMessage) conn   
                .newMessage(MessageConnection.TEXT_MESSAGE);   
        msg.setPayloadText(text);   
        conn.send(msg);   
    }   
        
    public final static void sendTextBinary(String phone, byte[] text)   
    throws IOException {   
        checkPhoneNumber(phone);   
        MessageConnection conn = (MessageConnection) Connector.open("sms://"   
                + phone);   
        BinaryMessage bm = (BinaryMessage) conn   
                .newMessage(MessageConnection.BINARY_MESSAGE);   
   
        bm.setAddress(phone);   
        bm.setPayloadData(text);   
        conn.send(bm);   
   
    }   
      
    private final static void checkPhoneNumber (String phone)   
    throws PhoneNumberException{   
        if(phone == null   
                || phone.equals("")){   
            throw new PhoneNumberException("手机号码不能为空!");   
        }   
        try{   
            Integer.parseInt(phone);   
        }catch(NumberFormatException n){   
            throw new PhoneNumberException("手机号码必须为数据!");   
        }   
    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP