關於html5plus的資料參考http://www.html5plus.org/
最近通過html5做手機app,其中涉及到網絡通過,必須采用原生的socket,websocket無法滿足要求,html5plus可以調用java包,java包封裝了socket,以多線程的方式工作,收到數據之后,以event的方式通知js,開發工具包括hbuilder和eclipse。
java代碼:
ClientSocket類:
package io.dcloud.net; import java.io.IOException; import java.net.Socket; import java.io.*; public class ClientSocket { public ClientSocket(String site, int port) { try { socket = new Socket(site, port); BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream()); BufferedReader userin = new BufferedReader(new InputStreamReader( System.in)); //new SendThread(out, userin, false).start(); m_recThread = new ReceiveTread(socket, in, out, userin); m_recThread.start(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } ReceiveTread m_recThread=null; public void test() { return; } public void setEventOberver(DataArrivedEvent event) { m_recThread.setEventOberver(event); } private Socket socket; //發送消息 public Boolean sendMsg(String msg){ try{ //BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println(msg); out.flush(); }catch(IOException e){ e.printStackTrace(); return false; } return true; } }
DataArrivedEvent接口:
package io.dcloud.net; public interface DataArrivedEvent { //public void onDataArrived(char [] data,int nsize); public void onDataArrivedString(String data); }
ReceiveTread類:
package io.dcloud.net; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ReceiveTread extends Thread{ BufferedReader in ; ServerSocket server; PrintWriter out; BufferedReader userin; Socket client; public ReceiveTread(ServerSocket server,BufferedReader in,PrintWriter out,BufferedReader userin,Socket client) { this.in = in; this.server = server; this.client = client; this.out = out; this.userin = userin; } public ReceiveTread(Socket client ,BufferedReader in,PrintWriter out,BufferedReader userin) { this.in = in; this.client = client; this.out = out; this.userin = userin; } DataArrivedEvent m_event=null; public void setEventOberver(DataArrivedEvent event) { m_event=event; } @Override public void run() { try { while(true){ String info = in.readLine(); if(info !=null){ //System.out.println(info); if(m_event!=null) m_event.onDataArrivedString(info); if(info.equals("end")) break; } } in.close(); out.close(); userin.close(); if(client != null){ client.close(); } server.close(); } catch (IOException e) { e.printStackTrace(); } } }
html5plus代碼:
function plusReady(){ // 隱藏滾動條 plus.webview.currentWebview().setStyle({scrollIndicator:'none'}); // Android處理返回鍵 plus.key.addEventListener('backbutton',function(){ if(confirm('確認退出嗎?')){ plus.runtime.quit(); } },false); compatibleAdjust(); //添加測試代碼 var ClientSocket=plus.android.importClass("io.dcloud.net.ClientSocket"); var hevent = plus.android.implements( "io.dcloud. htnet.DataArrivedEvent", { "onDataArrivedString":function( info ){ console.log( "onDataArrivedString: "+info ); // 輸出“Invoked Object’s name: Tester” if(confirm('開到接收數據了嗎:'+info)){ }; } } ); //創建ClientSocket var clientSocket=new ClientSocket("192.168.2.139",20000); clientSocket.test(); clientSocket.setEventOberver(hevent); }
小米3手機調試通過。