精华内容
下载资源
问答
  • 因为在之前项目需要用到即时聊天的功能.在逛了好多论坛之后,才终于实现了即时聊天的功能。 使用xmpp+openfire+iOS客户端来制作聊天app的demo、教程网上都有很多,在这里简单地说一下核心做法。

    因为在之前项目需要用到即时聊天的功能.在逛了好多论坛之后,才终于实现了即时聊天的功能。

    使用xmpp+openfire+iOS客户端来制作聊天app的demo、教程网上都有很多,在这里简单地说一下核心做法。

    1. 首先就要制作服务器,这块我是用的openfire的服务器,数据库也不是用嵌入在openfire里面的,而是用的mySQL,性能相当不错,而且不会丢消息。

    1.1 到http://www.igniterealtime.org/downloads/index.jsp去下载最新的openfire

    为了验证服务器搭建完成没有,或者验证app到底能不能正常通信,可以下Spqrk来试验,它就是一个聊天工具,等登陆上且能给手机模拟器正常聊天,那聊天功能就成功了!

    1.2 安装openfire,本人是在Mac10.10下安装的,之后去用户偏好里面就能打开设置页,设置好了就能够拿电脑当服务器使了,而windows跟linux的没有用过,不过网上很多教程这里转发一个:http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97  

    再发一个在mac上搭建的教程: http://www.cnblogs.com/xiaodao/archive/2013/04/05/3000554.html

    好了,到这里服务器应该已经搭建好了,使用spark去登陆一下。

    2. iOS端制作

    2.1 导入框架,iOS端使用xmpp需要导入对应的库: XMPPFramework ,这个库在Github、code4app上面都有,导入过程也不复杂,但是本人还是习惯性的去使用CocoaPods,

    毕竟用来导入实在太方便了。CocoaPods是一种开发工具,在终端上几行代码就能够给项目导入好库,有依赖的库也会给导入好,具体教程网上一抓一大把。

    2.2  大家应该已经猜出来了,其实就是使用XMPPFramework里面的代理方法和xmppStream来跟服务器发送和收到消息。

    先建立跟服务器的连接:

    然后连接服务器:

    PS:如果服务器不是自己电脑,需要把Server给改成服务器的IP地址。

    记得给实现XMPPStreamDelegate,当服务器发送消息,比如别人发的消息、好友上线消息等都会回调里面的方法,之前建立连接的时候设定的delegate就是让服务器回调的时候能有回调的方法给执行。

    需要实现的有:

    #pragma mark -- XMPPStream Delegate 
    //连接服务器
    - (void)xmppStreamDidConnect:(XMPPStream *)sender{
        
        NSLog(@"did Connected");
        NSError *error = nil;
        //验证密码
        if (![[self xmppStream] authenticateWithPassword:password error:&error]){
            NSLog(@"Authenticate Error: %@", [[error userInfo] description]);
        }
    }
    
    //验证通过
    - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
        
        NSLog(@"验证已通过.........");
        [self goOnline];
    }
    
    //收到消息
    - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
        
        //    NSLog(@"message = %@", message);
        
        NSString *msg = [[message elementForName:@"body"] stringValue];
        NSString *from = [[message attributeForName:@"from"] stringValue];
        
        NSLog(@"receive message :%@ from :%@",msg, from);
        
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setObject:msg forKey:@"MSG"];
        [dict setObject:from forKey:@"SENDER"];
        
        //消息委托,就是收到的消息怎么处理
        [self.messageViewController MessageReceived:dict];
    }
    
    //收到好友状态
    - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{
        
        //取得好友状态
        NSString *presenceType = [presence type]; //online/offline
        //当前用户
        NSString *userId = [[sender myJID] user];
        //在线用户
        NSString *presenceFromUser = [[presence from] user];
        
        
        NSLog(@"id: %@",userId);
        NSLog(@"user: %@", presenceFromUser);
        NSLog(@"type: %@", presenceType);
        
        /*这里应该做当有好友上线之后的操作,比如改变对应头像颜色之类的*/
    }
    
    - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error {
        NSLog(@"did not authenticate....error :%@", error);
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"错误" message:@"账号/密码输入出错!" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil];
        [alertView show];
    }

    做到这里就能收到消息了,建议都给放在appDelegate上面,这样xmppStream不会被释放掉

    下面是发送消息功能的实现

    - (IBAction)sendClick:(id)sender {
        
        NSString *message = self.messageTextField.text;
        NSMutableString *toName = [NSMutableString stringWithString:self.toTextField.text];
        [toName appendString:@"@127.0.0.1"];
        
        //xmpp通过kissxmpp来上传消息
        if (message.length > 0) {
            
            //下面几行就是自己发送消息之后做的事(屏幕上给出现自己发的消息)
            NSMutableString *messages =  [NSMutableString stringWithString:self.messageTextView.text];
            NSString *selfName = [[NSUserDefaults standardUserDefaults] stringForKey:@"USERID"];
            
            [messages appendString:[NSString stringWithFormat:@"\n          %@",selfName]];
            [messages appendString:[NSString stringWithFormat:@"\n          %@", self.messageTextField.text]];
            self.messageTextView.text = messages;
            
            //生成<body>文档
            NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
            [body setStringValue:message];
            
            //生成XML消息文档
            NSXMLElement *mes = [NSXMLElement elementWithName:@"message"];
            //消息类型
            [mes addAttributeWithName:@"type" stringValue:@"chat"];
            //发送给谁
            [mes addAttributeWithName:@"to" stringValue:toName];
            
            //由谁发送
            [mes addAttributeWithName:@"from" stringValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"USERID"]];
            //组合
            [mes addChild:body];
            
            //发送消息
            [[self xmppStream] sendElement:mes];
            
            self.messageTextField.text = @"";
            [self.messageTextField resignFirstResponder];
        }
        
    }

    最后声明,本人自学中,感谢各大网络网友的支持,有疑问请联系:384345982(QQ),不过能力有限,望大家不要见怪。吐舌头


    展开全文
  • 在网上查资料,去学校图书馆借书发现居然还有《30天,App开发从0到1》这本书,官方有点牛批额。最终发现Workerman这个框架可以做即时通信,而且还容易上手。装好了后发现Workerman基础框架只能做服务推送,不能实现...

    作者:川哥哥

    之前我一直用融云的接口做即时通信,自己也摸索了一段时间觉得融云做的挺好的。可是接口是收费的还有点小贵,就放弃融云了决心自己搭建一个后台。

    在网上查资料,去学校图书馆借书发现居然还有《30天,App开发从0到1》这本书,官方有点牛批额。最终发现Workerman这个框架可以做即时通信,而且还容易上手。装好了后发现Workerman基础框架只能做服务推送,不能实现客户端之间相互通信。

    然后继续找资料发现GatewayWorker可以实现通信,接口都封装好了文档也详细。自己把GatewayWorker环境弄好了后做了几个简单测试,发现客户端之间确实可以相互通信,还可以群聊。然后就开始设计数据库以及完善各种业务逻辑(业务逻辑代码只能写在Events.php里面)。

    在这里插入图片描述
    服务器也是买的最便宜的1G的内存1M的带宽凑合着用(百度云服务器46元买的),服务端还没做压力测试不知道在线用户多了会不会蹦!

    手机端经过多次测试发现原生HTML5 WebSocket以及平台的其他网络通信模块通信体验很差,最终选用webSocket v1.1.2模块和服务器进行通信很稳定。

    目前app主要的功能:

    单聊、群聊、好友、二维码识别、消息数据本地存储、消息请求验证、意见反馈、消息收藏、微信登陆、截图。

    消息类型:

    语音、文字、表情、图片、位置。

    平台用到的模块:

    webSocket、aMap、NVTabBar、db、fs、UIChatBox、FNScanner、wxPlus、trans、imageFilter、trans。
    在这里插入图片描述
    App开发制作零零散散花了半年的时间,总体来讲前端功能模块设计要难些,很多功能比较麻烦。后端比较简单最主要就是要把数据库表设计好,App图标和名字都是临时想的。

    现在官方推出了AVM,等空了把App转成AVM多端版,目前还有部分功能未完善,肯定还有很多bug,大家可以下载然后用微信登陆进行测试,欢迎大家批评指正图片。

    主要功能界面截图:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Android Studio 连接阿里云数据库的简单方法【制作基于数据库的多人远程聊天APP】 首先购买好一个阿里云数据库RDS【我买了一年用了49元】 1.进入官网–>打开右上角的控制台 2.这个时候你才真正进入你的数据库...

    Android Studio 连接阿里云数据库的简单方法【制作基于数据库的多人远程聊天APP】

    首先购买好一个阿里云数据库RDS【我买了一年用了49元】

    1.进入官网–>打开右上角的控制台

    在这里插入图片描述

    2.这个时候你才真正进入你的数据库控制台,点击设置白名单

    进入白名单设置
    在这里插入图片描述
    将白名单设置的和我一样,就是允许所有人访问你的数据库,但是你们数据库是有密码的,所以不用担心别人对你的数据库干什么,但是如果你不是设置自己用的数据库,建议还是限制ip,我觉得不限制比较好

    3.创建账号,登录进入你的数据库

    在这里插入图片描述

    4.创建属于你的数据库,进入你的数据库,开始建表

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    刚开始进入的时候填写基本信息,我只填了表名为:test
    然后填写列信息 注意:varchar长度2等于一个字符,所以200长度的意思是100个以内的中文字符

    我这里设置id这个自增是有原因的,后期代码会讲

    保存变更–>直接执行【数据库就建好了】
    在这里插入图片描述

    5.保存数据库的地址以及你的数据库账号密码,方便以后使用

    在这里插入图片描述
    从左往右点击

    开始新建Android Studio项目,制作聊天室APP

    1.新建空白项目room_test,设置网络权限导入jar包

    在这里插入图片描述
    在这里插入图片描述
    我下载的是如图所示

    下载jar包的地址,注意:不是越新版越好

    在这里插入图片描述
    弹窗点击Refactor
    在这里插入图片描述
    点击,确认,才是真正的导入jar包
    在这里插入图片描述
    出现三角形,说明成功了

    1.新建MySQLConnections类,去连接你的数据库
    // An highlighted block
    public class MySQLConnections {
        private String driver = "";
        private String dbURL = "";
        private String user = "";
        private String password = "";
        private static MySQLConnections connection = null;
        private MySQLConnections() throws Exception {
            driver = "com.mysql.jdbc.Driver";
            dbURL = "jdbc:mysql://你复制的外网地址:3306/库名";
            user = "你之前新建的数据库账号,不是阿里云账号哦";
            password = "密码";
            System.out.println("dbURL:" + dbURL);
        }
        public static Connection getConnection() {
            Connection conn = null;
            if (connection == null) {
                try {
                    connection = new MySQLConnections();
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
            try {
                Class.forName(connection.driver);
                conn = DriverManager.getConnection(connection.dbURL,
                        connection.user, connection.password);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return conn;
        }
    }
    
    

    注意第、dbURL这个很容易写错,是jdbc:mysql://外网地址/库名
    外网地址是你之前复制的,库名是你自己新建的,test是表名,不是库名哦,中间用/分隔

    2.写activity_main.xml,为了照顾初学者,我将不使用列表存储信息,改用Textview【后面有使用截图】
    // An highlighted block
    <TextView
            android:id="@+id/t1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="10"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="horizontal">
    
            <EditText
                android:id="@+id/msg"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:ems="10"
                android:hint="请输入内容"
                android:inputType="textPersonName" />
    
            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="Button" />
    
        </LinearLayout>
    

    复制上面的xml代码到如下位置
    在这里插入图片描述

    3.写MainActivity.java,这个代码可以直接复制,前提是你的表名也是test,列名和我一样(id,name,msg)

    在这里插入图片描述

    // An highlighted block
    public class MainActivity extends AppCompatActivity {
        private TextView t1;  //用于显示获取的信息
        private Button sendmsg;  //按钮
        private EditText et_msg;//用户输入的信息
        private String user="用户名";
        private boolean T=false;//发送标志位
        //数据库连接类
        private static Connection con = null;
        private static PreparedStatement stmt = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //初始化
            t1 = findViewById(R.id.t1);
            et_msg = findViewById(R.id.msg);
            sendmsg = findViewById(R.id.button);
            sendmsg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) { T=true; }
            });
            //TODO 启动发送线程,用按钮控制发送标志位T,来进行发送信息【注意:连接数据库必须在线程内,不然会报错】
            Threads_sendmsg threads_sendmsg = new Threads_sendmsg();
            threads_sendmsg.start();
            //TODO 启动获取数据线程,读取数据库里的信息【注意:连接数据库必须在线程内,不然会报错】
            Threads_readSQL threads_readSQL = new Threads_readSQL();
            threads_readSQL.start();
        }
    
        class Threads_sendmsg extends Thread {
            @Override
            public void run() {
                while (true){
                    while (T){
                        try {
                            con = MySQLConnections.getConnection();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        try {
                            String msg =et_msg.getText().toString().trim();    //用户发送的信息
    
                            if (msg.isEmpty()){
    
                                Looper.prepare();
                                Toast.makeText(MainActivity.this, "请不要发送空消息", Toast.LENGTH_SHORT).show();
                                Looper.loop();
                                T=false;
                                break;
                            }
                            if (msg.length()>199){
                                Looper.prepare();
                                Toast.makeText(MainActivity.this, "请不要发送200字符以上的信息", Toast.LENGTH_SHORT).show();
                                Looper.loop();
                                T=false;
                                break;
                            }
    
                            if (con!=null) {
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
                                    }
                                });
                                String sql = "insert into test(name,msg)  values(?,?)";
                                stmt = con.prepareStatement(sql);
                                // 关闭事务自动提交 ,这一行必须加上
                                con.setAutoCommit(false);
                                stmt.setString(1,user);
                                stmt.setString(2,msg);
                                stmt.addBatch();
                                stmt.executeBatch();
                                con.commit();
                            }
                        }catch (SQLException e){
                            System.out.println(e);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this,"请输入正确的语句",Toast.LENGTH_SHORT).show();
                                }
                            });
    
                        }
                        T=false;
                    }
                }
            }
        }
        class Threads_readSQL extends Thread {
            @Override
            public void run() {
                while (true){
                    try {
                        con = MySQLConnections.getConnection();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        String sql ="Select distinct name,msg from test order by id";
                        if (con!=null) {
    
                            stmt = con.prepareStatement(sql);
                            // 关闭事务自动提交 ,这一行必须加上
                            con.setAutoCommit(false);
                            ResultSet rs = stmt.executeQuery();//创建数据对象
                            //清空上次发送的信息
                            t1.setText("");
                            while (rs.next()) {
                                t1.append(rs.getString(1) + "\n" + rs.getString(2)+ "\n\n");
                            }
                            con.commit();
                            rs.close();
                            stmt.close();
    
                        }
                        //2秒更新一次
                        sleep(2000);
                    }catch (Exception e){
                        System.out.println(e);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //Toast.makeText(MainActivity.this,"请输入正确的语句",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }
            }
        }
    }
    

    在这里插入图片描述

    以上就是成品app界面

    项目链接,欢迎下载哦

    到此结束欢迎下次光临

    展开全文
  • android如何制作出一个简单的聊天app

    万次阅读 2016-06-14 08:48:41
    HttpURLConnection可以发送http请求,那么我可以自己用tomcat建一个简单的服务器,用来接收请求完成响应,那么,当用户向用户发送一条消息时,可以在url中包含这个消息的一些信息,比如发送人的账号,消息内容,目标...

    初学android没多久,之前学过一些web,所以有一点java基础,想着能不能尽快在android上做出一点东西,就萌生了这个想法,话不多说,直接上干货

    思路:

    HttpURLConnection可以发送http请求,那么我可以自己用tomcat建一个简单的服务器,用来接收请求完成响应,那么,当用户向用户发送一条消息时,可以在url中包含这个消息的一些信息,比如发送人的账号,消息内容,目标账号等,服务器在接收到这个url后进行解析,可以创建一个message的bean,用来封装这个消息,用application域或者一个静态的list保存消息(服务器重启就没了,高级一点就可以自己再把数据库搭建起来,这里选用简单的方法),然后,用户这边其实也需要采用轮询的方式(固定时间向服务器询问有没有发给我的消息)接收数据,如果有,就将其返回给用户,用户这边再解析,当然,也可以创建一个message的bean,然后放到listView中显示出来就行了。想法很简单,做起来也不难,卧槽,想直接贴代码的,文件有点多,能把这个项目整体上传到csdn阿

    效果图:





    源码下载:http://download.csdn.net/detail/zouh613/9548697


    展开全文
  • 表情包制作pro app是一款可以满足用户自己制作表情包的软件,大家聊天时都很喜欢使用表情包,表情包不仅可爱有趣,其表达效果相对于平平无奇的文字给人的感觉也更轻松愉快,因此,网友们还将表情包玩出了斗图的感觉...
  • Motionleap动图制作神器app是一款能够帮助用户更好地去编辑各种动图的软件,现在用户在聊天,或者是其他的社交过程中都喜欢发各种各样的动图来娱乐,想要自己拥有源源不断的动图,就可以利用这个软件来进行设置,把...
  • 用H5做的APP,未部署到服务器,只能和机器人聊天,调用青云客的接口,如果想自己制作机器人接口可参考我的另一篇文章https://blog.csdn.net/weixin_43476533/article/details/105750526 在app里面加了几个小游戏...
  • iOS制作聊天气泡

    2017-06-21 22:42:47
    现在几乎所有的社交类APP都会需要做气泡聊天界面,而对于没有做过的同学来说还是有一定难度的。那么这篇博文就是记录一下我自己在实现过程遇到一些问题和解决办法。 先来几张截图给大家看看最终的结果: 这是...
  • 自从表情包出来以后,几乎每个人聊天都会使用到,搞笑可爱的GIF不仅可以调整聊天的氛围,更增加了和对方的感情,但是一般这些聊天的表情包都是直接在社交聊天工具中找到的使用的,其实自己也是可以制作这样的表情包...
  • DIY贴纸制作手机软件下载,这是一款能够在手机端自己轻松制作DIY贴纸的app,用户通过软件定制属于你的有趣的表情,让你聊天变的更加有趣吧!最方便的好用的特殊的贴纸制作软件app下载分享哦!【DIY贴纸制作软件怎么...
  • 此版本的Android蓝牙聊天是通过使用Android蓝牙聊天的原始google源代码示例进行的。 通过复制app / src / main / java / group / project / btech / bluchat_extend中的所有Java文件,可以轻松理解并快速将蓝牙功能...
  • 终于到了聊天界面了,虽然是自己做的,但是写博客把制作过程重新回顾一下也是比较累脑……OK,进入正题!由于用的是UUChatTableView,改了些东西,xib和storyboard差不多但是还是不一样,从auto layout的计算上就...
  • 别急,动图其实也可以自己制作,要多简单粗暴都行。今天给大家安利4款常用的GIF动图制作工具,教你用手机做出犀利的GIF动图!一、炫酷的玩法01 GIF动图制作推荐指数:★★★★★这是一款功能很齐全的工具。有4...
  • 最近遇到一个需求、朋友找我制作一个在微信中的聊天框,或者公众号菜单发布一条链接或者二维码,。跳出微信打开一个指定的我们自己APP推广网页引导下载APP,拿到这个需求后我们团队分开去找资料研究方案,通过微信...
  • 最近遇到一个需求、朋友找我制作一个在微信中的聊天框,或者公众号菜单发布一条链接或者二维码,。跳出微信打开一个指定的我们自己APP推广网页引导下载APP,拿到这个需求后我们团队分开去找资料研究方案,通过微信...
  • 支持视频转GIF,多图合成GIF,手机拍摄录制GIF,以及GIF动图编辑制作,简单易用,上手就会,并且还可以一键保存分享发送到微信qq聊天对话,可以制作专属于自己的表情包。很适合喜欢斗图的朋友。 2、【小寻书】 这是...
  • 使用Express&Socket.io制作的小Node.js聊天应用程序。 它处理用户消息,用户登录/注销和“用户正在键入” 我在这里使用我用React构建的客户端界面进行了部署:,尝试它的最佳方法是打开两个窗口与自己聊天;) ...
  • 聊天界面:常用app界面字体变化:键盘输入文字变化:除了最常用的手机使用外,那就是创作分享,创作分享一般是在图片、海报上使用自己制作的字体,最后聊天分享或推到社交网站,大致这么一个流程,一般app的设计思路...
  • 通过图灵机器人制作Android智能聊天app概述API接入接入说明HTTP POST请求json字符串 概述 平台概述:图灵机器人开放平台是北京光年无限科技旗下的个性化人工智能机器人开放平台。通过图灵机器人开放平台,软硬件产品...
  • 最近遇到一个需求、朋友找我制作一个在微信中的聊天框,或者公众号菜单发布一条链接或者二维码,。跳出微信打开一个指定的我们自己的页面,拿到这个需求后我们团队分开去找资料研究方案,通过微信的开发文档、腾讯的...
  • 平常大家微信应该都用得不少了吧,可以说微信已经是日常必备的社交聊天APP了。既然说到微信聊天,表情包肯定也是必不可少的一项啦。不过,平常大多数的表情包我们都是盗图收藏来的,你有试过自己制作表情包吗?相信...
  • 数字世界中,一张张的人脸,都被我们自己选择的头像所代替。无论是在 IM 聊天、社交还是其他软件中,最具辨识度的身份特征就是一个人的头像。要去哪里找好看的头像?如何制作一个好看的头像?下面这些地方或许能给你...
  • 今天给大家分享一款斗图神器,有了它,在和朋友们聊天时就不怕表情包不够了,这个软件最好的一点是可以自己制作表情,这样一来,就不怕斗表情时输给朋友们了。 当前最新最热的表情基本都有,小丑竟然是我自己! ...

空空如也

空空如也

1 2 3 4
收藏数 65
精华内容 26
关键字:

自己制作聊天app