IMZRH的日志

努力成为一个有用的人

导航

agsXmpp框架使用经验两则

Posted on 2009-04-29 04:29  张荣华  阅读(4842)  评论(5编辑  收藏  举报

最近在项目中应用到了agsxmpp框架,主要的目的是在项目中嵌入一个实时沟通(包括文本、语音聊天,群会议)模块,通过比较后决定采用agsxmpp框架实现,开始的时候很容易,根据官网上提供的示例进行修改,很快的实现了功能。但是今天在测试的时候发现了一个问题,在早期的开发过程中,服务器和客户端都是在同一台机器上,所以很容易连接成功,但是现在测试的时候服务器和客户端不是一台机器上就连接不上了。在连接时报错如下:

---------------------------
错误
---------------------------
连接语音服务器失败!可能的错误原因为: 无法将数据写入传输连接: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。。
---------------------------
确定  
---------------------------

---------------------------
错误
---------------------------
连接语音服务器失败!可能的错误原因为: 一个封锁操作被对 WSACancelBlockingCall 的调用中断。 192.168.7.245:10000
---------------------------
确定  
---------------------------

开始的时候怀疑是防火墙的原因,因为在本机是不会报错的,只有连接远程主机的时候才报错。但把服务器和客户端的防火墙都关闭后还是不行,错误依旧。看来不是设置的事,肯定是代码写的有问题了,后来费了好多事,终于找到了原因:官网提供的示例是以ri.Jid = new Jid("item" + i.ToString() + "@localhost");的样式建立的jid,我修改代码时没有将localhost改为服务器的IP,所以导致连接远程服务器无法成功。既然找到了原因就好办了,将所有的localhost都修改为服务器的IP就可以了。

本来以为万事大吉了,但没想到还遇到了一个问题,就是我原先引用的是0.9.2.0版本的,现在改为1.1.0.0版本的了,结果发现两个版本有些细节的要求不一样,比如我原先是以ri.Jid = new Jid(ri.Name, SocketIP, dtUsers.Rows[i]["USER_SYSID"].ToString());的样式循环建立用户列表发到客户端的,(请注意第三个参数resource本来是用不到的,但我赋值为用户ID,然后在客户端使用),但这行代码在0.9.2.0中可以使用到了1.1.0.0中就报agsXMPP.Idn.Stringprep Exception,导致客户端得不到用户列表。将上面的代码改为ri.Jid =  new Jid(ri.Name + "@" + SocketIP);终于一切正常。