flash数据交互
安卓中webview读取html,同时嵌入Flex的SWF,交互
安卓activity与html交互很简单,用javascript接口即可,网上一堆的例子,基本上没多大问题。
在html里面嵌入swf并与之交互就有点麻烦,我用了ExternalInterface没有成功,那位兄台成功了可以交流交流。我用的是FlashVars,
不用改什么配置,html就可以向swf传递数据。
- <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="940" height="600">
- <param name="movie" value="client.swf?v=3">
- <param name="wmode" value="opaque"/>
- <param name="quality" value="high" />
- <param name="FlashVars" value="p1=222&p2=333" />
- <param name="menu" value="false"/>
- <embed src="client.swf" quality="high" wmode="opaque" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" FlashVars="p1=222&p2=333" width="940" height="600">
- </embed>
- </object>
其中可以在FlashVars中指定,也可以通过movie或src中的swf url指定参数,例如上面的v。
Flex代码
- // 需要引入
- import mx.core.Application;
- // 获取 FlashVars 的 Object
- var params:*= Application.application.parameters;
- // 也可以指定某一个参数
- var p1:String = Application.application.parameters.p1;
Okay!
Android使用Webview播放Swf文件,实现与Flash数据交互
HDSwfPlayer
谷歌中国API链接:https://developer.android.google.cn
支持swf播放以及html带swf的播放。
支持swf与js的交互。
自动写入flash信任路径。
提供播放回调。
Android版本不要超过4.3。
目录
如何导入到项目
支持jcenter方式导入。
支持本地Module方式导入。
jcenter方式导入
- 在需要用到这个库的module中的build.gradle中的dependencies中加入
dependencies { compile 'com.yhd.hdswfplayer:hdswfplayer:1.0.0'}
- 1
- 2
- 3
Module方式导入
- 下载整个工程,将hdmediaplayer拷贝到工程根目录,settings.gradle中加入
include ':hdswfplayer'
- 1
- 在需要用到这个库的module中的build.gradle中的dependencies中加入
dependencies { compile project(':hdswfplayer')}
- 1
- 2
- 3
如何使用
本类支持播放.swf文件、.html文件(.html可以包裹.swf文件并实现与android的交互)。
在demo中提供.html文件模板实例,如果需要js与android数据交互,请移步demo参考。
HDSwfPlayerHelper
- 初始化
private void initSwf() { //工程assets目录下swf文件对应的html文件路径,如果直接传入swf文件的路径也可以播放,但是不能与js交互 String assetsPath="file:///android_asset/main.html"; SwfPlayerHelper.getInstance(getApplicationContext()) .setJSCallClassName("jsCallClassName")//设置js调用的类名 .setJSCallMethodName("jsCallMethodName")//设置js调用的方法名 .setWebView(webView)//设置flash播放的载体 .setSwfPlayerCallBack(new SwfPlayerHelper.SwfPlayerCallBack() {//设置播放过程的回调 @Override public void onCallBack(SwfPlayerHelper.CallBackState state, final Object... args) { Log.v(TAG, state.toString()); //收到js调用方法发来的参数字符串信息 if(state== SwfPlayerHelper.CallBackState.JS_CALL_ANDROID_METHOD_WITH_PARAM){ runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(),(String)args[0],Toast.LENGTH_LONG).show(); } }); } } }) .playSwf(assetsPath);//传入绝对路径、带file://的绝对路径、url都行}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 为了让退出播放或者在播放时用户转到其它页面后flash不再播放,应该重写用于播放的Activity的onPause和onResume方法,并分别调用webview的隐藏方法”onPause”和”onResume
@Overrideprotected void onResume() { super.onResume(); SwfPlayerHelper.getInstance(getApplicationContext()).onResume();}@Overrideprotected void onPause() { super.onPause(); SwfPlayerHelper.getInstance(getApplicationContext()).onPause();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 更多的操作
//WebView调用js的基本格式为:webView.loadUrl(“javascript:methodName(parameterValues)”)SwfPlayerHelper.getInstance(getApplicationContext()).androidCallJsMethod("jsMethodString");SwfPlayerHelper.getInstance(getApplicationContext()).androidCallJSMethodWithReturn("jsMethodString");
- 1
- 2
- 3
关于我
欢迎 Star Fork交流地址:尹海德(123302687@qq.com)
- 1
- 2
- 3
License
Copyright 2017 yinhaideLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
Github传送门https://github.com/yinhaide/HDSwfPlayer
- 本文已收录于以下专栏:
- Android开源之路
Android通过javascript与flash动画交互
问题描述:当我们在Android应用上加载了flash,然后希望点击flash的相关控件,Android应用能够做出相应。
这就涉及到Android通过javascript与flash动画交互技术。我们实现方案是:新建一个html文件显示flash动画,html文件嵌入javascript函数与flash交互,然后我们我们Android应用通过webview加载html文件,再与该html文件嵌入的javascript函数交互,最后可以实现Android的数据与flash的数据进行通信。有点绕口,不知读者是否看明白了。总之就一句话:html中的javascript函数是中介,Android与flash分别与它进行数据传输即可。
贴代码:
flash.html
[html] view plain copy- <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd;">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script language="JavaScript" type="text/JavaScript">
- var str1 = "hello";
- var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
- function myFlash_DoFSCommand(command, args) {
- var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
- //flash传来的参数,如果有数据传来则调用Android代码的函数,将flash数据传给Android
- if(command =="file1_open"||command=="file2_open"||command=="file3_open"||command=="file4_open"||command=="file5_open"||command=="file6_open")
- {
- //alert(command);
- doFromCommand(command);
- }else{
- //alert(command);
- }
- }
- //下面的代码是网页加载flash的钩子
- if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
- navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
- document.write('<SCRIPT LANGUAGE=VBScript\> \n');
- document.write('on error resume next \n');
- document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
- document.write(' call myFlash_DoFSCommand(command, args)\n');
- document.write('end sub\n');
- document.write('</SCRIPT\> \n');
- }
- //调用android的函数,runJs2Activity是Android代码定义的函数,<span style="font-family: Arial, Helvetica, sans-serif;">playerJs是Android中定义该类的别名,</span><span style="font-family: Arial, Helvetica, sans-serif;">目的是获得flash传来的数据</span>
- function doFromCommand(command){
- window.playerJs.runJs2Activity(command);
- }
- </script>
- </head>
- <body>
- <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=11,0,0,0"
- WIDTH="100%" HEIGHT="100%" id="myFlash">
- <PARAM NAME=movie VALUE="flash.swf"> <!--这里一堆代码是加载flash动画的-->
- <PARAM NAME=quality VALUE=high>
- <PARAM NAME=bgcolor VALUE=#CCCCCC>
- <param name="allowScriptAccess" value="always" />
- <param name="allowNetworking" value="all">
- <param name="allowFullScreen" value="true">
- <EMBED src="flash.swf" quality=high bgcolor=#CCCCCC WIDTH="100%" HEIGHT="100%" NAME="myFlash" swLiveConnect="true" allowScriptAccess="always" allownetworking="all" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>
- </OBJECT>
- <div id="show" style="color:#000000;font-size:30px;margin-left:50px" ></div>
- </body>
- </html>
Android中定义的与thml交互的函数
[java] view plain copy- //类中类:定义js中调用的Android类
- lass RunJavaScript {
- public void runJs2Activity(String str) {
- strFromJs = str;
- mScriptHandler.removeCallbacks(mPlayerRunnable);
- mScriptHandler.postDelayed(mPlayerRunnable, 300);
- }
Android中是Vebview加载html文件的,其中交互类的别名是这样定义的
[java] view plain copy- //给网页文件添加Android与JS交互函数的定义
- mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");
下面是Android完整代码
[java] view plain copy- package com.ideal.swfplayer;
- /************************
- *用来加载flash.html文件*
- ************************/
- import java.io.File;
- import java.util.Timer;
- import java.util.TimerTask;
- import sunvision.database.DBOperation;
- import sunvision.dialog.MatchDialog;
- import sunvision.dialog.TipDialog;
- import sunvision.dialog.VersionDialog;
- import sunvision.file.FileOperation;
- import sunvision.tools.FlashPath;
- import sunvision.tools.IdealSystemProperties;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.os.Build;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.os.SystemClock;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.KeyEvent;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.WindowManager;
- import android.webkit.WebChromeClient;
- import android.webkit.WebSettings;
- import android.webkit.WebSettings.PluginState;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import android.widget.FrameLayout;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainFlashActivity extends Activity {
- private WebView mWebView = null;
- private FrameLayout mFrameLayout = null;
- private ImageView mImageView = null;
- private Timer mTimer = null;
- private Timer mTimer2 = null;
- private WebSettings settings;
- private String strFromJs = "";
- private String TAG = "SwfPlayer";
- private int mLoadingIndex = 0;
- private int mWebViewLoadTimes = 0;
- private int versionloadtime=0;
- private MatchDialog mDialogManager;
- private Handler mHandler = null;
- private FileOperation mFileUnit;
- private boolean isversionup=true;
- Handler mScriptHandler = new Handler() {};
- //加载驱动
- public native void native_initPlayer( ) throws Exception;
- public native void native_prepare() throws Exception;
- public native void native_start();
- public native void native_finish();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_flash);
- //初始化UI界面
- InitUI();
- //加载主界面
- loadSwf(FlashPath.MainPath);
- //等待消息传过来更新界面
- //mHandler.post(task); //启动定时器1秒刷新一次
- mHandler = new Handler() {
- @SuppressLint("Recycle")
- public void handleMessage(Message msg) {
- Log.i(TAG, "PlayerActivity-mLoadingIndex==" + mLoadingIndex);
- switch (msg.arg1) {
- case 0:
- mImageView.setImageResource(R.drawable.flashloading);
- break;
- case 1:
- mTimer.cancel();
- mImageView.setVisibility(View.GONE);
- mImageView.destroyDrawingCache();
- mLoadingIndex = 0;
- break;
- case 6:
- mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN, mWebView.getLeft() + 5,mWebView.getTop() + 5, 0));
- mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,mWebView.getLeft() + 5, mWebView.getTop() + 5, 0));
- break;
- default:
- break;
- }
- super.handleMessage(msg);
- }
- };
- }
- //UI界面初始化函数
- private void InitUI() {
- mFileUnit = new FileOperation(getApplicationContext());
- mFileUnit.createFlashPlayerTrust();
- mFrameLayout = (FrameLayout) findViewById(R.id.player_frameLayout);
- mImageView = (ImageView) findViewById(R.id.swf_loading_img);
- mWebView = (WebView) findViewById(R.id.webView_show);
- }
- //加载Flash动画
- @SuppressLint({ "SetJavaScriptEnabled", "Recycle" })
- public void loadSwf(String swfPath) {
- //获得配置函数
- settings = mWebView.getSettings();
- //设置允许与js交互
- settings.setJavaScriptEnabled(true);
- //设置允许文件操作
- settings.setAllowFileAccess(true);
- //设置允许使用Adobe Flash播放视频
- settings.setPluginState(PluginState.ON);
- //设置加载方式是替换加载,而不是新页面加载
- settings.setLoadWithOverviewMode(true);
- //设置编码方式
- settings.setDefaultTextEncodingName("GBK");
- //设置透明背景
- mWebView.setBackgroundColor(0);
- //重写Flash加载辅助函数
- mWebView.setWebChromeClient(new WebChromeClient() {
- public void onShowCustomView(View view, int requestedOrientation,
- WebChromeClient.CustomViewCallback callback) {
- super.onShowCustomView(view, callback);
- //Android SDK版本
- if (Build.VERSION.SDK_INT >= 14) {
- if (view instanceof FrameLayout) {
- mFrameLayout.addView(view,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT,Gravity.CENTER));
- mFrameLayout.setVisibility(View.VISIBLE);
- }
- }
- }
- @Override
- public void onHideCustomView() {
- super.onHideCustomView();
- }
- });
- //重写Flash加载主要函数
- mWebView.setWebViewClient(new WebViewClient() {
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- view.loadUrl(url);
- return true;
- }
- //Flash启东时调用
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- mWebViewLoadTimes++;
- }
- //Flash加载完成之后调用
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- //Flash加载之前会有一段时间是白屏,为了掩盖,让五张图片隔时刷新
- if (mWebViewLoadTimes == 1) {
- mTimer = new Timer();
- mTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- msg.what = 0;
- msg.arg1 = mLoadingIndex;
- mHandler.sendMessage(msg);
- mLoadingIndex++;
- }
- }, 0, 2000);
- //flash偶尔会失去焦点,让flash加载完成之后每隔2秒点击一次界面获得焦点
- mTimer2 = new Timer();
- mTimer2.schedule(new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- msg.what = 0;
- msg.arg1 = 6;
- mHandler.sendMessage(msg);
- }
- }, 0, 2000);
- } else if (mWebViewLoadTimes >= 2) {
- mWebViewLoadTimes = 0;
- String path = FlashPath.TIP_NO_FILE;
- Intent intent = new Intent(MainFlashActivity.this,NoFileFlashActivity.class);
- intent.putExtra("swfPath", path);
- startActivity(intent);
- MainFlashActivity.this.finish();
- }
- }
- });
- //给网页文件添加Android与JS交互函数的定义
- mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");
- //设置网页能够获得焦点
- mWebView.requestFocusFromTouch();
- mWebView.requestFocus();
- mWebView.setFocusable(true);
- //设置完毕之后加载Flash
- mWebView.loadUrl(swfPath);
- }
- //类中类:定义js中调用的Android类
- class RunJavaScript {
- public void runJs2Activity(String str) {
- strFromJs = str;
- mScriptHandler.removeCallbacks(mPlayerRunnable);
- mScriptHandler.postDelayed(mPlayerRunnable, 300);
- }
- }
- //类中接口:当js调用RunJavaScript时,新开辟线程处理消息,这里是接口
- Runnable mPlayerRunnable = new Runnable() {
- @Override
- public void run() {
- //文件操作行为
- if (strFromJs.equals("file1_open")||strFromJs.equals("file2_open")||strFromJs.equals("file3_open")||strFromJs.equals("file4_open")||strFromJs.equals("file5_open")||strFromJs.equals("file6_open") ) {
- File folder = new File("/mnt/external_sd/");
- //TF卡存在
- if(folder.length()>0){
- Intent intent = new Intent(MainFlashActivity.this,FileListActivity.class);
- intent.putExtra("filename", strFromJs);
- startActivity(intent);
- //TF卡不在
- }else{
- TipDialog mTipDialog = new TipDialog(MainFlashActivity.this, R.style.IdealDialog,R.drawable.no_tf_card,3);
- //设置背景透明度
- WindowManager.LayoutParams lp=mTipDialog.getWindow().getAttributes();
- lp.dimAmount=0.7f;
- mTipDialog.getWindow().setAttributes(lp);
- mTipDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
- mTipDialog.show();
- }
- }
- }
- };
- //加载Antivity是调用
- @SuppressLint("Recycle") @Override
- protected void onResume() {
- super.onResume();
- //flash在回到该Activity是能够继续播放
- try {
- mWebView.getClass().getMethod("onResume").invoke(mWebView, (Object[]) null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //Activity停止时调用
- @Override
- protected void onPause() {
- super.onPause();
- //允许flash暂停播放
- try {
- mWebView.getClass().getMethod("onPause").invoke(mWebView, (Object[]) null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //该Activity销毁时调用
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mWebView.destroyDrawingCache();
- mWebView.destroy();
- try {
- mHandler.removeMessages(0);
- mTimer.cancel();
- } catch (Exception e) {
- }
- }
- }
Android加载flash时有一些要注意的问题:Webview加载flash一开始会出现白屏,可以通过刷图的形式掩盖;刚加载完flash,它还无法获得Android用户的焦点事件,必须在代码里面模拟点击屏幕,才可以获得焦点;在运行flash的过程中可能会出现焦点丢失的情况,我的方案是每隔几秒点击屏幕一次;Android加载flash需要flash插件,必须确保插件装好了,但是。即使插件装好了也不能通信,必须要把要加载的flash的路径写到flash插件安装目录下的安全路径文件中,这点非常重要,如读者遇到该问题,需要帮助的话可在线留言~
flash数据交互的更多相关文章
- Flex数据交互之Remoting
一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数 ...
- Flex数据交互之Remoting[转]
Flex数据交互之Remoting 一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章 ...
- Unity3D和网页数据交互的基本原理
简介: 1.Unity3D的游戏引擎是和编辑器集成在一起的,所有它也是一个制作/开发平台. 2.Unity3D是使用JavaScript.C#作为核心脚本语言来驱动事个游戏引擎. 3.平台可以发布Ex ...
- Android客户端和服务器端数据交互
网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...
- 使用Jquery.AJAX方法和PHP后台数据交互小结
使用jQuery的AJAX方法和后台PHP进行数据交互,交互采用的数据格式JSON格式. 我主要小小的总结了一下,我使用AJAX方法时候遇到一些小小的问题. 第一:在传递数据的时候,传输地址注意是否正 ...
- View与Control间的数据交互
View与Control间的数据交互 1.ViewBag.Name ="Name1" 2.ViewData["VD"] = "view data&qu ...
- .net实现与excel的数据交互、导入导出
应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨. 本人之前从事PHP的开发工作,熟悉PHP的都应该 ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- JSP数据交互
JSP数据交互 一.jsp中java小脚本 1.<% java代码段%> 2.<% =java表达式%>不能有分号 3.<%!成员变量和函数声明%>二.注释 1 ...
随机推荐
- 百度编辑器Ueditor增加字体的修改方法
http://www.jb51.net/article/109896.htm Ueditor本身自带11种字体 使用过程中这11种字体往往不能满足我们的需求,现在我要添加"仿宋" ...
- macbook air扩展显示器全屏滑动怎样不一起滑动?
macbook air 外接了一个显示器(扩展),当我有多个桌面时,用手指滑动触控板切换桌面时,扩展屏幕也跟着切换桌面有什么办法能让我在切换主屏幕桌面的时候,扩展屏幕保持不动呢?上周还好好的,昨晚关机 ...
- 开启Nginx的目录文件列表功能
ngx_http_autoindex_module 此模块用于自动生成目录列表,ngx_http_autoindex_module只在 ngx_http_index_module模块未找到索引文件时 ...
- css scale 元素放大缩小效果
<style> .trans-scale { width: 300px; height:300px; margin:100px auto; background:#99F; transit ...
- Zabbix 3.2.4至3.2.7的升级方案
1.关闭Zabbix Server 防止有新的数据提交到数据库中,也可以关闭数据库.如果更新过程中,评估告警信息可以忽略,可以先执行备份操作. 1.1.检查当前版本 /usr/local/zabbix ...
- J2ee的13个规范
以下来自于网络. 1.JDBC(java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,就像ODBC一样,JDBC对开发者屏蔽了一些细节问题, ...
- php 快排
<?php $arr =array(3,1,5,67,8,7,9,9); function qsort(&$arr,$head,$tail){ if($head>=$tail){ ...
- ContentProvider、ContentResolver、ContentObserver之间的关系
ContentProvider.ContentResolver.ContentObserver之间的关系 ContentPRrovider: * 四大组件的内容提供者,主要用于对外提供数据 * 实现各 ...
- HDU - 4496 City 逆向并查集
思路:逆向并查集,逆向加入每一条边即可.在获取联通块数量的时候,直接判断新加入的边是否合并了两个集合,如果合并了说明联通块会减少一个,否则不变. AC代码 #include <cstdio> ...
- mongodb 3.4 分片 一主 一副 一仲 鉴权集群部署.
Docker方式部署 为了避免过分冗余,并且在主节点挂了,还能顺利自动提升,所以加入仲裁节点 mongodb版本: 环境:一台虚拟机 三个configsvr 副本: 端口为 27020,27021,2 ...