h5 利用socketchannel发送请求

来源:互联网 发布:淘宝好看平价女装店铺 编辑:程序博客网 时间:2024/05/17 06:10

好不容易写出来的,以后做参考!

h5  利用socketchannel发送请求


function shopping_socket_test(sendJson){var receiveMsgJson = "";var SocketChannel = plus.android.importClass("java.nio.channels.SocketChannel");var Selector = plus.android.importClass("java.nio.channels.Selector");var SelectionKey = plus.android.importClass("java.nio.channels.SelectionKey");var InetSocketAddress = plus.android.newObject("java.net.InetSocketAddress","192.168.1.135",2001);var ByteBuffer = plus.android.importClass("java.nio.ByteBuffer");var Iterator = plus.android.importClass("java.util.Iterator");var ByteArrayOutputStream = plus.android.importClass("java.io.ByteArrayOutputStream");var channel = null;var selector = null;try{channel = SocketChannel.open();plus.android.invoke(channel,"configureBlocking",false);selector = Selector.open();plus.android.invoke(channel,"register",selector,SelectionKey.OP_CONNECT);plus.android.invoke(channel,"connect",InetSocketAddress);var isOver = false;while(isOver == false){plus.android.invoke(selector,"select");var ite_keys = selector.selectedKeys();plus.android.importClass(ite_keys);var ite = ite_keys.iterator();while(plus.android.invoke(ite,"hasNext")){var selected_key = plus.android.invoke(ite,"next");plus.android.invoke(ite,"remove");if(plus.android.invoke(selected_key,"isConnectable")){if(plus.android.invoke(channel,"isConnectionPending")){if(plus.android.invoke(channel,"finishConnect")){plus.android.invoke(selected_key,"interestOps",SelectionKey.OP_READ);var sendMessage = plus.android.invoke(sendJson,"getBytes","UTF-8");plus.android.invoke(channel,"write",ByteBuffer.wrap(sendMessage));}}else{plus.android.invoke(selected_key,"cancel");console.log("cancel")}}else if(plus.android.invoke(selected_key,"isReadable")){            var channel = plus.android.invoke(selected_key,"channel");            var buffer = ByteBuffer.allocate(1024);            var baos = new ByteArrayOutputStream();            var size = 0;            while ((size = plus.android.invoke(channel,"read",buffer)) > 0) {                  buffer.flip();                baos.write(buffer.array(),0,size);                  buffer.clear();              }              baos.close();            receiveMsgJson = baos.toString();            console.log(receiveMsgJson);            isOver = true;}}}}catch(e){//TODO handle the exceptionreceiveMsgJson = "error:服务器没有开启,请确认!";console.log(e);}finally{if(channel != null){            try {                channel.close();            } catch (e) {                                      console.log(e);            }                          }                 if(selector != null){            try {                selector.close();            } catch (e) {                console.log(e);            }        }}console.log(receiveMsgJson);return receiveMsgJson;}


后台的做法:PosInterfaceSocketThread

package com.ccl.cloud.system.listener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;import java.text.MessageFormat;import java.util.Date;import java.util.List;import org.apache.log4j.Logger;import org.jeecgframework.core.util.ExceptionUtil;import org.jeecgframework.p3.core.utils.common.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import com.ccl.cloud.system.entity.TSTouristEntity;import com.ccl.cloud.system.service.TSTouristServiceI;import net.sf.json.JSONObject;public class PosInterfaceSocketThread extends Thread{private static final Logger logger = Logger.getLogger(PosInterfaceSocketThread.class);  @Autowiredprivate TSTouristServiceI tSTouristService;/**erp 地址与port*/private static final String ERP_IP = "127.0.0.1";private static final int ERP_PORT = 2000;private Socket clientSocket;public PosInterfaceSocketThread(Socket clientSocket){this.clientSocket = clientSocket;}public void run(){BufferedReader bufferedReader = null;OutputStreamWriter outputStreamWriter = null; try {// 接受客户端的请求,获得输入流,获得客户端的请求bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String requestMsg = bufferedReader.readLine();System.out.println("request:" + requestMsg);// 发送消息给erp,并获得返回的信息String responseMsg = recAndSendErpSocketMessage(ERP_IP,ERP_PORT,requestMsg);System.out.println("respone:" + responseMsg);// 判断是否收银员登录,如果是,则发送"开始"请求,并登录到本地服务器if(StringUtils.isNotBlank(requestMsg)){// 收银员登录if(requestMsg.startsWith("LOGINCERTIFY")){responseMsg = sendLoginRequest(requestMsg,responseMsg);}}// 将信息返回给pos端outputStreamWriter = new OutputStreamWriter(clientSocket.getOutputStream(),"UTF-8");    outputStreamWriter.write(responseMsg);    outputStreamWriter.flush();        if (null != outputStreamWriter){outputStreamWriter.close();}if(null != bufferedReader){bufferedReader.close();}} catch (IOException e) {//e.printStackTrace();logger.error(ExceptionUtil.getExceptionMessage(e));}}/** * 发送消息给erp,并获得返回的信息 * @param ip * @param port * @param receiveMessage * @return String */private String recAndSendErpSocketMessage(String ip,int port,String receiveMessage){    String response_json = "";try{Socket socket = new Socket(ip,port);socket.setSoTimeout(60*1000); // 1分钟// 发送给erp或者客户端OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream(),"UTF-8");    outputStreamWriter.write(receiveMessage);    outputStreamWriter.flush();    // 从erp中接受数据    InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream(),"UTF-8");    int msg = 0;    while((msg = inputStreamReader.read()) != -1){    response_json += (char)msg;    }        inputStreamReader.close();    outputStreamWriter.close();    socket.close();}catch(IOException e){// e.printStackTrace();logger.error(ExceptionUtil.getExceptionMessage(e));response_json = "error:erp服务超时了,请确认!";}return response_json;}/** * 判断是否收银员登录,如果是,则发送"开始"请求,并登录到本地服务器 * @param requestMsg * @param responseMsg * @return */private String sendLoginRequest(String requestMsg,String responseMsg){// 判断返回的数据,如果retflag = 0,则登录到本地服务器JSONObject responseJson = JSONObject.fromObject(responseMsg);String retflag = responseJson.get("retflag").toString();if("0".equals(retflag)){JSONObject requestJson = JSONObject.fromObject(requestMsg);String posno = requestJson.getString("posno");String operator = requestJson.getString("operators");// "开始"请求发送String startShoppingRequestFormat = "POSCERTIFY${\"operators\":\"{0}\",\"posno\":\"{1}\",\"flag\":\"0\"}";String startShoppingRequest = MessageFormat.format(startShoppingRequestFormat, new Object[]{"["+operator+"]","["+posno+"]"});System.out.println("startShoppingRequest:" + startShoppingRequest);// 发送消息给erp,并获得返回的信息String startShoppingResp = recAndSendErpSocketMessage(ERP_IP,ERP_PORT,startShoppingRequest);System.out.println("startShoppingResp:" + startShoppingResp);// 判断返回的数据JSONObject startShoppingRespJson = JSONObject.fromObject(startShoppingResp);retflag = startShoppingRespJson.get("retflag").toString();String flowno = startShoppingRespJson.get("flow_no").toString();if("1".equals(retflag)){// 异常responseMsg = startShoppingResp;}else{// 登录本地服务器boolean isLogin = cashierLogin(posno,flowno);if(!isLogin){responseMsg = "LOGININFO${\"operators\":\""+operator+"\",\"retflag\":\"1\",\"retmsg\":\"本地服务器登录异常!\"}";}}}System.out.println("responseMsg:" + responseMsg);return responseMsg;}/** *  * @param posno * @param flowno * @return */private boolean cashierLogin(String posno,String flowno) {// 判断当天是否登录boolean isLogin = false;String sqlSelect = "select * from t_s_tourist where DATE_ADD(createTime,INTERVAL 1 day) >= now() and isTourist = '2'";List<TSTouristEntity> selList = this.tSTouristService.findListbySql(sqlSelect);if(null != selList && 0 != selList.size()){isLogin = true;}if(isLogin){// 24h内存在登录isLogin = true;}else{TSTouristEntity tSTourist = new TSTouristEntity();// 24h内没有登录,则登录// 创建时间tSTourist.setCreateTime(new Date());// 是否是游客 tSTourist.setIsTourist("2");// posnotSTourist.setUuid(posno);// 交易流水号tSTourist.setFlowno(flowno);tSTouristService.save(tSTourist);}         return isLogin;}}



PosInterfaceSocketThreadChat.java

package com.ccl.cloud.system.listener;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.net.Socket;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.SocketChannel;public class PosInterfaceSocketThreadChat extends Thread{private SelectionKey key;private String ERP_IP;private int ERP_PORT;public PosInterfaceSocketThreadChat(SelectionKey key,String erp_ip,int erp_port){this.key = key;this.ERP_IP = erp_ip;this.ERP_PORT = erp_port;}public void run(){// 服务器可读取消息:得到事件发生的Socket通道         SocketChannel channel = (SocketChannel) key.channel();        // 创建读取的缓冲区          ByteBuffer buffer = ByteBuffer.allocate(1024);          //把读取到的缓冲区内容存入到流内,到最后一次性取出来,建议定义自定义协议先传内容长度然后再传内容,就可以根据长度建立对应长度缓冲区然后读取数据        ByteArrayOutputStream baos = new ByteArrayOutputStream();          try {              int size = 0;              while ((size = channel.read(buffer)) > 0) {                  buffer.flip();                  baos.write(buffer.array(),0,size);                  buffer.clear();              }            baos.close();            System.out.println("服务器当前处理线程:"+Thread.currentThread().getName()+" 服务端收到信息:"+baos.toString());             // 发送数据到erp,并从erp服务器中获得数据            String receiveMsg = recAndSendErpSocketMessage(this.ERP_IP,this.ERP_PORT,baos.toString());            byte[] content = receiveMsg.getBytes("UTF-8");            //byte[] content=baos.toByteArray();            System.out.println("content:"+content);            ByteBuffer writeBuf = ByteBuffer.allocate(content.length);            writeBuf.put(content);            writeBuf.flip();            channel.write(writeBuf);// 将消息回送给客户端              if(size==-1){                //System.out.println("客户端断开。。。");                 channel.close();            }else{                //没有可用字节,继续监听OP_READ                key.interestOps(key.interestOps()|SelectionKey.OP_READ);                key.selector().wakeup();            }        }catch (Exception e) {            System.out.println(e.getMessage());        }/*try{ // 获取客户端传输数据可读取消息通道。        SocketChannel channel = (SocketChannel)key.channel();        //创建读取数据缓冲器        ByteBuffer buffer = ByteBuffer.allocate(1024);        channel.read(buffer);        byte[] data = buffer.array();        String message = new String(data);                if(buffer.position() != 0){        // 向pos端发送 从erp返回的消息        sendPortSocketMessage(channel,message);                // 向erp发消息并接受从erp返回的消息        //String receiveMsg = recAndSendErpSocketMessage(ERP_IP,ERP_PORT,message);        // 向pos端发送 从erp返回的消息        //sendPortSocketMessage(channel,receiveMsg);        }}catch(Exception e){e.printStackTrace();}*/}/** * 发送消息给pos * @param socketChannel * @param message * @throws UnsupportedEncodingException  */private void sendPortSocketMessage(SocketChannel socketChannel,String message) throws Exception{byte[] bytes = message.getBytes();         ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);         writeBuffer.put(bytes);         writeBuffer.flip();        socketChannel.write(writeBuffer);        System.out.println("writeBuffer:"+writeBuffer);}/** * 发送消息给erp * @param ip * @param port * @param receiveMessage * @return String */private String recAndSendErpSocketMessage(String ip,int port,String receiveMessage){    String barcode_json = "";try{Socket socket = new Socket(ip,port);//socket.setSoTimeout(60*1000); // 1分钟// 发送给erp或者客户端OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream(),"UTF-8");    outputStreamWriter.write(receiveMessage);    outputStreamWriter.flush();    // 从erp中接受数据    InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream(),"UTF-8");    int msg = 0;    while((msg = inputStreamReader.read()) != -1){    barcode_json += (char)msg;    }        inputStreamReader.close();    outputStreamWriter.close();    socket.close();}catch(IOException e){e.printStackTrace();barcode_json = "error:超时了,请确认!";}return barcode_json;}}


0 0