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

原创 2004年07月21日 11:54:00

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

 

TCP长连接和短连接

原文:http://www.cnblogs.com/bigwalnut/articles/2129070.html TCP/IP通信程序设计的丰富多样性  刚接触TCP/IP通信设计的...
  • zhangxiao93
  • zhangxiao93
  • 2016年08月17日 14:36
  • 464

网络通信中的长连接和短连接

长连接与短连接(转)      Client/Server 通信方式建立后,下一步就需要考虑通信连接的方式,主要有两种方式的连接,即长连接通信与短连接通信。通信连接方式涉及到的 APIs 主要...
  • mazy1226
  • mazy1226
  • 2014年03月14日 08:23
  • 872

Java Socket长连接异步单工保持心跳

Socket异步单工长连接心跳机制
  • s_1013338140
  • s_1013338140
  • 2015年11月17日 16:40
  • 795

如何从一台客户机向服务机发起40亿TCP长连接?

这绝不是标题党!其实这是一篇“科普”文章,讲述了关于“socket=((client_ip:client_port)-(server_ip:server_port),pocotol)”的一个普遍的误解...
  • lostaway
  • lostaway
  • 2014年09月21日 14:40
  • 4699

《Mac-网络端口监听访问查询》---相关命令记录

记录一下Mac(不知道在linux中适用不)中常用的几个端口查询的命令。1. netstat命令用法 netstat -an | grep 88442.lsof命令-i 网络链接lsof -i:884...
  • w695050167
  • w695050167
  • 2017年05月24日 17:52
  • 1017

Linux_Linux命令_nc 监听端口/从端口获取数据

NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小)、功能实用,被设计为一个简单、可靠的网络工具,可通...
  • u010003835
  • u010003835
  • 2016年08月16日 11:17
  • 15338

异步同步,长连接短连接,半双工全双工单工看这一篇就够了

关于异步同步,长连接短连接,半双工全双工单工概念的整理 同步:如:三次握手,需要请求-响应配对,才进行下一个请求-响应; 异步:如:UDP会话,只管自己做自己的,至于对端是否处理成功,没有关...
  • StrideBin
  • StrideBin
  • 2017年06月23日 10:35
  • 13759

关于Socket长连接异步单工

1.关于异步单工长连接的概念问题,百度上有很多大牛给出了解释,在这边就不进行说明了,直接来代码 2.长连接异步单工 保持心跳,15秒发送一个心跳,服务器端60秒接收一次心跳,以此来判断两条链路是否在线...
  • s_1013338140
  • s_1013338140
  • 2015年11月17日 16:28
  • 1819

查看监听端口命令

netstat -ano
  • yacper
  • yacper
  • 2010年10月17日 01:20
  • 2689

linux端口监听命令

while((1)); do netstat -an| grep 端口;date;sleep 1;done
  • fhx007
  • fhx007
  • 2015年10月26日 10:39
  • 1204
收藏助手
不良信息举报
您举报文章:基于“单端口长连接”进行交易通讯和监听控制命令
举报原因:
原因补充:

(最多只允许输入30个字)