Socket 例子
package com.pab.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 平安银行
* @author jian.zhou
*/
public class PabUtil {
/** 不允许实例 */
private PabUtil() {
super();
}
private final static Logger log = LoggerFactory.getLogger(PabUtil.class);
private static final int[] FIELD_LENGTH_INDEX = new int[] { // 用来计算各个字段的在报文头中的长度和位置
1, 7, 9, 11, 31, 41, 47, 52, 54, 62, 68, 88, 94, 194, 195, 198, 199, 200, 212, 222, 223 };
private static int[] FIELD_LENGTH = new int[FIELD_LENGTH_INDEX.length]; // 纪录各个字段的字节表示在数组中的起始位置,最后一位是补位-为方便解析而添加
static {
for (int i = 0; i < FIELD_LENGTH_INDEX.length; i++) {
FIELD_LENGTH[i] = FIELD_LENGTH_INDEX[i] - 1;
}
}
/**
* 截取字节
* @param src
* @param begin
* @param end
* @return
*/
public static byte[] subBytes(byte[] src, int begin, int end) {
int len = end - begin;
byte[] bs = new byte[len];
for (int i = begin; i < begin + len; i++)
bs[i - begin] = src[i];
return bs;
}
/**
* 发送报文
* @param msg 报文
* @return String[] = backArray[0]状态 = succ, fail, backArray[1] = 返回的报文
*/
public static String[] sendPacket(String msg, Properties prop) {
log.info("PAB 110001 SEND PACKET IS:{}", msg);
Socket socket = null;
BufferedInputStream bi = null;
BufferedOutputStream bo = null;
InputStream in = null;
String backMsg = "";
String[] backStr = new String[2];
String ip = prop.getProperty("merCustomIp");
int port = Integer.parseInt(prop.getProperty("pfxPassword"));
try {
// 客户端socket指定服务器的地址和端口号
socket = new Socket(ip, port);
socket.setSoTimeout(30000);
log.info("{}", socket);
OutputStream ops = socket.getOutputStream();
bo = new BufferedOutputStream(ops);
bo.write(msg.getBytes(PabContants.PINGAN_CODE_UTF8));
bo.flush();
in = socket.getInputStream();
bi = new BufferedInputStream(in);
byte[] hb = new byte[PabContants.PACKET_HEAD_LENGTH];// 读取固定报文头 长度为222
bi.read(hb, 0, PabContants.PACKET_HEAD_LENGTH);
log.info("PAB 110001 BACK PACKET HEAD IS:{}", new String(hb, PabContants.PINGAN_CODE_UTF8));
// 截取报文头 长度 222 位z
String[] packetHead = new String[FIELD_LENGTH_INDEX.length - 1];// 报文数组
int j = 0;
for (int i = 1; i < FIELD_LENGTH.length; i++) {
int start = FIELD_LENGTH[i - 1];
int end = FIELD_LENGTH[i];
byte[] b = subBytes(hb, start, end);
packetHead[j] = new String(b, PabContants.PINGAN_CODE_UTF8);
j++;
}
log.info("pakcetHead {}", Arrays.toString(packetHead));
// 根据开发文档 报文头的返回码为000000,表示后续存在xml报文体
if ("000000".equals(packetHead[11])) {
log.info("---start receive packet body----");
int parcketLength = Integer.parseInt(packetHead[4]);
byte[] backmsg = new byte[parcketLength];
int cnt = 0;
int iLen = 0;
while (cnt < (parcketLength)) {
iLen = bi.read(backmsg, cnt, parcketLength);
cnt += iLen;
}
backMsg = new String(backmsg, PabContants.PINGAN_CODE_UTF8);
backStr[0] = "succ";
backStr[1] = backMsg;
log.info("PAB 110001 BACK PACKET HEAD BODY IS:" + backStr[1]);
log.info("---end receive packet body----");
} else if ("YQ9996".equals(packetHead[11])) {
backStr[0] = "confirm";
backStr[1] = packetHead[11] + ":" + packetHead[12];
} else {
backStr[0] = "fail";
backStr[1] = packetHead[11] + ":" + packetHead[12];
log.info("trans error--- packetBody is not, backcode:" + packetHead[11] + ":" + packetHead[12].trim());
}
} catch (Exception e) {
log.error("{}", e);
} finally {
try {
if (bi != null) {
bi.close();
}
if (bo != null) {
bo.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
log.error("", e);
}
}
return backStr;
}
/**
* 判断是否为空
* @param str
* @return
*/
public static String isNull(String str) {
if (str == null) return "";
else return str;
}
}
Socket 例子的更多相关文章
- 阻塞式socket例子学习
/************************************************************************* > File Name: Win_Serve ...
- python3.* socket例子
On Server: # -*- coding: utf-8 -*-#this is the server import socketif "__main__" == __name ...
- 简单的SOCKET例子
定义实例socket.socket(),如果括号里不写参数,默认为IPV4+TCP 我们猜测客户端的完整代码如下: 同样我们猜测服务端的代码如下: 实际上运行客户端代码: 说明在py3里,网络编程发送 ...
- 网络编程 - 简单的socket例子
1.客户端 #客户端import socketclient=socket.socket() #生成socket连接对象client.connect(("localhost",696 ...
- 基于TCP的socket通信过程及例子
Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据.Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Sock ...
- coco2dx服务器简单例子
实现的单个socket例子,了解socket原理. 先创建一个win32的项目(命令行的),作为服务端 // SocketServer.cpp : 定义控制台应用程序的入口点.// #include ...
- .NET平台下几种SOCKET模型的简要性能供参考
转载自:http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html .NET平台下几种SOCKET模型的简要性能供参考 这个内容在cnbl ...
- Python Socket通信原理
[Python之旅]第五篇(一):Python Socket通信原理 python Socket 通信理论 socket例子 摘要: 只要和网络服务涉及的,就离不开Socket以及Socket编 ...
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
随机推荐
- PHP基础之Autoload
PHP的自动加载autoload机制很重要,这里做2个小练习 原创文章,转载请注明:http://www.cnblogs.com/phpgcs 文件结构如下,2种方式实现自动加载 1,自定义函数 2, ...
- Leetcode392. Is Subsequence
Description Given a string s and a string t, check if s is subsequence of t. You may assume that the ...
- Linux快速计算MD5和Sha1命令
Linux计算MD5和Sha1的命令 MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法 ...
- SpringBoot对比传统开发以及自身的优缺点
SpringBoot是伴随着Spring4.0诞生的,继承了Spring的优点,一经推出,引起了巨大的反向:目前Spring Boot的版本为2.1.0,需要Java7及Spring Framewor ...
- android-support-v7使用
前言:android-support-v7与v4相对,还是有很大不同的,首先v7中分为的3个JAR包,其次v7中提供的一些布局资源,所以在使用的时候,需要将v7的源码项目导入,作为lib项目来添加到你 ...
- UILabel标签文字过长时的显示方式
lineBreakMode:设置标签文字过长时的显示方式. label.lineBreakMode = NSLineBreakByCharWrapping; //以字符为显示单位显示,后面部分省略不显 ...
- 服务器之ECC报错检查
需要使用ipmitool工具 [root@Resource ~]# yum install ipmitool 首先查看是否有ecc报错 如下图: [root@Resource ~]# ipmitool ...
- 【Cocos游戏实战】功夫小子第八课之游戏打包和相关问题说明
至此,功夫小子系列的Cocos2d-x的实战文章就结束了. 源代码地址: https://github.com/SuooL/KungfuBoy 如须要资源请邮件我 1020935219@qq.com ...
- xshell ftp报错:找不到匹配的outgoing encryption算法
场景:由于登陆跳板机都是从采用密钥的方式进行登陆的,然后在传输文件的时候报错 报错信息: 解决方案: 点击属性--->选择aes256-ctr加密方式默认这里是没有选择的 再次连接就成功连接上去 ...
- java.lang.VerifyError: Expecting a stack map frame
https://blog.csdn.net/u013066244/article/details/78434134 对于java7而言,需要添加 -XX:-UseSplitVerifier(已实践). ...