短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。
比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
长连接与短连接的操作过程:
通常的短连接操作步骤是:
连接→数据传输→关闭连接;
而长连接通常就是:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了.
因公司推广需要,需要一套短链接生成方案,正好前几天在MSDN看到有人发了一个.net版的短链接算法,我就把它转换成java版,拿出来共享一下
生成思路:
1.将"原始链接(长链接)+key(自定义字符串,防止算法泄漏)"MD5加密
2.把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算,把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引,把取得的字符相加,每次循环按位右移 5 位,把字符串存入对应索引的输出数组(4组6位字符串)
3.生成4以下的随机数,从输入数组中取出随机数对应位置的字符串,作为短链,存入数据库或者NoSql
解析方式
编写一个web处理程序,把从ur(如:中解析短链接,将解析到的短链接(zAnuAn)与数据库中存入的原始链接进行匹配,跳转到匹配到的原始链接
package com.bjdata.test
import java.security.MessageDigest
import java.util.Random
public class ShortUrlTest {
public static void main(String[] args) {
String sLongUrl = "/bbs/_t_278433840/"// 原始链接
System.out.println("长链接:"+sLongUrl)
String[] aResult = shortUrl(sLongUrl)//将产生4组6位字符串
// 打印出结果
for (int i = 0i <aResult.lengthi++) {
System.out.println("[" + i + "]:" + aResult[i])
}
Random random=new Random()
int j=random.nextInt(4)//产成4以内随机数
System.out.println("短链接:"+aResult[j])//随机取一个作为短链
}
public static String[] shortUrl(String url) {
// 可以自定义生成 MD5 加密字符传前的混合 KEY
String key = "test"
// 要使用生成 URL 的字符
String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h",
"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z"
}
// 对传入网址进行 MD5 加密
String hex = md5ByHex(key + url)
String[] resUrl = new String[4]
for (int i = 0i <4i++) {
// 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
String sTempSubString = hex.substring(i * 8, i * 8 + 8)
// 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用long ,则会越界
long lHexLong = 0x3FFFFFFF &Long.parseLong(sTempSubString, 16)
String outChars = ""
for (int j = 0j <6j++) {
// 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引
long index = 0x0000003D &lHexLong
// 把取得的字符相加
outChars += chars[(int) index]
// 每次循环按位右移 5 位
lHexLong = lHexLong >>5
}
// 把字符串存入对应索引的输出数组
resUrl[i] = outChars
}
return resUrl
}
/**
* MD5加密(32位大写)
* @param src
* @return
*/
public static String md5ByHex(String src) {
try {
MessageDigest md = MessageDigest.getInstance("MD5")
byte[] b = src.getBytes()
md.reset()
md.update(b)
byte[] hash = md.digest()
String hs = ""
String stmp = ""
for (int i = 0i <hash.lengthi++) {
stmp = Integer.toHexString(hash[i] &0xFF)
if (stmp.length() == 1)
hs = hs + "0" + stmp
else {
hs = hs + stmp
}
}
return hs.toUpperCase()
} catch (Exception e) {
return ""
}
}
}
运行结果
长链接:http://www.51bi.com/bbs/_t_278433840/
[0]:fa6bUr
[1]:ryEfeq
[2]:zAnuAn
[3]:auIJne
短链接:zAnuAn
所谓长连接,就是不管客户端有没有数据要发上来,先连接上再说,连接一直保持,数据都从这个连接发送短连接,就是要发数据的时候才连接,发完数据就将连接断掉,下次要发数据再重新连接