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();
}
}
}