仿qq聊天及定位等

原创 2013年12月02日 12:57:38
聊天其实就是要实现消息推送,而推送消息就需要保持连接(长连接)。在之前项目里虽然实现了即时聊天,但是一种很本的方法。
去掉了其中的网络访问。地图试用的百度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)
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

仿聊天定位Demo

  • 2016年04月11日 16:44
  • 11.19MB
  • 下载

Android即时通讯--仿QQ即时聊天:(一)初识Socket

1、即时通讯简介 即时通讯(Instant Messaging,简称IM)是一个终端服务,允许两人或者多人通过网络即时传递文字讯息、档案、语音等。简单的概括就是发送消息时,只要对方在线,就能立即接收到...

iOS开源组件__仿写QQ/微信聊天键盘(表情,问题,输入框)纯代码,无依赖

iOS开源组件__仿写QQ/微信聊天键盘(表情,问题,输入框)纯代码,无依赖

Android即时通讯--仿QQ即时聊天:(二)闪屏页及登录页面的实现

1、闪屏页 在每一个Android应用程序中一般都会有一个闪屏页,用来完成展示产品LOGO、检查版本更新、打广告等操作。在这个项目中,只是简单的展示一下产品的LOGO。效果图如下     闪屏页的...

高仿QQ聊天消息列表的下拉刷新效果

转载请注明出处: 一、下拉刷新的原理:

仿QQ聊天(1)—无形装比,最为致命

自己写的东西,虽然写的不好,代码烂的像狗一样,但还是很有成就感。学android是为了干嘛,就是为了写出一个程序,然后在别人面前显摆显摆,装装比。无形装比,最为致命。 so,我要开始了。 先来几张...

java 仿qq 聊天工具(基于mvc三层架构,附 mvc架构模式pdf说明文档)支持开源

用了3天多时间,因实验5要求就顺便做一下这东西吧,废话不多说,就简单说一些东西吧: 该聊天系统是基本mvc模式设计的(感觉这种模式代码比较好管理,可扩展性强),编写过程中涉及的东西比较多,包括对象实...

仿微信.QQ聊天界面

仿微信.QQ聊天界面,气泡图 自适应箭头图片   最近做了一个IM的项目.关于实现IM有很多方法.毕竟协议就那么几种.开源的可以用XMPPFramework等, 第三方有融云、环信等.若只是实现临...

[聊天通讯] 高仿QQ源码+客户端+服务端+数据库资源齐全可编译架设外网

高仿QQ源码+客户端+服务端+数据库所有资源齐全可编译架设外网 已经可以实现注册、登陆、在线状态、查找好友、添加好友、修改个人资料、服务端增加了客户状态显示等~喜欢玩软件的朋友们可以拿去学习一下 ...

高仿QQ源码下载 (android前端+JAVA后台+spark<windows版聊天>)方便集成到自己系统

高仿QQ源码下载 (android前端+JAVA后台+spark)方便集成到自己系统
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:仿qq聊天及定位等
举报原因:
原因补充:

(最多只允许输入30个字)