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

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

 

如何实现单服务器300万个长连接的?

引自:http://www.zhihu.com/question/20831000 看到一篇文章说“最终我们采用了多消息循环、异步非阻塞的模型,在一台双核、24G内存的服务器上,实现峰值...
  • swazer_z
  • swazer_z
  • 2015年10月15日 11:33
  • 1216

dubbo协议下的单一长连接与多线程并发如何协同工作

上班的路上突然就冒出了这么个问题:既然在dubbo中描述消费者和提供者之间采用的是单一长连接,那么如果消费者端是高并发多线程模型的web应用,单一长连接如何解决多线程并发请求问题呢? 其实如果不...
  • joeyon
  • joeyon
  • 2016年04月03日 01:19
  • 9084

windows下的端口监听、程序端口查找命令

windows下的端口监听命令 netstat
  • u012385481
  • u012385481
  • 2014年08月07日 10:18
  • 10213

FTP的PORT和PASV的连接方式以及数据连接端口号计算

PORT(主动)方式的连接过程是: 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。  当需要传送数据时,客户端在命令链路上用 PORT命令告诉服务器:“我...
  • bestone0213
  • bestone0213
  • 2014年12月12日 13:43
  • 3254

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

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

mycat 9066管理端口 常用命令

1、连接mycat 9066管理端口   命令:mysql -uroot -proot -P9066 -h127.0.0.1   -u:用户名   -p:密码   -P:端口   -h:ip...
  • u010177899
  • u010177899
  • 2017年03月29日 10:51
  • 319

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

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

一、什么是长连接

HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这...
  • sd19871122
  • sd19871122
  • 2017年11月20日 19:11
  • 62

图解用NetCat连接远程端口

一 Netcat使用手册 简介: 在网络工具中有“瑞士军刀”美誉的NetCat(以下简称nc),在我们用了N年了至今仍是爱不释手。因为它短小精悍(这个用在它身上很适合,现在有人已经将其修改成大...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年08月02日 17:29
  • 3390

关于Socket长连接异步单工

1.关于异步单工长连接的概念问题,百度上有很多大牛给出了解释,在这边就不进行说明了,直接来代码 2.长连接异步单工 保持心跳,15秒发送一个心跳,服务器端60秒接收一次心跳,以此来判断两条链路是否在线...
  • s_1013338140
  • s_1013338140
  • 2015年11月17日 16:28
  • 1675
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于“单端口长连接”进行交易通讯和监听控制命令
举报原因:
原因补充:

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