关于管理蓝牙SDP记录和游戏服务器之间连接的若干建议
来源:J2ME开发网 作者:mydeman编… 出处:综艺读书 2006-10-16放眼市场上各种各样的JSR82 MIDlets,有一点需要注意,一些MIDlets并没有以一种合适的方式处理服务发现协议(SDP)记录。
在蓝牙领域内SDP记录是非常难以领会的,但是在JSR82中并没有这么困难。
这篇短小的文章会就SDP记录的一般问题给予一些建议。
我们先简要地看看为什么需要SDP记录。SDP记录是一种用来确认设备上的一种特定服务的记录。没有SDP记录,一部移动电话就不可能检测到另一个设备上的服务。大部分的电话拥有一个以上的SDP记录,例如,它们很可能有对于L2CAP和串口的记录。
关于SDP记录最主要的问题的就是很多开发者忘记了从数据库中删除SDP记录。这就导致了最终用户不能重新连接来运行游戏。
下面两张简单的图片说明了这个问题:
图1 SDP连接成功
如图1所示两个MIDlets正在试图进行连接,并且连接成功。
图2 SDP连接失败
在图2中我们可以看到,一个MIDlet再一次尝试连接(可能是同一用户或者一个新用户)。连接失败,因为这个MIDlet试图连接的SDP记录没有监听器,所以Bluetooth栈除了拒绝连接别无选择。经常发生的情况是,客户端MIDlet接收到两者的SDP记录,但是只选择第一个进行连接,因为它只希望在一个服务器上有一个SDP记录。
在下面的代码示例中了,展示了一个简单的服务器。这个例子关注了必须的close()调用。
例子:
public class SEMCSPPServer extends Thread
{
private StreamConnectionNotifier server = null;
private StreamConnection sppConnection = null;
public SEMCSPPServer()
{
// This will create create an SDP record in the dB
try
{
server = (StreamConnectionNotifier)Connector.open( "btspp://localhost:ea
}
catch( Exception e ) {}
}
public void run()
{
// Wait for connections
try
{
sppConnection = server.acceptAndOpen();
}
catch( Exception e ) { e.printStackTrace(); }
// Let the server do something fun here
try
{
// Open the Streams to be used for communications
InputStream in = sppConnection.openInputStream();
OutputStream out = sppConnection.openOutputStream();
// Let the server do something fun here
while()
{
}
// Server is done, now cleanup
// Close the Streams
try
{
in.close();
}
catch( IOException ioe ) {}
try
{
out.close();
}
catch( IOException ioe ) {}
in = null;
out = null;
}
catch( Exception e ) {}
// Close the Connection
try
{
sppConnection.close();
}
catch( IOException ioe ) {}
sppConnection = null;
// To make it possible for a client to re-connect
// we need to remove the current SDP record
// If the MIDlet ends here we SHOULD still
// close the notifier, but the MIDlet environment will
// clean-up after us
server.close();
} // run
}
自然地,你就拥有了几种类型不同的服务器管理者,它们管理所有的服务器连接,并且使SDP记录重新利用,例如,有一种服务器管理者始终监听连接。例如,在一个多玩家的蓝牙游戏中允许玩家随时进入和退出。
服务器管理者例子:
// A simple server handler
public class SEMCSPPServerHandler
{
private StreamConnectionNotifier server = null;
private StreamConnection sppConnection = null;
public SEMCSPPServerHandler()
{
// This will create create an SDP record in the dB
try
{
server = (StreamConnectionNotifier)Connector.open( "btspp://localhost:ea
}
catch( Exception e ) {}
while( true )
{
// Wait for connections
try
{
sppConnection = server.acceptAndOpen();
}
catch( Exception e ) { e.printStackTrace(); }
if( sppConnection != null )
{
SEMCSPPServer sp = new SEMCSPPServer( sppConnection );
sp.start();
sp = null;
}
// The server handler is now ready to deal with new connections
// Note, there is no need to create a new SDP record
}
// Remove the SDP record
server.close();
}
}
// A simple server class to deal with 1 connection
public class SEMCSPPServer extends Thread
{
private StreamConnection sppConnection = null;
public SEMCSPPServer( StreamConnection sppConnection )
{
this.sppConnection = sppConnection;
}
public void run()
{
try
{
// Open the Streams to be used for communications
InputStream in = sppConnection.openInputStream();
OutputStream out = sppConnection.openOutputStream();
// Let the server do something fun here
while()
{
}
// Server is done, now cleanup
// Close the Streams
try
{
in.close();
}
catch( IOException ioe ) {}
try
{
out.close();
}
catch( IOException ioe ) {}
in = null;
out = null;
}
catch( Exception e ) {}
// Close the Connection
try
{
sppConnection.close();
}
catch( IOException ioe ) {}
sppConnection = null;
// The server is no longer active
} // run
}
需要学习的经验
如果Connector. open()调用没有很好的管理,除非退出MIDlet(这种情况下SDP数据库被在一个清空)否则要重新连接到那个SDP记录是不可能的。现实生活中,你必须要退出游戏然后重新启动,这将会使最终用户灰心地离开。
当然,在你可以的应用中可能包括多于一个的SDP记录,但是对于适当的功能性需求要确保MIDlet监听所有的记录。
原文地址:http://developer.sonyericsson.com/site/global/techsupport/tipstrickscode/java/p_advice_bluetooth_sdp_game+server.jsp
·双核服务器技术 (5542篇文章)
·网站服务器的选型 (6600篇文章)
·网吧流媒体服务器 (5311篇文章)
·刀片服务器专题 (4616篇文章)
·网吧服务器专栏 (4528篇文章)
·网络管理实用手册 (18187篇文章)
·服务器配置专栏 (8814篇文章)
·IIS服务器应用技巧 (5103篇文章)
·打造安全服务器 (11204篇文章)
·集成技术:.NET单挑J2EE (0次浏览)
·集成Eclipse、Lomboz和JBoss开发J2EE应用 (0次浏览)
·经验交流:学习J2EE流程中的经验和教训 (0次浏览)
·淡入淡出式显示Swing容器组件 (0次浏览)
·J2ME专业手机游戏开发基础 (0次浏览)
·集成技术:.NET单挑J2EE (0次浏览)
·集成Eclipse、Lomboz和JBoss开发J2EE应用 (0次浏览)
·经验交流:学习J2EE流程中的经验和教训 (0次浏览)
·淡入淡出式显示Swing容器组件 (0次浏览)
·对于Struts和Spring两种MVC框架的比较 (106次浏览)
·Java IDE实用对比:Eclipse、NetBeans、Intel (93次浏览)
·我的j2me创意--Wap浏览器的源代码 (76次浏览)
·DoJa平台手机游戏的开发与移植 (67次浏览)
·J2ME中读取Unicode和UTF-8编码文件 (59次浏览)
·j2me创意--Wap浏览器的源代码 (53次浏览)
·IIS+Resin集成多个站点和数据库连接池 (50次浏览)
·GT4 开发:从头开始进行相互的身份验证 (46次浏览)
·J2ME应用程序架构模型 (44次浏览)
·集成技术:.NET单挑J2EE 06-27
·集成Eclipse、Lomboz和JBoss开发J2EE应用 06-25
·经验交流:学习J2EE流程中的经验和教训 06-21
·淡入淡出式显示Swing容器组件 06-19
·如何开发基于JBoss的J2EE应用 06-06
·初学j2me必读 网友学习笔记 05-29
·对于Struts和Spring两种MVC框架的比较 05-27
·Session机制使用的详细讲解 05-27
·使用Java NIO提高服务端程序的性能 05-27
|
|||
| ·ACDSEE专题教程-下载使用 ·迅雷专题教程-下载使用 ·Windows XP频道 ·Windows Vista频道 ·Windows 2000频道 ·win2003频道 ·Freebsd频道 ·Oracle频道 |
·Linux频道 ·Windows频道 ·邮件服务器专题 ·协议大全 ·数据恢复指南教程 ·FreeBSD使用教程 ·Linux数据库宝典 ·Linux基础知识 |
||
| · 秘密:Vista隐蔽的动态屏保 · 腾讯开发新电子宠物--QQ熊 · 惠普否认2999元PC有价无货 |
· 驱逐Win系统“流氓”文件 · WinXP中获取未使用的IP地址 · 尝试format C:格式化硬盘? |
| · 在DOS下恢复回收站中的文件 · 拯救WinXP崩溃的救命稻草 · Linux系统中超级权限的应用 |
· 搜狗PK谷歌:谁能代言拼... · 昨日重现,一键GHOST轻松.. · 实现Web迅雷在空闲时杀毒 |
| · AVIFile函数制做AVI文件 · VC中链接动态链接库的方法 · 熊猫烧香核心源码(Delphi) |
· DateDiff函数祥解 · JavaScript去除空格的三种 · js效果 图片加载进度实时.. |
| · SQL Server数据库优化方案 · Oracle的初学者入门心得 · JSP连接Mysql数据库 |
· Photoshop为美女做艺术处理 · 用Freehand创建发光字特效 · 设计自己的个性QQ动态表情 |






