java Socket 短连接和长连接的区别

Python022

java Socket 短连接和长连接的区别,第1张

所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。

短连接是指通信双方有数据交互时,就建立一个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

所谓长连接,就是不管客户端有没有数据要发上来,先连接上再说,连接一直保持,数据都从这个连接发送

短连接,就是要发数据的时候才连接,发完数据就将连接断掉,下次要发数据再重新连接