仿qq聊天及定位等

简介: 聊天其实就是要实现消息推送,而推送消息就需要保持连接(长连接)。在之前项目里虽然实现了即时聊天,但是一种很本的方法。 去掉了其中的网络访问。地图试用的百度API 还是先放上图,在说下做法。具体做法就是,开启一个服务,在后台每隔10秒钟访问一起(Socket)服务器,如果有数据,则返回数据,客户端进行解析,然后发送广播,即可接收到消息。 发送消息,则是由服务器提供接口来发送。然后,服务
聊天其实就是要实现消息推送,而推送消息就需要保持连接(长连接)。在之前项目里虽然实现了即时聊天,但是一种很本的方法。
去掉了其中的网络访问。地图试用的百度API

还是先放上图,在说下做法。


具体做法就是,开启一个服务,在后台每隔10秒钟访问一起(Socket)服务器,如果有数据,则返回数据,客户端进行解析,然后发送广播,即可接收到消息。
发送消息,则是由服务器提供接口来发送。然后,服务器与客户端建立一个简单的通信协议。
如:MSG|发送人ID|2012-2-12 07:25:12|发送类型      MSG是个标识,类型包括文本(包含表情),图片,语音,位置等。

图片和语音的发送,都是通过FTP先上传文件到服务器,然后把本地存储的路径发送给对方。

在聊天的页面中,用户的头像都是在本地存的。包括聊天的信息,也是本地数据库存的。这样就能记录信息。也可以扩展把聊天记录导出。
在本地创建的 消息数据库中。要定义好聊天信心的字段,包括自己ID,好友ID,消息类型,文本内容,时间,是否已读等(可扩展)

代码片段,双击复制
01
02
03
04
05
06
07
08
09
         private String table = "CREATE TABLE IF NOT EXISTS message(" +
                         "_id integer PRIMARY KEY," +
                         "TtmType integer ," +
                         "TtmTuID integer ," +
                         "TtmToUserId integer ," +
                         "TtmContent text ," +
                         "TtmTime varchar(200) ," +
                         "isRead integer ," +
                         "isReplyLocation integer )" ;


这样再次进入聊天页面就可以把数据库的内容读出来,匹配到适配器
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
public List<DetailEntity> getdatas( int TtmTuID, int TtmToUserId) {
                List<DetailEntity> de = new ArrayList<DetailEntity>();
                SQLiteDatabase database = dbmanger.getWritableDatabase();
 
                Cursor cursor = database
                                 .rawQuery(
                                                 "select * from message where (TtmTuID = ? and TtmToUserId = ?) or (TtmToUserId = ? and TtmTuID = ?)  order by _id" ,
                                                 new String[] { String.valueOf(TtmTuID),
                                                                String.valueOf(TtmToUserId),
                                                                String.valueOf(TtmTuID),
                                                                String.valueOf(TtmToUserId)});
                while (cursor.moveToNext()) {
                         de.add( new DetailEntity(cursor.getInt( 1 ), cursor.getInt( 2 ), cursor
                                        .getInt( 3 ), cursor.getString( 4 ), cursor.getString( 5 ),cursor.getInt( 6 ),cursor.getInt( 7 )));
 
                }
                cursor.close();
                database.close();
                return de;
         }


图片的查看和语音的播放,都需要从数据库里取出文件保存的路径,不然的会显示和播放都不正确。
仔细看源码的话发现,在进入页面适配数据的时候已经从数据库读取内容了,而在适配器中查看图片,又重新读取了一次,
主要是因为,不这样做还是不能正确显示和播放。  对这个问题很费解。

进入到聊天页面,换取到数据,很据数据类型来加载对应的layout,当然还要判断用户ID,信息的读取是根据用户ID来获取的

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
messageList = MessageSQLService.getInstance( this ).getdatas(
                                 Integer.valueOf(UserInfomation.getUserID(TalkMessageAct. this )),
                                 Integer.valueOf(TFuid));
