以把一个BREW上功能移植到Symbian平台为例,看一下具体的实现方式。由于网络应用的重要地位,这里先使用BREW3.x中ISockPort建立一个TCP的连接。首先,初始化服务器的地址:
pME->m_saSockAddr.wFamily = AEE_AF_INET;
pME->m_saSockAddr.inet.port = HTONS(SERVER_PORT);
INET_PTON(pMe->saSockAddr.wFamily, SERVER_ADDR, &(pMe->saSockAddr.inet.addr));
然后创建并打开ISockPort,
ret = ISHELL_CreateInstance(pME->m_pIShell, AEECLSID_SOCKPORT, (void**)&(pME->m_pISockPort));
ret = ISOCKPORT_OpenEx(pME->m_pISockPort, AEE_AF_INET, AEE_SOCKPORT_STREAM, 0);
接下来建立TCP连接,
ret = ISOCKPORT_Connect(pME->m_pISockPort, &pME->m_saSockAddr);
if (AEEPORT_WAIT == ret){
ISOCKPORT_WriteableEx(pME->m_pISockPort,&pME->m_cbWriteCallback, MyApp_TryConnect, pME);
return;
}
建立连接成功后,就可以从服务器读写数据了
ret=ISOCKPORT_Write(pME->m_pISockPort,pME->m_caWriteBuffer + pME->m_nBytesWritten, BUFFER_SIZE - pME->m_nBytesWritten);
// retry later
if (AEEPORT_WAIT == ret){
ISOCKPORT_WriteableEx(pME->m_pISockPort, &pME->m_cbWriteCallback, CApp_TryWrite, pME);
return;
}
最后,取消回调并释放ISockPort接口。
CALLBACK_Cancel(&pME->m_cbReadCallback);
CALLBACK_Cancel(&pME->m_cbWriteCallback);
IBASE_Release((IBase*)(pME->m_pISockPort));
Symbian 是使用C++的,移植以上功能的时候,需要使用Symbian OS 中客户端服务器框架。首先从 CActive 创建自己的对象:
#include <e32base.h>
#include <in_sock.h>
#include <es_sock.h>
class CTCPConnector : public CActive
{
private:
// these are some of the classes relevant to opening a TCP connection:
TInt iState;
RSocket iSocket;
RSocketServ iSocketServer;
RHostResolver iResolver;
TInetAddr iAddress;
…
}
然后定义服务方法
void CTCPConnector::MakeOutgoingConnectionL(const TDesC& aHost, TInt aPort){
...
iState = EGetByName;
iResolver.GetByName( /* parameters required for resolving a host */);
...
}
接下来实现建立连接的方法
void CSEIConnector::ConnectSocketL(void){
...
iSocketServer.Connect();
...
iSocket.Open(iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
...
iSocket.Connect(/*parameters required connecting */);
...
iSocket.Connect(iAddress, iStatus);
iState = ESocketConnect;
...
}
最后实现RunL() 来处理事件通知:
void CTCPConnector::RunL(){
TInt error = KErrNone;
switch(iState)
{
case EGetByName:
{
ConnectSocketL();
break;
}
case ESocketConnect:
{
ProcessRequestL();
break;
}
}
}
在Symbian中的工作流程是这样的,客户端调用MakeOutgoingConnectionL(), MakeOutgoingConnectionL()首先发起 DNS 查询,如果域名被成功解析,则开始调用CTCPConnector::RunL()。在CTCPConnector::RunL()中,先要检查请求的状态,如果当前状态值是EGetByName就可以调用ConnectSocketL()了。在ConnectSocketL()中,要创建客户端和服务器的类以及相应的RSocket 和 RSocketServer。最后,调用RSocket::Connect() 来创建正在的TCP连接,无论连接成功或者失败,都将再一次运行RunL(),具体的数据读写过程以此类推。
分享到:
相关推荐
深入brew开发,很好的参考进阶资料。对于学习C语言也很有一定的帮助。
非常全面的介绍了BrewMP的开发工具,应用开发流程,常用的API接口,应用开发技巧以及移植的流程等。
BREW开发培训系列——高级——BREW 面向对象特点及其应用.pdf
BREW开发培训系列——BREW平台与演进——BREW概述、发展现状及趋势
联通博路编写的开发者进阶教程,pdf版本,转载。 共18部分: 第一部分目录如下: Brew概述 Brew技术演进 ...Brew与其他技术的对比 以后各部分为具体接口介绍,对刚接触Brew系统的开发人员应该有一定帮助。
(BREW 开发者 进阶教程)第1章 BREW平台与演进 第2章 BREW3.1图像处理高级编程 第3章 BREW多媒体接口 第4章 IVocoder接口介绍 第5章 ICamera接口 第6章 BREW 常用接口介绍 第7章 BREW 3.1 文件系统 第8章 BREW ...
此书简洁而深入的介绍了brew的基本原理,非常适合已经入门但是还未从整体上掌握的brew开发者。
随着手机软件市场的不断扩大,越来越多的开发者们致力于移动应用的开发,本文简要论述了在BREW和J2ME平台下应用程序开发的特点和区别,并从接口和框架设计方面提出了易于进行平台移植的方法,以便于帮助那些准备将...
BREW平台及业务介绍BREW平台及业务介绍
———————————————————————————————————————————— 替换bottles 镜像源(可选) 该镜像是 Homebrew 二进制预编译包的镜像。 临时替换 export HOMEBREW_BOTTLE_DOMAIN=...
BREW开发培训系列——高级——BREW 语音呼叫业务
基于brew嵌入式平台的面向对象的应用开发方案.pdf 基于BREW手机游戏的内存管理研究.pdf 基于BREW应用中的随机地图的铺设研究.pdf 基于多平台的移动终端网络应用研究.pdf 类多态机制在BREW平台下的实现.pdf 人工智能...
BREW 开发者 进阶教程(共18章)BREW 开发者 进阶教程(共18章)BREW 开发者 进阶教程(共18章)BREW 开发者 进阶教程(共18章)
5.基于BREW 平台的POC 应用研究及业务发展分析.pdf 6.基于BREW 平台的数据压缩.pdf 7.基于BREW 应用中的随机地图的铺设研究.pdf 8.基于BREW平台的手机应用绘图的优化方法.pdf 9.基于BREW与组件技术的智能手机邮件...
基于brew平台下短信增值业务的设计与实现,张冬梅,,在3G移动通信网络中,基于短消息业务平台提供的短消息增值业务将有着巨大的市场需求。本文通过对BREW(Binary Run Environment Wireless,无线�
使用BREW开发定位应用程序使用BREW开发定位应用程序使用BREW开发定位应用程序使用BREW开发定位应用程序使用BREW开发定位应用程序使用BREW开发定位应用程序
BREW编程经验——Dialog机制的使用方式.doc
为了优化全网增值业务合作管理,促进业务健康发展,在《中国电信移动增值业务合作管理 ... 现发布《中国电信全网增值业务合作管理办法(V2.0版)》,包括总册、短信业务分册、彩信业务分册、WAP业务分册、BREW业务...
brew 手机游戏开发实例brew 手机游戏开发实例brew 手机游戏开发实例brew 手机游戏开发实例