Android Socket With NodeJS
MainActivity
package com.buzz.beaconlib; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ListView; import android.widget.TextView; import android.os.StrictMode; import android.os.Handler; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Message; import android.widget.Button; import android.view.View; //import android.util.Log; import android.widget.ArrayAdapter; import org.codehaus.jackson.map.ObjectMapper; import java.io.*; import java.net.*; import java.lang.*; import java.util.*; public class MainActivity extends ActionBarActivity { private static String HOST = "192.168.0.106"; private static int PORT = 2397; static String ActiveCMD = ""; Socket socket; Thread socketMsgThread; Handler inHandler; Handler resultHandler; InputStream in; ObjectMapper objectMapper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Bundle bundle = getIntent().getExtras(); HOST = bundle.getString("HOST"); PORT = Integer.parseInt(bundle.getString("PORT")); StrictMode.setThreadPolicy( new StrictMode .ThreadPolicy .Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy( new StrictMode .VmPolicy .Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); final TextView tvHost = (TextView) findViewById(R.id.tvHost); tvHost.setText(HOST); final TextView tvPort = (TextView) findViewById(R.id.tvPort); tvPort.setText(String.valueOf(PORT)); try { socket = new Socket(HOST, PORT); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } final Button btnGetBeaconInfo = (Button) findViewById(R.id.btnGetBeaconInfo); final Button btnGetSysparams = (Button) findViewById(R.id.btnGetSysparams); final Button btnGetUserInfo = (Button) findViewById(R.id.btnGetUserInfo); final Button btnAddSyslog = (Button) findViewById(R.id.btnAddSyslog); final Button btnAddKey = (Button) findViewById(R.id.btnAddKey); final Button btnOpen = (Button) findViewById(R.id.btnOpen); final Button btnClose = (Button) findViewById(R.id.btnClose); btnOpen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_OPEN); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "06"; } }); btnClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_CLOSE); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "07"; } }); btnGetBeaconInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_GET_BEACON_INFO); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "01"; } }); btnGetSysparams.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_GET_SYS_PARAMS); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "02"; } }); btnGetUserInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_GET_USER_INFO); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "03"; } }); btnAddSyslog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_ADD_SYS_LOG); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "04"; } }); btnAddKey.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(GlobalConst.CMD_ADD_KEY); writer.flush(); } catch (UnknownHostException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } catch (IOException e) { e.printStackTrace(); ShowDialog(e.getMessage()); } ActiveCMD = "05"; } }); objectMapper = new ObjectMapper(); resultHandler = new Handler() { public void handleMessage(Message msg) { List<String> ds = new ArrayList<String>(); switch (msg.what) { case 1: BeaconInfo beaconInfo = (BeaconInfo) msg.obj; ds.add(beaconInfo.getBeacon().get(0).toString()); for (triggers t : beaconInfo.getTriggers()) { ds.add(t.toString()); } for (contents c : beaconInfo.getContents()) { ds.add(c.toString()); } ShowResult(ds); break; case 2: Sysparams[] sysparamsList = (Sysparams[]) msg.obj; for (Sysparams sp : sysparamsList) { ds.add(sp.toString()); } ShowResult(ds); break; case 3: UserInfo[] userInfoList = (UserInfo[]) msg.obj; ds.add(userInfoList[0].toString()); ShowResult(ds); break; case 4: ShowResult(ds); break; } } }; inHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: TextView tvJsonData = (TextView) findViewById(R.id.tvJsonData); tvJsonData.setText(msg.obj.toString()); switch (ActiveCMD) { case "01": try { BeaconInfo beaconInfo = objectMapper.readValue(msg.obj.toString(), BeaconInfo.class); Message message = new Message(); message.what = 1; message.obj = beaconInfo; resultHandler.sendMessage(message); } catch (IOException ex) { ShowDialog(ex.toString()); return; } break; case "02": try { Sysparams[] SysparamsList = objectMapper.readValue(msg.obj.toString(), Sysparams[].class); Message message = new Message(); message.what = 2; message.obj = SysparamsList; resultHandler.sendMessage(message); } catch (IOException ex) { ShowDialog(ex.toString()); return; } break; case "03": try { UserInfo[] userInfoList = objectMapper.readValue(msg.obj.toString(), UserInfo[].class); Message message = new Message(); message.what = 3; message.obj = userInfoList; resultHandler.sendMessage(message); } catch (IOException ex) { ShowDialog(ex.toString()); return; } break; default: Message message = new Message(); message.what = 4; resultHandler.sendMessage(message); break; } break; default: break; } } }; try { in = socket.getInputStream(); } catch (Exception ex) { return; } socketMsgThread = new Thread(runnable); socketMsgThread.start(); } Runnable runnable = new Runnable() { @Override public void run() { String line = ""; while (true) { try { byte[] temp = new byte[10240];// 默认最带为256 int size = 0; while ((size = in.read(temp)) > 0) { // -1表示文件结尾 byte[] res = new byte[size];// 默认最带为256 System.arraycopy(temp, 0, res, 0, size); for (int i = 0; i < size; i++) { line += (char) res[i]; } Message message = new Message(); message.what = 1; message.obj = line; inHandler.sendMessage(message); line = ""; } } catch (Exception ex) { return; } } } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void ShowResult(List<String> ds){ ListView lvResult = (ListView) findViewById(R.id.lvResult); lvResult.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,ds)); } private void ShowDialog(String msg) { new AlertDialog .Builder(this) .setTitle("notification") .setMessage(msg) .setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); } }
core.js
var net=require('net'); var mysql=require('./mysqlpool.js'); var client=require('./doorclient.js'); var fileserver=require('./fileserver.js'); function execute_command(socket, command, args) { switch(command){ case "90": client.open(); break; case "91": client.close(); break; case "01": mysql.getBeaconInfo(socket,args); break; case "02": mysql.getSysparams(socket); break; case "03": mysql.getUserInfo(socket,args); break; case "04": mysql.addSyslog(socket,args); break; case "05": mysql.addKey(socket,args); } }; var s = net.createServer(function(socket) { console.log('server connected'); socket.on('data', function(d) { data = d.toString('utf8').trim(); var cmd_re = /^(\d{2})+[ ]*(.*)/g; cmd_match = cmd_re.exec(data) if (cmd_match) { var command = cmd_match[1]; var args = cmd_match[2]; console.log(command+" "+args); execute_command(socket, command, args); } }); socket.on('end', function() { console.log('server disconnected'); }); socket.on('error', function (ex) { console.log("ignoring exception: " + ex); }); }); s.listen(2397,'192.168.0.106'); console.log('listen on server port:2397...');