NodejsMongoDB搭建安卓应用服务器更多技术博客 http://vilins.top/服务器环境Linux18.04安装Nodejsapt install nodejs安装MongoDB在这里我们需要从官网下载一个安装包 官网我选择的是tgz后缀的压缩包解压tar -zxvf xx.tgz # 解压 mv xx/ /usr/local/mongodb #拷贝到指定目录添加路径export PATH/usr/local/mongodb/bin:$PATH创建数据库目录/data/db是MongoDB的默认启动数据库路径mkdir -p /data/db运行MongoDB服务通过以下命令运行服务mongod后台管理Shell运行需要进入到MongoDB的安装目录然后运行cd /usr/local/mongodb/bin mongo倘若我们的服务器是只有Shell界面的按照以上办法运行了后台服务以后就不能启动MongoDB的Shell服务了在这里我想到了操作系统的多进程的知识初步的想法是将MongoDB后台服务运行在后台进程然后再运行MongoDB的Shell具体实现如下开启MongoDB后台服务mongod --fork --logpath 1 --dbpath 2这里1代表MongoDB日志文件的位置2表示数据的存储目录在运行命令之前最好把这两个路径的文件先建好。关闭MongoDB后台服务mongo use admin db.shutdownServer()先通过mongo命令进入mongod命令行然后切换到管理员模式最后关闭服务器。关闭服务的第二种方式是指定数据存储目录mongod --shutdown --dbpath 数据存储目录运行服务器代码let mongodb require(mongodb); let express require(express); let bodyParser require(body-parser); let app express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); let MongoClient mongodb.MongoClient; let url mongodb://localhost:27017; MongoClient.connect(url, {useNewUrlParser: true}, function(err, client) { if(err) { console.log(error); } else { app.post(/login, (require, response, next) { let post_data require.body; let username post_data.username; let password post_data.password; let db client.db(local); db.collection(phone).find({username:username}).count(function(err, number) { if(number 0) { response.json(user_not_exist); } else { db.collection(phone).findOne({username:username}, function(err, user) { let query_password user.password; console.log(query_password); if(password query_password) { response.json(successfully); } else { response.json(password_error); } }); } }); }); app.post(/register, (require, response, next) { let post_data require.body; let username post_data.username; let password post_data.password; let phone post_data.phone; let db client.db(local); var insertJson { username: username, password: password, phone:phone }; db.collection(phone).find({username:username}).count(function(err, number) { if(number ! 0) { response.json(username_used); } else { db.collection(phone).insertOne(insertJson, function(err, res) { if(err) { response.json(unknow_error); } else { response.json(register_successfully); } }); } }); }); app.listen(3000,(){ console.log(Connected to My Server, Webservice running on port 3000) }); } })通过node server.js命令运行服务器代码。Android代码基本的思想是通过retrofit2okhttp对服务器进行访问注意的是如果你的服务器在本机使用的IP地址是10.0.2.2如果是公网地址直接填写公网地址即可。package com.example.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.util.concurrent.TimeUnit; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends AppCompatActivity { private Button login; private Button clear; private TextView n; private TextView p; private TextView ph; private Myserver myserver; private CompositeDisposable mCompositeDisposable new CompositeDisposable(); private String name; private String password; private String phone; private TextView login_t; private TextView register_t; private TextView textView3; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); login findViewById(R.id.login); n findViewById(R.id.user); p findViewById(R.id.password); clear findViewById(R.id.clear); ph findViewById(R.id.phone); login_t findViewById(R.id.login_t); register_t findViewById(R.id.register_t); textView3 findViewById(R.id.textView3); // 创建 OKHttpClient OkHttpClient.Builder builder new OkHttpClient.Builder(); builder.connectTimeout(3, TimeUnit.SECONDS);//连接超时时间 builder.writeTimeout(3,TimeUnit.SECONDS);//写操作 超时时间 builder.readTimeout(3,TimeUnit.SECONDS);//读操作超时时间 myserver (Myserver) new Retrofit.Builder().baseUrl(http://ip:3000) .client(builder.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() .create(Myserver.class); login.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { name n.getText().toString(); password p.getText().toString(); phone ph.getText().toString(); String temp login.getText().toString(); switch (temp) { case 登录: DisposableObserverString disposableObserver_login new DisposableObserverString() { Override public void onNext(String r) { if(r.equals(password_error)) { Toast.makeText(MainActivity.this, R.string.password_error, Toast.LENGTH_LONG).show(); } else if(r.equals(user_not_exist)) { Toast.makeText(MainActivity.this, R.string.user_not_exist, Toast.LENGTH_LONG).show(); } else if(r.equals(unknow_error)) { Toast.makeText(MainActivity.this, R.string.unknow_error, Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, R.string.successfully, Toast.LENGTH_LONG).show(); Intent intent new Intent(MainActivity.this, Login.class); startActivity(intent); } } Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, error, Toast.LENGTH_LONG).show(); e.printStackTrace(); } Override public void onComplete() { //Toast.makeText(GithubApi.this, R.string.network_error, Toast.LENGTH_LONG).show(); } }; myserver.loginUser(name, password).subscribeOn(Schedulers.newThread()). observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver_login); mCompositeDisposable.add(disposableObserver_login); break; case 注册: DisposableObserverString disposableObserver_register new DisposableObserverString() { Override public void onNext(String r) { if(r.equals(username_used)) { Toast.makeText(MainActivity.this, R.string.username_used, Toast.LENGTH_LONG).show(); } else if(r.equals(register_successfully)) { Toast.makeText(MainActivity.this, R.string.register_successfully, Toast.LENGTH_LONG).show(); Intent intent new Intent(MainActivity.this, Login.class); startActivity(intent); } else { Toast.makeText(MainActivity.this, R.string.unknow_error, Toast.LENGTH_LONG).show(); } } Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, error, Toast.LENGTH_LONG).show(); e.printStackTrace(); } Override public void onComplete() { //Toast.makeText(GithubApi.this, R.string.network_error, Toast.LENGTH_LONG).show(); } }; myserver.registerUser(name, password, phone).subscribeOn(Schedulers.newThread()). observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver_register); mCompositeDisposable.add(disposableObserver_register); break; default: break; } } }); clear.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { n.setText(); p.setText(); ph.setText(); } }); login_t.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { n.setVisibility(View.VISIBLE); ph.setVisibility(View.GONE); p.setVisibility(View.VISIBLE); login.setText(登录); register_t.setVisibility(View.VISIBLE); login_t.setVisibility(View.GONE); textView3.setVisibility(View.GONE); } }); register_t.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { n.setVisibility(View.VISIBLE); ph.setVisibility(View.VISIBLE); p.setVisibility(View.VISIBLE); login.setText(注册); register_t.setVisibility(View.GONE); login_t.setVisibility(View.VISIBLE); textView3.setVisibility(View.VISIBLE); } }); } }github地址更多技术博客 http://vilins.top/