精华内容
下载资源
问答
  • XMPP(Android客户端的实现 _Tomcat版的Androidpn_).rar,太无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 安卓的客户端 socket聊天 简单易懂的demo ...1、更改客户端的ip为自己的ip 2、运行myServerSocket 3、点击连接按钮,链接客户端 4、发送聊天即可 可以尝试个终端运行,一台终端发送,每台都能接收到
  • 以上基本实现了:在IDEA里面java客服端与安卓模拟器里面用户端通信;所以只要java后台程序在云服务器运行,即可实现不在局域网也能通信 实现功能: 1.用户端与服务端与后台服务器(java)通信 2.若用户端接入后台...

    废话不多说,先上效果图

    在这里插入图片描述

    以上基本实现了:在IDEA里面的java客服端与安卓模拟器里面的用户端通信;所以只要java后台程序在云服务器运行,即可实现不在局域网也能通信

    实现功能:

    1.用户端与服务端与后台服务器(java)通信

    这里是服务器端(java)所收到的数据

    2.若用户端接入后台服务器的数量大于客服端接入后台服务器的数量,或者反之。多余的用户或多余的客服则加入对应的“队伍”进行排队(入堆),谁在队伍前面,谁就提前与用户或者客服通信。

    我这边解释一下:1:首先是Server服务开启(java后台服务) ;2:开启用户端,由于我还未开启客服端,所以用户端的数量大于客服端,导致了我的第一个用户需要去排队;
    3:开启三个Client客服端(依次开启Client3 Client Client1),由于第一个进入的客服端(Client3)发现有一个用户正在排队,所以直接去与这位用户开始通信,不去排队。那么Client Client1依次进入相应队伍排队等待新用户;

    在这里插入图片描述

    3.用户端与客服端通信聊天

    点击接入客服按钮后,发现有客服正在排队,就与队首(排队最久的客服端)客服端通信。然后输入相应的内容即可开始他们的私人通信。
    在这里插入图片描述

    4.代码详解CSDN地址:https://blog.csdn.net/qq_41966009/article/details/104442283

    5.Github地址:

    server and java 后台服务和客服端服务地址:https://github.com/index9-44/netty-socket-demo-for-Server-and-java.git
    Android 安卓用户地址:https://github.com/index9-44/netty-socket-demo-for-Android.git

    6.使用注意事项

    进入dos窗口,查看当前电脑IP地址,进行服务端,用户端,客服端修改对应的ip地址
    在这里插入图片描述

    展开全文
  • 安卓socket聊天

    2018-08-02 19:30:00
    安卓基于Socket通信(服务器...2.创建Client Manager客户端管理类来管理客户端的消息,因为省时间就直接从我上篇博客的代码基础上进行的修改~代码如下所示:(自己编写代码块提交后总有乱码...所以只能把自己的代...

    安卓基于Socket通信(服务器配合)

    1.话不多说进入正题,先创建服务端,在Android Studio中创建Java代码,如下图所示:

    选择Java Library 需要改名字的自己随意

     

    2.创建Client Manager客户端管理类来管理客户端的消息,因为省时间就直接从我上篇博客的代码基础上进行的修改~代码如下所示:(自己编写代码块提交后总有乱码...所以只能把自己的代码复制粘贴进来啦~格式有点奇怪,但是没有乱码~)

     

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Created by sp01 on 2017/4/28.
     */
    // 客户端的管理类
    public class ClientManager {
    
        private static Map<String,Socket> clientList = new HashMap<>();
        private static ServerThread serverThread = null;
    
        private static class ServerThread implements Runnable {
    
            private int port = 10010;
            private boolean isExit = false;
            private ServerSocket server;
    
            public ServerThread() {
                try {
                    server = new ServerSocket(port);
                    System.out.println("启动服务成功" + "port:" + port);
                } catch (IOException e) {
                    System.out.println("启动server失败,错误原因:" + e.getMessage());
                }
            }
    
            @Override
            public void run() {
                try {
                    while (!isExit) {
                        // 进入等待环节
                        System.out.println("等待手机的连接... ... ");
                        final Socket socket = server.accept();
                        // 获取手机连接的地址及端口号
                        final String address = socket.getRemoteSocketAddress().toString();
                        System.out.println("连接成功,连接的手机为:" + address);
    
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    // 单线程索锁
                                    synchronized (this){
                                        // 放进到Map中保存
                                        clientList.put(address,socket);
                                    }
                                    // 定义输入流
                                    InputStream inputStream = socket.getInputStream();
                                    byte[] buffer = new byte[1024];
                                    int len;
                                    while ((len = inputStream.read(buffer)) != -1){
                                        String text = new String(buffer,0,len);
                                        System.out.println("收到的数据为:" + text);
                                        // 在这里群发消息
                                        sendMsgAll(text);
                                    }
    
                                }catch (Exception e){
                                    System.out.println("错误信息为:" + e.getMessage());
                                }finally {
                                    synchronized (this){
                                        System.out.println("关闭链接:" + address);
                                        clientList.remove(address);
                                    }
                                }
                            }
                        }).start();
    
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            public void Stop(){
                isExit = true;
                if (server != null){
                    try {
                        server.close();
                        System.out.println("已关闭server");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        public static ServerThread startServer(){
            System.out.println("开启服务");
            if (serverThread != null){
                showDown();
            }
            serverThread = new ServerThread();
            new Thread(serverThread).start();
            System.out.println("开启服务成功");
            return serverThread;
        }
    
        // 关闭所有server socket 和 清空Map
        public static void showDown(){
            for (Socket socket : clientList.values()) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            serverThread.Stop();
            clientList.clear();
        }
    
        // 群发的方法
        public static boolean sendMsgAll(String msg){
            try {
                for (Socket socket : clientList.values()) {
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write(msg.getBytes("utf-8"));
                }
                return true;
            }catch (Exception e){
                e.printStackTrace();
            }
            return false;
        }
    
    }

     

     

     

    代码看起来比较简单,用了尽可能方便理解的书写,也写好了一些注释,应该不难理解所以就不具体解释了,对Server Socket有不理解的地方,请参考我的上篇博客~希望能有所帮助,但需要解释的地方可能只有一点吧,群发的方法对收到的消息全部进行广播式的发送,那么不就发送的人也会收到消息了嘛?(可能有人感觉会有数据显示重复的情况)我想说的是,真正历史记录都会在服务端进行数据保存和处理这样想就行了,我在Android端做了一个RecyclerView的加载不同行布局实现模拟聊天界面,发送和接收的历史消息都会显示在列表上,本人发送的内容在左侧,其他人发送的消息被显示在右侧。

     

    3.在MaClass.java(主入口类)中开启服务:

     

    public class MyClass {
    
        public static void main(String[]args){
            // 开启服务器
            ClientManager.startServer();
        }
    
    }
     

     

     

    4.到这里为止,服务端的代码就完成了很简单,有人运行代码时,会出现控制台中文乱码情况,解决办法我转发的博客中有介绍,但是考虑到有人很懒,不想在麻烦去找,我就直接在下面介绍了,很简单只需要一句话:

     

    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
     

     

     

     

    复制代码块,放进蓝色的gradle位置中(Java lib包内)dependencies{}下方位置,在Rebuild一下就好了。

     

    5.新建并编写Android客户端工程,大致内容就是一个EditText输入框,点击按钮发送数据,上方为一个加载不同行布局的RecyclerView,实现历史记录阅览,下面是activity_main.xml的内容:

     

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="sq.test_socketchat.MainActivity">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="9"/>
    
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
    
            <EditText
                android:id="@+id/et"
                android:layout_weight="8"
                android:layout_width="0dp"
                android:hint="输入内容"
                android:layout_height="match_parent" />
    
            <Button
                android:id="@+id/btn"
                android:text="发送"
                android:layout_margin="3dp"
                android:layout_weight="2"
                android:layout_width="0dp"
                android:layout_height="match_parent" />
    
        </LinearLayout>
    
    </LinearLayout>

     

     

     

    显示效果如上图所示。

     

    6.接下来是准备工作,首先写一个MyBean,用来存储名字,消息内容,消息时间,以及加载哪种布局:

     

    /**
     * Created by sp01 on 2017/4/28.
     */
    public class MyBean {
        private String data;
        private String time,name;
        private int number;
    
        public MyBean() {
        }
    
        public MyBean(String data, int number,String time,String name) {
            this.data = data;
            this.number = number;
            this.name = name;
            this.time = time;
        }
    
        public String getTime() {
            return time;
        }
    
        public void setTime(String time) {
            this.time = time;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getData() {
            return data;
        }
    
        public void setData(String data) {
            this.data = data;
        }
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    }

     

     

     

    7.同样是准备工作,两个不同布局的item的书写,第一种内容显示在左侧第二种则在右侧,直接复制我的就好:

    第一个item:

     

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:background="#c8fffa"
        android:layout_margin="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <TextView
            android:id="@+id/tv"
            android:layout_gravity="left"
            android:textSize="20sp"
            android:text="lalala"
            android:layout_margin="5dp"
            android:textColor="#000000"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <LinearLayout
            android:layout_gravity="left"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    
            <TextView
                android:id="@+id/tv_name"
                android:text="name_xx"
                android:layout_margin="5dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:id="@+id/tv_time"
                android:layout_margin="5dp"
                android:text="1993-09-28"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
        
    </LinearLayout>
     
    
     
    
    第二个item:
    
     
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:background="#fcfdd9"
        android:layout_margin="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <TextView
            android:id="@+id/tv2"
            android:layout_gravity="right"
            android:textSize="20sp"
            android:text="lalala"
            android:layout_margin="5dp"
            android:textColor="#000000"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <LinearLayout
            android:layout_gravity="right"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    
            <TextView
                android:id="@+id/tv_name2"
                android:text="name_xx"
                android:layout_margin="5dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:id="@+id/tv_time2"
                android:layout_margin="5dp"
                android:text="1993-09-28"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
    </LinearLayout>
     

     

     

    8.接下来是书写MyAdapter内的代码(RecyclerView加载不同行布局很简单就不过多强调了):

     

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import java.util.ArrayList;
    
    /**
     * Created by sp01 on 2017/4/28.
     */
    public class MyAdapter extends RecyclerView.Adapter {
    
        private Context context;
        private ArrayList<MyBean> data;
        private static final int TYPEONE = 1;
        private static final int TYPETWO = 2;
    
        public MyAdapter(Context context) {
            this.context = context;
        }
    
        public void setData(ArrayList<MyBean> data) {
            this.data = data;
            notifyDataSetChanged();
        }
    
        @Override
        public int getItemViewType(int position) {
            return data.get(position).getNumber();
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            RecyclerView.ViewHolder holder = null;
            switch (viewType){
                case TYPEONE:
                    View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
                    holder = new OneViewHolder(view);
                    break;
                case TYPETWO:
                    View view1 = LayoutInflater.from(context).inflate(R.layout.item2,parent,false);
                    holder = new TwoViewHolder(view1);
                    break;
            }
            return holder;
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            int itemViewType = getItemViewType(position);
            switch (itemViewType){
                case TYPEONE:
                    OneViewHolder oneViewHolder = (OneViewHolder) holder;
                    oneViewHolder.tv1.setText(data.get(position).getData());
                    oneViewHolder.name1.setText(data.get(position).getName());
                    oneViewHolder.time1.setText(data.get(position).getTime());
                    break;
                case TYPETWO:
                    TwoViewHolder twoViewHolder = (TwoViewHolder) holder;
                    twoViewHolder.tv2.setText(data.get(position).getData());
                    twoViewHolder.name2.setText(data.get(position).getName());
                    twoViewHolder.time2.setText(data.get(position).getTime());
                    break;
            }
        }
    
        @Override
        public int getItemCount() {
            return  data != null && data.size() > 0 ? data.size() : 0;
        }
        
        class OneViewHolder extends RecyclerView.ViewHolder{
           private TextView tv1;
            private TextView name1,time1;
           public OneViewHolder(View itemView) {
               super(itemView);
               tv1 = (TextView) itemView.findViewById(R.id.tv);
               name1 = (TextView) itemView.findViewById(R.id.tv_name);
               time1 = (TextView) itemView.findViewById(R.id.tv_time);
           }
       }
    
        class TwoViewHolder extends RecyclerView.ViewHolder{
            private TextView tv2;
            private TextView name2,time2;
            public TwoViewHolder(View itemView) {
                super(itemView);
                tv2 = (TextView) itemView.findViewById(R.id.tv2);
                name2 = (TextView) itemView.findViewById(R.id.tv_name2);
                time2 = (TextView) itemView.findViewById(R.id.tv_time2);
            }
        }
        
    }
     

     

     

    9.下面终于进入到了正题~进入到MainActivity中,代码如下所示:

     

    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    
    public class MainActivity extends AppCompatActivity {
    
        private RecyclerView rv;
        private EditText et;
        private Button btn;
        private Socket socket;
        private ArrayList<MyBean> list;
        private MyAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            rv = (RecyclerView) findViewById(R.id.rv);
            et = (EditText) findViewById(R.id.et);
            btn = (Button) findViewById(R.id.btn);
            list = new ArrayList<>();
            adapter = new MyAdapter(this);
    
            final Handler handler = new MyHandler();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        socket = new Socket("192.168.1.111", 10010);
                        InputStream inputStream = socket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = inputStream.read(buffer)) != -1) {
                            String data = new String(buffer, 0, len);
                            // 发到主线程中 收到的数据
                            Message message = Message.obtain();
                            message.what = 1;
                            message.obj = data;
                            handler.sendMessage(message);
                        }
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final String data = et.getText().toString();
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                OutputStream outputStream = socket.getOutputStream();
                                SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");    //设置日期格式
                                outputStream.write((socket.getLocalPort() + "//" + data + "//" + df.format(new Date())).getBytes("utf-8"));
                                outputStream.flush();
    
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                }
            });
    
        }
    
        private class MyHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    //
                    int localPort = socket.getLocalPort();
                    String[] split = ((String) msg.obj).split("//");
                    if (split[0].equals(localPort + "")) {
                        MyBean bean = new MyBean(split[1],1,split[2],"我:");
                        list.add(bean);
                    } else {
                        MyBean bean = new MyBean(split[1],2,split[2],("来自:" + split[0]));
                        list.add(bean);
                    }
    
                    // 向适配器set数据
                    adapter.setData(list);
                    rv.setAdapter(adapter);
                    LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
                    rv.setLayoutManager(manager);
                }
            }
        }
    }

     

     

     

    代码很简单,因为Socket发送的数据只能是一个基本的数据类型,不能传递类似于HashMap、集合、数组这样的数据,所以只能通过拼接字符串的形式通过加入一些特殊的符号,来起到分割数据的作用,因为传递的数据中带有发送者、接受者、时间、消息等这样的数据,所以通过split来区别这些数据,从而进行具体的分配来实现目的。

     

    10.最后权限不要忘记加入~

     

    <uses-permission android:name="android.permission.INTERNET"/>

     

     

     

    那么运行实现的具体效果又是怎样的呢?请看下面(话说CSDN加图好麻烦啊):

    1)这是开启服务器之后,两台手机打开聊天Demo:

     

    2)这是客户端发送数据的显示内容:

     

    3)这是服务端在客户端聊天时显示的Log:

     

    Demo:https://github.com/shiqiangdva/Socket_Chat

     

    --------------------转载至https://blog.csdn.net/qq_37842258/article/details/70945192

     

    转载于:https://www.cnblogs.com/Frank-dev-blog/p/9409369.html

    展开全文
  • 2,用户操作安卓客户端的时候,客户端QQClient创建一个Socket后去连接服务器,创建一个输出线程ClientOutputThread,将客户端的消息发送给服务器; 3,服务器使用InputThread接收用户发送的消息,根据消息的不同调用不同的...
  • 首先是选择服务器和客户端技术,客户端因为有安卓,IOS两种客户端,还可能有其他客户端,所以我想选择使用通信协议而且最好具有客户端方案服务器技术,首先是考虑初恋java,没有使用最重要原因是觉得太熟悉...

    现在有需求开发一个智能手机消息推送服务器,因为喜欢研究技术,不用那些推送”云服务“,中国人吹牛可以算得上是云技术了。

    首先是选择服务器和客户端技术,客户端因为有安卓,IOS两种客户端,还可能有其他客户端,所以我想选择使用通信协议的而且最好具有客户端方案的服务器技术,首先是考虑初恋java,没有使用的最重要的原因是觉得太熟悉,没意思,其次我想起了毕业设计搞得聊天的服务器nodejs,果断选它吧,新鲜出炉~1.连接负载可能会比较大,Nodejs据说是不阻塞的2.我比较熟悉pomelo知道已经做好了充分的推送框架基础~3.轻松加愉快了

    一; 客户端技术:

    1.使用C技术,直接跨平台,再通过本地代码使用OBJECTC和JAVA统一个接口

    2.使用各平台解决方案,但是接口统一

    选择方案2 ,从字数看出2简单

    二;服务器技术:

    1.nodejs+pomelo

    目标:

    1.讲服务器设计成一个像Service的单独作为推送的服务器系统,这个系统将会接受其他系统(比如我们的JAVA web系统)的请求,请求形式以websocket形式

    2.服务器推送的消息形式和服务器接受请求的参数是可以推展的

    展开全文
  • 种类的手机都能够使用,无论是苹果亦或是华为小米等,都能够完美的配适,并且还能使用手机唤醒小爱同学,帮它联网,教他各种不同的知识,之后还能和你愉快的聊天!小爱同学app特色听听音乐,看看各种笑话,休闲...

    小爱同学app是一款以连接小爱同学享受人工智能乐趣生活为核心卖点的软件,超多种类的手机都能够使用,无论是苹果亦或是华为小米等,都能够完美的配适,并且还能使用手机唤醒小爱同学,帮它联网,教他各种不同的知识,之后还能和你愉快的聊天!

    小爱同学app特色

    听听音乐,看看各种笑话,休闲无比放松逗小爱,即时你是孤身一人也不再会孤单!

    远程操控你的各种智能设备,远距离控制不再是问题,解决所有的难题!

    自带语音识别的功能,帮助你的智能设备识别你的声音,生活更是舒适无比!

    小爱同学熟知各种天文地理的尝试,知晓各处不同的风俗习惯,更是能够自由的背诵唐诗宋词,好用无比!

    小爱同学app功能

    你还能够使用小爱同学官网版手机客户端查询各种天气的预报,并且还能翻译各国语言,好用无比!

    功能好用便捷无比,查询天气,设置备忘录,时间一到自动播报,只需说一句话,小爱自动帮你解决!

    用户们还能够了解各种操作指南,小爱还能够帮助你打理生活中的点点滴滴,生活更是有趣!

    简单的语音命令就可以让小爱理解你的意思,更加方便轻松,更是智能便捷,不用担心指令的错误!

    小爱同学app怎么连接无线

    小爱同学怎么连接无线呢?首先我们以一款普通的小艾音箱作为演示!

    1.用户们需要在家中连接无限网络,注意必须是2.4G,小爱同学不能识别5G!

    2.为你的小爱音箱连接电源,然后更具设备的不同按不同的方式进入配置模式!

    3.打开用户手机上的小爱音箱app,主界面中就会提示连接你的音箱,只需点击开始就能够联网!

    4.在联网中输入无线网络的帐号以及密码,连接之后就能够看到app提示配置成功!

    展开全文
  • 导读:微信是我们生活中必不可少的聊天工具,但是人们在日常生活中经常会有工作微信和生活微信分开的情况,目前很多安卓机支持一键双开,但是电脑端却锁定只允许打开一个;本文将重点介绍Win 10实现微信多开的几种...
  • 当时,给我发来一张效果图,当时没有想我就直接回复说苹果手机需要越狱、安卓需要插件或者第三方客户端才可以。 几天后偶然想明白了,这个功能其实不需要越狱或者安装插件,官方客户端就可以实现同样效果...
  • 轻量级的客户端。 | | | | | Tox是一种点对点,端到端加密即时消息协议,其默认且唯一模式是端到端加密。 µTox是跨平台:对Windows 7+和Linux主要支持,对OpenBSD,FreeBSD,NetBSD和DragonFlyBSD...
  • Android多人聊天室小项目

    千次阅读 2018-08-05 19:37:39
    这两天自己写了一个多人聊天室,服务器是用Java写,烂一批,不想写了,但是安卓客户端上遇到了很问题还是有必要说一下。 1、功能 这个APP客户端是基于我自己写服务器来运行,不过有需要伙伴可以根据...
  • 分享一款可自主二次开发微信云控客服crm软件,免费微信crm客服系统源码,已实现聚合聊天,群发、朋友圈等全部功能,不是微信网页协议,不是ipad协议,不是安卓协议。提供源代码完全可以自主二次开发,做微信工具...
  • 恩布IM Android 安卓开源手机客户端 EntboostIM 更新到 1.5.0 版本,开源企业IM。 主要更新内容: 支持聊天消息转发给别人; 单聊会话转为临时讨论组,现在流程更简便; “联系人”界面处优化及...
  • 黑马安卓52期视频教程

    热门讨论 2015-06-24 22:15:48
    06_新闻客户端的布局 07_获取新闻xml文件并解析 08_把新闻内容显示至ListView&ViewHolder优化 09_使用get方式提交数据 10_使用post方式提交数据 day05_Android应用开发-网络编程 00_剧情回顾 01_使用HttpClient...
  • 包括mysql数据 ssh框架下jsp服务端 安卓客户端安卓客户端还使用了大量第三方类库,如果对上面任意一个知识不熟悉朋友运行这个项目还是非常费劲,源码有比较详细注释。默认编译版本4.4.2,编码UTF-8。...
  • 包括mysql数据+ssh框架下jsp服务端+安卓客户端安卓客户端还使用了大量第三方类库,如果对上面任意一个知识不熟悉朋友运行这个项目还是非常费劲,源码有比较详细注释。默认编译版本4.4.2,编码UTF-8。...
  • 可是到了XMPP编程时候发现了问题,Smack是一个开源已于使用XMPP客户端类库,我选择这个类库,不过网上资料很版本过老,就自己去github查了查。这也是开源好处。 首先,要把Smack导入到Android Studio, ...
  • ChatActivity聊天页面,实现指定好友的聊天功能,及聊天记录的保存; FriendDetail聊天好友详情页面,更改聊天背景等; 主要的类就是这些,具体的详细实现大家可以直接看代码,注释写的很详细了,有疑问的欢迎交流...
  • 话说放假人都玩去了,咱还在写代码,唉,,,还得慢慢学,,,...界面是仿QQ 安卓客户端的,参考了网上的代码,图片素材直接解压安卓手机QQ就有了,话说没做商业用途,不算侵权吧? 代码很简单就一个布局文件, ...
  • | 基于Android仿QQ微信聊天系统.rar 3.24 MB | 基于SOA模式事务定时提醒系统全套.rar 1.86 MB | 基于XML同学录信息管理系统.rar 58.14 KB | 基于分层设计php员工管理系统.rar 2.09 MB | 林林php精美留言簿程序...
  • 传统微信营销弊端

    2017-04-14 10:04:44
    多开是通过篡改微信客户端来实现,稍有不慎就封号,而且经常出现闪退,操作时来会切换微信,太过于繁琐。   2、常见电脑版微信多开   电脑安卓模拟器微信多开,一旦使用,立马被封号,腾讯官方严重打击非正规...
  • 然而,由于HTML5W3C标准规范还未制定,安卓系统中类浏览器Webview自身存在一些局限性,因此仍存在着诸多问题亟需解决,包括:(1)窗口类浏览器模式问题。安卓上用于加载Webview视图窗口只是作为类浏览器而...
  • 百度贴吧 v9.9.8.42

    2019-03-02 21:59:24
    类型:社交聊天 版本:v9.9.8.42 大小:54.3M 更新:2019/2/25 语言:简体 平台:安卓, 4.0以上 ...度贴吧是百度旗下出色产品,是各路爱好者聚一...在一些功能上,百度贴吧手机版客户端有更多的好处,如一键签到...
  • ✅ Reabble:面向 Kindle 等 E-Ink 设备 RSS 客户端,带推送服务 ✅ OxyPlayer:专为学英语设计视频播放器,单句重复/双语字幕/情境填词 2020年7月15号添加 getjennyli - Github ✅ Feelings:心情树洞...
  • 微信机器人研究

    2019-03-27 18:57:41
    用户可以透过客户端与好友分享文字、图片以及贴图,并支持分组聊天和语音、视讯对讲功能、广播(一对)消息、照片/视讯共享、位置共享、消息交流联系、微信支付、理财通,游戏等服务。微信作为目前最大社交软件...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    Android jChat 是一个 Android 手机上基于位置的聊天软件,采用P2P通讯机制。 为了编译jChat,你要使用Eclipse创建一个新的Android项目,然后添加外部JAR和移动的jChat目录选择到libs目录JadeLeapAndroid.jar库。...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

安卓多客户端的聊天