BlackBerry 应用程序开发者指南 第一卷:基础–第7章 使用数据报(Datagram)连接
7
第7章 使用数据报(Datagram)连接
数据报连接
使用UDP连接
使用Mobitex网络
发送和接收短消息(SMS)
数据报连接
通过利用UDP(User Datagram Protocal,用户数据报协议),BlackBerry设备支持数据报连接。应用程序使用UDP和标准的网络服务通信。
数据报是应用程序发送到网络的独立数据包。对于Datagram的负载字节数组来说,一个Datagram对象是一个包装器。为获得这个字节数组的一个引用,调用getData()方法。
和HTTP连接不一样,数据报连接不稳定:数据包以任意的顺序到达,并且传输得不到保证。应用程序的责任是确保请求数据报的数据负载根据网络服务的标准来格式化,这个标准是在数据报传播上的。应用程序也必须能解析从服务器返回发送的数据报。
使用数据报连接来发送短消息。为获得更多信息,参看121页的“发送和接受SMS”。
使用UDP连接
为使用UDP连接,你必须有一个你自己的基础设施来连接无线网络,包括一个GPRS(General Packet Radio Service,通用分组无线业务)网络的APN(Access Point Name)。
注:数据报连接没有使用BlackBerry的基础设施,因此连接没有加密。模拟器的APN是net.rim.gprs.
javax.microedition.io.DatagramConnection接口,扩展了Connection类,它定义了发送和接受数据报的连接。Datagram接口定义了在数据报连接上发送和接受的数据包。
注:使用UDP连接需要你和服务商紧密联系。联系你的服务商确认UDP连接是否支持。
如果你的服务商不支持多个PDP上下文,那么你可能没有建立一个UDP连接。一个PDP上下文为发送消息的BlackBerry.net.APN保留。尽管如此,你可以为UDP使用blackberry.net 当作APN。联系你的服务商以获得更多信息。
获得一个数据报连接
使用下面的格式调用Connector.open().指定udp为你的协议。将返回的对象转化为一个DatagramConnection。
(DatagramConnection)Connector.
open("udp://host:dest_port[;src_port]/apn");
参数
描述
host
指定点阵ASCII十进制格式的主机地址
dest_port
指定了主机地址的目标端口(接受信息时是可选的)。
src_port
指定本地源端口(可选)。
apn
指定字符串形式的网络APN。
注:可以在相同的端口上收发UDP数据报。
为了在UDP连接上发送数据,在连接字符串里指定目标端口。为了在UDP连接上接收数据,在连接字符串里指定源端口。为了接收指定主机的所有端口上的数据报,省略目标端口。
注:为了在一个非GPRS的网络里打开一个连接,不要指定APN。在源端口后包含斜线”/”.例如CDMA网络连接的地址应该是udp://121.0.0.0:6343/.
创建一个数据报
调用DatagramConnection.newDatagram().
Datagram outDatagram = conn.newDatagram(buf, buf.length);
将数据加入到数据报中
调用Datagram.setData().数据的格式由接收它的服务决定。
byte[] buf = new byte[256];
outDatagram.setData(buf, buf.length);
在UDP连接上发送数据
在数据报连接山调用send()。
conn.send(outDatagram);
注:如果应用程序试图在一个UDP连接上发送一个数据报,并且接收者没有监听指定的源端口,一个IOException会抛出.
接收UDP连接上的数据
调用数据报连接上的receive().
byte[] buf = new byte[256];
Datagram inDatagram = conn.newDatagram(buf, buf.length);
conn.receive(inDatagram);
注:receive()方法会阻塞其他操作,直至它接收完一个数据包.如果你知道正在发送的数据格式,转化他们为合适的格式.
从数据报提取数据
在数据报连接上调用getData()方法。如果你知道正在接收的数据类型,将数据转化为合适的格式。
String received = new String(inDatagram.getData());
关闭UDP连接
和MIDP框架中所有连接一样,调用输入和输出流以及数据报上的close()方法,
使用Mobitex网络
DatagramConnectionBase类提供了方法来处理Mobitex网络上的BlackBerry数据报连接以及传输操作。
打开一个Mobitex数据报连接
调用Connector.open(),然后将返回的对象转化为一个DatagramConnectionBase。DatagramConnectionBase类实现了DatagramConnection,并且提供了额外的方法,对注册一个数据报状态监听者来说,这些方法是必要的。
为提供一个参数给Connector.open(),连接字符串使用下面的格式:
mobitex:<type>:<MAN>
参数
描述
<type>
接受下列值:“TEXT”,”DATA”,”STATUS”,或”HPDATAHPID(在这些值中,JPID的格式是ASCII十进制)
<MAN>
Mobitex访问号码(Mobitex Access Number),接受ASCII十进制格式。
注:如果你打开一个服务器连接(一个监听者),MAN留为空白。
// The datagram connection <type> is DATA and the MAN is left blank for an incoming
// connection.
DatagramConnection dc = (DatagramConnection)Connector.open("mobitex:DATA:");
DatagramConnectionBase dcb [...]
Confach发表于 April 23, 2008 6:34 am | 留言 |文档
BlackBerry 应用程序开发者指南 第一卷:基础–第6章 连接网络
6
第6章 连接网络
HTTP和socket连接
使用HTTP连接
使用HTTPS连接
使用socket连接
使用端口(port)连接
使用蓝牙序列端口连接
HTTP和Socket连接
尽管你可以通过socket连接实现HTTP,但是最好使用HTTP连接,因为socket连接不支持BlackBerry MDS服务特性,例如push。也最好使用HTTP连接,因为比起那些使用HTTP连接的应用程序,使用socket连接的应用程序明显需要更多的带宽。
注:如果你使用socket连接,将你的应用程序设计为适应断断续续的无线网络连接。例如,如果你的程序发生错误时,它会重新打开连接。
使用HTTP连接
注:使用BlackBerry Internet Service Browser的java程序不会启动HTTP,HTTPS和TCP连接。
打开一个HTTP连接
为了打开一个HTTP连接,调用Connector.open(),指定http为协议。将返回的对象转化为一个HTTPConnection或者StreamConnection对象。HttpConnection是一个StreamConnection,它提供访问指定HTTP功能,包括HTTP头和其他HTTP资源。
HttpConnection conn = null;
String URL = "http://www.myServer.com/myContent";
conn = (HttpConnection)Connector.open(URL);
设置HTTP请求方式
为设置HTTP请求方式(GET或POST),调用HttpConnection.setRequestMethod().
conn.setRequestMethod(HttpConnection.POST);
设置或获取头字段
为HTTP请求或HTTP响应消息设置或获取头字段,调用HttpConnection 上的getRequestProperty() 或setRequestProperty()。
conn.setRequestProperty("User-Agent", "BlackBerry/3.2.1");
String lang = conn.getRequestProperty("Content-Language");
发送和接受数据
为发送和接受数据,调用HTTPConnection的openInputStream()和openOutputStream()获得输入和输出流。
InputStream in = conn.openInputStream();
OutputStream out = conn.openOutputStream();
代码实例
HttpFetch.java 实例使用了一个HTTP 连接来获取数据。它遵循下列步骤:
创建一个连接线程。
定义一个方法获取数据。
定义一个方法将数据显示给用户。
定义一个方法退出应用程序。
定义应用程序构造子。
注:HTTPFetch.java实例需要你在应用程序工程里创建资源文件,并且定义需要的资源键值。参看125页“本地化应用程序”获得更多信息。
例:HTTPFetch.java
/**
* HTTPFetch.java
* Copyright (C) 2001-2005 Research In Motion Limited. All rights reserved.
*/
package com.rim.samples.docs.httpfetch;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.i18n.*;
import net.rim.device.api.system.*;
import javax.microedition.io.*;
import java.io.*;
import com.rim.samples.docs.baseapp.*;
import com.rim.samples.docs.resource.*;
public class HTTPFetch extends BaseApp implements HTTPFetchResource [...]
Confach发表于 April 22, 2008 10:09 pm | 留言 |文档
