记录一个平时常用的工具类,用于socket短链接客户端。该工具类只保留最基本的socket短链接通讯功能,报文头为6位字符串,用于记录报文体长度(长度不含头),报文体为字符串。实际使用时,可以按实际要求进行修改。
package com.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class TcpClient {
private static Logger logger = LoggerFactory.getLogger(TcpClient.class);
/**
* 服务端
*/
private String ip;
/**
* 服务端端口
*/
private int port;
/**
* 报文编码
*/
private String charset;
/**
* tcp客户端
* @param ip ip地址
* @param port 端口
* @param charset 字符集
*/
public TcpClient(String ip, int port, String charset) {
this.ip = ip;
this.port = port;
this.charset = charset;
}
/**
* 发送并接收消息
* @param message 消息内容
* @return
*/
public String sendAndRecive(String message) {
try(Socket client = new Socket(this.ip,this.port)){
client.setSoTimeout(60000);
message = messagePre(message);
logger.info("[send to server message]"+message);
OutputStream out = client.getOutputStream();
out.write(message.getBytes(this.charset));
out.flush();
InputStream in = client.getInputStream();
byte[] headBytes = new byte[6];
in.read(headBytes);
int bodyLen = Integer.valueOf(new String(headBytes).trim());
byte[] bodyBytes = new byte[bodyLen];
int allread = 0;
while(true) {
int readsize = in.read(bodyBytes,allread,bodyLen-allread);
allread += readsize;
if(allread >= bodyLen) {
break;
}
}
String body = new String(bodyBytes,this.charset);
logger.info("[recive message from tulip]"+body);
return body;
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 消息预处理 添加报文头 报文头6个字符,不足用0补充
* @return
* @throws UnsupportedEncodingException
*/
private String messagePre(String message) throws UnsupportedEncodingException {
String result = String.format("%06d", message.getBytes(this.charset).length) + message;
return result;
}
}