永发信息网

如何编写一个即时通讯软件

答案:2  悬赏:0  手机版
解决时间 2021-02-18 18:10
  • 提问者网友:呐年旧曙光
  • 2021-02-18 13:40
如何编写一个即时通讯软件
最佳答案
  • 五星知识达人网友:零点过十分
  • 2021-02-18 13:56
可以用bmob做后端,有即时通讯的demo
昨天下班前发布了最新的Bmob_IM_V1.1.2版本的SDK和应用Demo,还未正式通知大家,但还是有人察觉到了,那么,这一次版本更新了什么呢?

主要是针对大家都比较关心的问题进行了集中解决。

一、更新功能:

1、新增支持陌生人聊天,允许发送给非好友用户;

2、新增支持自定义消息发送,便于开发者扩展;

3、新版本大幅度增加稳定性和及时性,保证百分百到达;

4、排除web后端推送对客户端的影响。

二、更新讲解:

1、如果你希望能和所有人(不局限于好友关系)进行聊天,那么这一版本就解决了这个问题。

如果你想看到效果,可以点击附近的人,你找到一个非好友用户,再查看他的资料,这一页面下方有个“发起会话”的按钮,这里就可以和陌生人聊天啦。(不要问我,为什么我搜索附近的人没数据呢?你一个新建的key,连注册用户都没有,那附近的人怎么可能会显示出来?)

2、如果你希望发送任意格式的消息,那么你只需要调用如下方法即可:

BmobChatManager.getInstance(this).sendJsonMessage(String json, String targetId);
复制代码
注:第一个参数:你要发的Json格式的字符串,第二个参数,就是对方的objectId

但关于发送的Json格式遵循一定的规范,具体可查看:点我。

然后,你就需要在MyMessageReceiver的广播接收器中自行解析你所定义格式的消息啦。

3、V1.1.2版本大幅度增强了及时性和稳定性,能够保证到达率。

由于推送服务有时候会出现消息丢失的情况,并不能保证消息一定被对方接收到,故在此基础上增加了一个定时检测服务,定时时间可以由开发者自行设定。

你需要开启定时检测服务的话,需要在主程序界面的onCreate方法中调用如下方法:

BmobChat.getInstance(this).startPollService(30)
复制代码
然后在onDestory方法里调用如下方法取消检测服务:

BmobChat.getInstance(this).stopPollService()
复制代码

另外,需要在你的AndroidManifest.xml里面加上如下一段代码

<!-- 启动定时检测操作 -->

<service android:name="cn.bmob.im.poll.BmobPollService">

<intent-filter>

<action android:name="cn.bmob.im.service.BmobPollService"/>

</intent-filter>

</service>
复制代码

4、有的同学没有两部真机,会从web后台推送消息给客户端,之前的版本会使得客户端奔溃,这一版排除了后端推送对客户端的影响。

三、使用Bmob_IM_SDK时需要注意的问题如下:

1、请使用两台真机测试,请不要用模拟器来测试,模拟器是接收不到推送消息的。

2、很多人由于没有两部真机,会采用一个手机注册两个不同的账号,这样来回切换账户来测试聊天,这种方式达不到测试的效果,虽然这一版本的改进使得这种方式能够收到消息,但是及时性比较低。而之前的版本,这种方式是收不到消息的,故不建议这样测试,只有两部真机才能达到真实的聊天效果。

3、请到Bmob官网注册申请应用的Application ID并在SplashActivity类中完成初始化操作。

4、有很多人导入了工程后发现有这个错:java.lang.IncompatibleClassChangeError: cn.bmob.im.project,这个是因为BmobIM_V1.1.2是基于BmobSDK_v3.2.3_0919混淆打包的,所以如果你要用的话,这两个包应该是一起导进去的,替换之前的Bmobsdk和BmobIM包。
全部回答
  • 1楼网友:拜訪者
  • 2021-02-18 14:43
