h5 利用socketchannel发送请求

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

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 exception
		receiveMsgJson = "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);  

	@Autowired
	private 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");
			// posno
			tSTourist.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值