基于“单端口长连接”进行交易通讯和监听控制命令

import java.net.*;
import java.io.*;
import java.net.*;
import java.io.*;
import com.nantian.iclient.log.*;
import com.nantian.iclient.plugininterface.*;
import com.nantian.iclient.atm.sdb.*;
import com.nantian.util.Utility;

public class Communication {
  private static Communication instance;
  private static Socket sock;
  private static String message;
  private static LAAdapter lap;
  private static recvThread recvthread;
  private static boolean available = true;

  private static final String COMM = "iclient.communication";
  private static final String FS = new String(new byte[] { (byte) 0x1C}); //域分隔符;
  private static final String HOSTCMD_TRSCODE = "6093";

  //返回唯一的实列
  static synchronized public Communication getInstance(String address,
      String port, LAAdapter lap) throws IOException {
    Logger.info(COMM, "Get a Communication Instance...");
    if (instance == null) {
      instance = new Communication(address, port, lap);
    }
    return instance;
  }

  private Communication(String address, String port, LAAdapter lap) throws IOException {
    Logger.info(COMM, "ClientInit Server IP:[" + address +"] PORT:[" + port + "]");
    this.lap = lap;
    this.sock = new Socket(address, Integer.parseInt(port));
    this.sock.setSoTimeout(500);
    recvthread = new recvThread(this);
    recvthread.start();
    Logger.info(COMM, "ClientInit Finished.");
  }

  /**
   * 发送报文,并等待(超时设置:60000毫秒)返回前置机返回。
   * @param msgTxt String
   * @throws Exception
   * @return String
   */
  public synchronized String sendText(String msgTxt) throws Exception {
    Logger.info(COMM, "Client Ready to Sending.");
    while(!available){
      Logger.info(COMM, "Client Ready to Sending...");
    }
    available = false;
    Logger.info(COMM, "Client Sending...");
    this.message = "";
    PrintWriter to_server_stream = new PrintWriter(new OutputStreamWriter(new
                  BufferedOutputStream(sock.getOutputStream())));
    to_server_stream.print(msgTxt);
    to_server_stream.flush();
    available = true;
    Logger.info(COMM, "Client Send:[" + msgTxt + "], Waiting for receiving...");
    wait(60000);  //等待recvThread接收返回数据包
    Logger.info(COMM, "Client received:["+this.message+"].");
    return this.message;
  }

  /**
   * 发送报文,不等待前置机返回。
   * @param msgTxt String
   * @throws Exception
   * @return String
   */
 public synchronized String sendTextS(String msgTxt) throws Exception {
    Logger.info(COMM, "Client Ready to Sending.");
    while(!available){
      Logger.info(COMM, "Client Ready to Sending...");
    }
    available = false;
    Logger.info(COMM, "Client Sending...");
    this.message = "";
    PrintWriter to_server_stream = new PrintWriter(new OutputStreamWriter(new
                BufferedOutputStream(sock.getOutputStream())));
    to_server_stream.print(msgTxt);
    to_server_stream.flush();
    available = true;
    Logger.info(COMM, "Client Send:[" + msgTxt + "].");
    //wait(60000);
    //Logger.info(COMM, "Client received:["+this.message+"].");
    return ""; //this.message;
  }

  /**
   * 接收报文
   */
  public synchronized void recvText() {
    while(!available){
    }
    available = false;

    char recvbuffer[] = new char[10000];
    int recvlength =0;
    try {
      //System.out.println("Client Receiving...");
      BufferedReader from_server_stream = new BufferedReader(new                                           InputStreamReader(sock.getInputStream()));
      recvlength = from_server_stream.read(recvbuffer);
    }
    catch (Exception e) {
       //System.out.println(e);
    }
    String recvString = new String(recvbuffer);
    available = true;
    //区分交易返回和控制命令
    if (recvlength > 0) {
      System.out.println("Client Received:[" + recvString +"][" + recvlength + "]");
      String[] fields = Utility.splitText12(recvString, "["+FS+"]");
      if (fields[10].equals(this.HOSTCMD_TRSCODE)){
        System.out.println("Client Received a Host Command.");
        new CmdExecutor(this, fields).start();
      }
      else{
        System.out.println("Client Received a Result-of-Transcation.");
        this.message = recvString;
        notify();
      }
    }
  }

  public static LAAdapter getLap() {
    return lap;
  }

}

 

================== recvThread.java ==================

package com.nantian.iclient.atm.sdb;

public class recvThread extends Thread {
  private Communication comm;

  public recvThread(Communication comm) {
    this.comm = comm;
  }

  public void run(){
    while(true){
      comm.recvText();
    }
  }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值