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
- h5 利用socketchannel发送请求
- NIO--SocketChannel发送HTTP请求
- NIO--SocketChannel发送HTTP请求
- socketChannel h5
- socketChannel h5
- socketChannel h5
- socketChannel h5
- 利用JAVA发送POST请求
- 利用httpcilent发送post请求
- Java利用HttpURLConnection发送请求
- 利用NSConnection发送POST请求
- 利用HttpURLConnection发送post请求上传文件
- Java利用HttpURLConnection发送post请求
- 利用HttpURLConnection发送post请求上传文件
- 利用HttpURLConnection发送post请求上传文件
- 利用curl来发送http请求
- 利用HttpClient发送Get和Post请求
- Java利用HttpURLConnection发送post请求
- iOS 编程中 throttle 的那些事
- Maven安装配置
- protobuf.js如何读取二进制数据
- C++文件读写操作
- [LeetCode] 8. String to Integer (atoi) java
- h5 利用socketchannel发送请求
- CoreLocation
- Navicat 解决方案之ORA-28547
- 第34篇 再谈http协议
- java——基本数据类型
- AngularJs学习笔记
- 集体编程智慧--第五章:优化算法
- mongoDB——安装和启动
- 【腾讯Bugly干货分享】你为什么需要 Kotlin