利用winsock控件实现局域网通信 对于局域网用户中的编程爱好者来说,如果能自己编一个局域网通信程序,那么这一切将是多么美妙!可是,如果要从头开始完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有较深入的了解,这可不是一件容易的事。而现在有了winsock控件,一切就不同了,它已经替你封装了所有烦琐的技术细节,并提供了访问tcp和udp网络服务的方便途径。你只需通过设置控件的属性并调用其方法就可轻易连接到一台远程计算机中,并且还可以双向交换数据,而这一切都不需你了解tcp的细节或调用低级的winsock apis。   winsock控件可以供microsoft acess、visual basic,visual c++或visual foxpro的开发人员使用。本文以visual basic 6企业版为开发环境来向大家介绍一下winsock控件的初步应用。   winsock控件可以使用两种协议:tcp协议和udp协议,下面来分别介绍。   tcp协议即数据传输协议,它允许创建和维护与远程计算机的连接,使其彼此可以进行数据传输。利用tcp协议通讯必须分别建立客户应用程序和服务器应用程序。   在创建客户应用程序时,必须知道服务器计算机名或其ip地址(存于remotehost属性)、及服务器计算机进行侦听的端口(存于remoteport属性),然后调用connect方法。   创建服务器应用程序时,就应相应设置一个侦听端口(localport属性)并调用listen方法。当客户机需要连接时(connect),就会发生connectionrequest事件。为了完成连接,你可以在connectionrequest事件中调用accept方法。建立连接后,任何一方计算机都可以发送、接收对方数据。如果你要发送数据,需调用senddata方法。当接收到数据时,会发生dataarrival事件,调用dataarrival事件中的getdata方法就可以获得对方传送的数据。   说了这么多,大家可能还是不太了解,让我用程序来详细说明。   如果只有两台计算机,那十分容易。假设甲机为客户机,乙机为服务器,且其ip为192.192.192.1,接收端口为1200(任意选一个未被使用的端口即可)。首先在甲机客户端程序中加入一个winsock控件,起名为sckconnect,并设置其属性:remotehost=“192.192.192.1”,(即甲机ip地址), remoteport=1200(即甲机侦听端口);再在乙机服务器程序中假如一个名为sckserver(0)的winsock控件,其localport=1200,   在乙机服务器程序中form_load()加入   sckserver(0).bind sckserver(0).localport '与本地端口绑定   sckserver(0).listern ' 侦听   如果要传输数据,两机必须先建立连接。建立连接的程序如下:   甲机客户机要先请求连接   sckconnect.connect sckconnect.remotehost, sckconnect.remoteport   此句执行时会触发服务器程序中的connectrequest事件,在此过程中决定是否建立连接,其代码如下:   private sub sckserver_connectionrequest(index as integer,byval requestid as long)   if sckserver.count=1 then   load sckserver(1)   sckserver(1).accept requestid   end if   end sub   连接建立好以后,甲机或乙机都可以应用senddata方法来传送数据。例如,如果是甲机要传送一个叫string的字符串,只需在代码中加入:   sckconnect.senddata string   甲机传送数据后,会触发乙机的dataarrival事件,在其过程中用getdata方法可以收到传送的数据:   private sub sckserver_dataarrival(index as integer,byval bytestotal as long)   dim sdata as string   sckserver(1).getdata sdata,vbstring   end sub   最后别忘了在关闭程序前要先关闭winsock控件   privat sub form_unload(cancel as integer)   if sckconnect.state <>sckclosed then   sckconnect.close   end if   end sub   这只是最简单的情况,如果有多台计算机,那就稍微复杂一些,客户端程序可以不做改动,而服务器端程序需要略做改动:   private sub sckserver_connectrequest(index as integer,byval requestid as long)   dim sip as string   dim i as integer   sip=sckserver(0).remotehostip '获得登录者的ip地址   i=1   do while i<=sckserver.ubound '检查是否已经有该地址的记录   if sckserver(i).remotehostip=sip then '如有,不必加载新的控件   sckserver(i).accept requestid   exit sub   end if   i=i+1   loop   load sckserver(i) '否则,加载新的控件   scksrver(i).accept requestid   end sub   注意到:以上的信息交谈实际上都发生在客户机与服务器之间,如果要做成聊天室那样,每个人的话都可以被别人“听到”,那就要在服务器端的dataarrival事件中,把接收到的客户机传来的数据,转发给所有客户机即可。   其循环转发信息的代码如下:   for i=1 to sckserver.count   if sckserver(i).state<>sckclosed then   sckserver(i).senddata sdata   end if   next i   怎么样,这样我们就作好了自己的通信软件!   不过,不知大家注意到没有,上述程序都需要有一台计算机做为服务器,但如果我们的局域网中没有哪台计算机是可以常开的,也就是说,如果服务器端程序没有运行的话,其他客户端程序也没有办法通信。而这种情况却可能是经常出现的!至少,我所用的局域网那就是这样的。难道这样我们就无法享受局域网通信的乐趣了吗?   不要急,记得吗,我们的winsock控件还有另一个主角:udp协议。   udp协议也称为用户数据报文协议,是一个无连接协议。何谓无连接协议?就是说利用此协议连接时,不必象tcp协议那样:需要服务器端侦听,客户机端请求连接,服务器端建立连接后双方才能通信。另外,udp应用程序可以是客户机,也可以是服务器程序,而不必向tcp应用程序那样必须分别建立客户机程序和服务器程序。   下面,来简述一下udp协议通信的过程:udp协议中,为了在甲乙两机中传输数据,必须先分别设置两机的localport属性;再将甲机的remotehost属性设置为乙机的ip地址,remoteport属性设置为乙机的localport属性值,此时甲机调用senddata方法就可以传送数据了,乙机同样使用dataarrival事件中的getdata方法来获取甲机发送给乙机的信息。如想乙机向甲机传送数据,只需仿照上面的过程设置即可。   用udp协议来传输信息较tcp协议来说简单的多,它无须侦听(listen),也无须请求连接(connect),就象我们平时发信一样,只要写好地址及收信人姓名并发送出去即可。我们可以借此来编写一个局域网中的信息传送程序,下面来简单介绍以下程序中想实现的功能及其基本思想:   首先,我们一定想让程序的图标显示在system tray中而不显示在任务栏中吧!这要是自己编程实现可不是太容易,幸好vb光盘中在common\tools\vb\unsupport\systemtray 中有一个现成的程序,我们只要把它编译成systray.ocx 控件,然后在编写自己的程序时添加此控件即可。其使用方法十分简单,它已经定义好了鼠标单击、双击等事件,你只需编写相应的鼠标事件即可,这里不再多说。   程序的关键是:udp协议在通讯时要知道对方的ip和port,这要如何实现呢?最简单的方法是建立一个配置文件,里面放置了局域网上每台计算机的名字、ip和port,在程序初始化时读出所有信息,在程序中只要知道向谁通信,读出其对应的ip和port即可。   我们知道了每台计算机的ip和port,但我们怎样才能知道其它计算机是否在线呢,否则发出信息别人收不到怎么办?我们可以把此程序放在启动菜单中,让其一开机就自动启动,并最小化,放于窗口右下角的system tray中。在程序刚开始运行时,它会自动向它从配置文件中所知道的所有ip发一条信息:“我来了!”,如果有计算机在线,它会自动返回一条信息:“欢迎!”,如此则两机通信成功,它们会分别把对方的名字加入到自己的可通信人名单中去;如果有计算机关机,程序在退出之前会自动向所有人告别:“再见!”,接收到此信息的计算机会自动把发送信息的计算机的名称从自己的可通信人名单中去除。这样,如果某人不在线,你将无法发送信息给它;如果除了你以外,其他人都没有开机,那你的可发送人名单中将没有任何人。而其它人只要一上线,会自动去你那里“登记”,其他人只要一离线,会自动去你那里“告别”,你可以据此知道他人是否正在使用计算机,你甚至可以以此程序来统计他人的每天上机时间,不错吧!   好了,一个局域网通信的程序的基本模型已经有了,并不复杂吧!大家赶快动手吧,来享受用自己的程序来聊天的乐趣!   不过,要想编写一个出色的程序,不光是要有良好的创意与功能,更重要的是程序的兼容性与容错性。本例中,对错误处理没有做详细的解释,关于这一点,大家可以在winsock控件的error事件及其帮助中找到满意的答案。   另外,还可以从以下几方面来考虑功能的扩充:如传送图形、声音等多媒体信息、局域网互传文件(主动传送)、历史通话记录、系统日志、个人上机时间统计等等,而所有的这一切仅仅取决于你的想象力与你的聪明才智!下面,笔者以传送文件为例来讲一讲其功能实现的代码。   你可以把本地的文件(图形、声音等可以先存成临时文件)以二进制文件的方式来打开它,将其内容全部读入一个byte类型的数组中,本地机代码如下:   dim myfile () as byte   dim position as long   open "filename" for binary as #1   position=0   do while not eof(1)   position=positon+1   redim preserve myfile (1 to position)   get #1,,myfile(position)   loop   close #1   再向远程机传送这个字节数组   sckserver.senddata myfile   远程机收到这个数组之后,再以二进制文件的方式打开一个新目标文件,将数组内容写入这个新打开的文件,如果是bmp图片就将其放入picture图片框中,如果是wav文件,就播放。这样,局域网中的两个人就可以通过语言、图片、文字来交流了。   远程机代码如下:   private sub sckconnect_dataarrival(byval bytestotal as long)   dim receivefile(1 to bytestotal)as byte   sckconnect.getdata receivefile,vbarray+vbbyte   '告诉winsock控件收到的是字节数组类型的数据   open "c:\temp\文件名" for binary as #1   for i=1 to bytestotal   put #1,,remotearray(i)   next i   clost #1   end sub
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