for ( int i = 0 ; i < messageList.size(); i++) {
         
         switch (messageList.get(i).getTtmType()) {
         case 1 :
 
                int id = Integer.valueOf(messageList.get(i).getTtmTuID());
                if (id == Integer.valueOf(TFuid)) {
 
                } else if (id == Integer.valueOf(UserInfomation
                                 .getUserID(TalkMessageAct. this ))) {
                         
                }
 
                break ;
         case 2 :
                int ids = Integer.valueOf(messageList.get(i).getTtmTuID());
                if (ids == Integer.valueOf(TFuid)) {
 
                } else if (ids == Integer.valueOf(UserInfomation
                                 .getUserID(TalkMessageAct. this ))) {
                }
                break ;
         case 3 :
                int idsx = Integer.valueOf(messageList.get(i).getTtmTuID());
                if (idsx == Integer.valueOf(TFuid)) {
 
                } else if (idsx == Integer.valueOf(UserInfomation
                                 .getUserID(TalkMessageAct. this ))) {
                }
                break ;
         case 5 :
                break ;
         case 6 :
                int idsxx = Integer.valueOf(messageList.get(i).getTtmTuID());
                if (idsxx == Integer.valueOf(TFuid)) {
 
                } else if (idsxx == Integer.valueOf(UserInfomation
                                 .getUserID(TalkMessageAct. this ))) {
                }
                break ;
 
         }
}


之前在测试中,用socket实现不了长连接。主要是因为不加上 socket.shutdownOutput();就收不到消息,而加上了即接收完消息断了连接。所以每隔10秒就要访问次Socket服务器

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
         socket = new Socket(Constants.SOCKET_IP, Constants.SOCKET_PORT);
 
         if (socket.isConnected()) {
                 
                out = new PrintWriter( new BufferedWriter(
                                 new OutputStreamWriter(socket.getOutputStream())), true );
                out.write( "Lgn|" +
                         UserInfomation.getUserID(TalkMessageServer. this )+ "|" +
                         UserInfomation.getUserPW(TalkMessageServer. this ));
                out.flush();
                socket.shutdownOutput();
         }
         reader = new BufferedReader( new InputStreamReader(
                         socket.getInputStream()));
         while ((line = reader.readLine()) != null ) {
                if (line != null ) {
                         //截取字符,读取信息的操作
                }



虽然实现了,但在实际的应用中,效果不好。费电,丢包。

当然了,现在正在往长连接方向该,也修改了通信协议(很规范),(SocketChannel,Selector)
最后放上源码
   
Test.rar(2.68 MB, 下载次数: 5691)
目录
相关文章
|
3月前
|
前端开发
一键复制微信聊天框效果:HTML+CSS让网页聊天更生动!
一键复制微信聊天框效果:HTML+CSS让网页聊天更生动!
仿QQ对话列表滑动删除与置顶的原理及实现(二)
仿QQ对话列表滑动删除与置顶的原理及实现(二)
105 0
仿QQ对话列表滑动删除与置顶的原理及实现(二)
|
Android开发 容器
仿QQ对话列表滑动删除与置顶的原理及实现(一)
仿QQ对话列表滑动删除与置顶的原理及实现(一)
145 0
仿QQ对话列表滑动删除与置顶的原理及实现(一)
【Axure教程】用中继器做聊天对话APP(微信案例)
【Axure教程】用中继器做聊天对话APP(微信案例)
【Axure教程】用中继器做聊天对话APP(微信案例)
仿QQ聊天室【方案】
仿QQ聊天室【方案】
156 0
|
JavaScript 前端开发 Java
Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。
我们来看如何用html写一个注册页面并使用js加载用户输入响应,在第二篇,将带领大家学习如何将html变成jsp,并使用java写其对应的后台响应。
Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。
|
开发工具 Android开发 容器
仿QQ聊天界面文字过长显示
前言 最近一直在做聊天功能,有群聊,有单聊,没有集成第三方SDK(例如环信)。从收到消息推送、插入数据库、到界面显示全是我们自己做的,在这个过程中碰到了很多问题,例如消息同步、前后台切换、界面刷新频率、收到上报等很多细节问题。
819 0
|
Android开发
Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博
原文:Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本、图片、文件到第三方APP,如:微信、QQ、微博等 因为偷懒,可直达微信、朋友圈、QQ、QQ空间、微博的分享仅写了图片分享的,其他的文本、文件分享不常用到,就不写了。
6860 0
类似微信图片浏览,常见应用场景如微信朋友圈照片九宫格和微信聊天图片预览
本项目受Google官方demo Zooming a View 启发,实现了点击小图放大至全屏预览,退出全屏恢复至原来位置这两个过程的动画过渡。 常见应用场景如微信朋友圈照片九宫格和微信聊天图片预览,某些手机系统相册等viewpager图片查看 缩放 拖拽下拉缩小退出(效果同微信图片浏览) 特点1.支持自定义图片加载框架。
2252 0
下一篇
无影云桌面