fix(接口测试): 修复tcp mock请求内容超过1024个字节失败问题

https://www.tapd.cn/55049933/bugtrace/bugs/view?bug_id=1155049933001030652&from=wxnotification&corpid=ww918354e3468dc0cc&agentid=1000014&jump_count=1
Signed-off-by: fit2-zhao <yong.zhao@fit2cloud.com>
This commit is contained in:
fit2-zhao 2023-09-18 18:27:45 +08:00 committed by fit2-zhao
parent 0483653abe
commit 0fd091c878
4 changed files with 55 additions and 89 deletions

View File

@ -3,10 +3,8 @@ package io.metersphere.api.tcp;
import io.metersphere.api.tcp.server.TCPServer;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.utils.LogUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author song.tianyang
@ -14,15 +12,14 @@ import java.util.Map;
*/
public class TCPPool {
private static HashMap<Integer, TCPServer> serverSockedMap = new HashMap<>();
private static final HashMap<Integer, TCPServer> serverSockedMap = new HashMap<>();
private TCPPool() {
}
public static String createTcp(int port) {
String returnString = StringUtils.EMPTY;
public static void createTcp(int port) {
if (port > 0) {
TCPServer tcpServer = null;
TCPServer tcpServer;
if (serverSockedMap.containsKey(port)) {
tcpServer = serverSockedMap.get(port);
} else {
@ -34,15 +31,12 @@ public class TCPPool {
Thread t = new Thread(tcpServer);
t.start();
}
returnString = "OK";
} catch (Exception e) {
returnString = e.getMessage();
LogUtil.error(e);
MSException.throwException(e.getMessage());
}
}
return returnString;
}
public static boolean isTcpOpen(int port) {
@ -53,40 +47,14 @@ public class TCPPool {
return false;
}
public static String getTcpStatus() {
if (serverSockedMap.isEmpty()) {
return "null";
} else {
StringBuffer stringBuffer = new StringBuffer();
for (Map.Entry<Integer, TCPServer> entry : serverSockedMap.entrySet()) {
int port = entry.getKey();
TCPServer tcpServer = entry.getValue();
if (tcpServer == null) {
stringBuffer.append("Port is " + port + ";");
stringBuffer.append("Server is null;");
} else {
stringBuffer.append("Port is " + port + ";");
stringBuffer.append("Server is open: " + tcpServer.isSocketOpen() + ";");
}
}
return stringBuffer.toString();
}
}
public static String closeTcp(int portNum) {
public static void closeTcp(int portNum) {
TCPServer server = serverSockedMap.get(portNum);
if (server == null) {
return "Tcp Is not create!";
} else {
String returnMsg = null;
if (server != null) {
try {
server.closeSocket();
returnMsg = "OK";
} catch (Exception e) {
returnMsg = e.getMessage();
LogUtil.error(e);
}
return returnMsg;
throw new RuntimeException(e);
}
}
}
}

View File

@ -10,10 +10,10 @@ import java.net.Socket;
* @Date 2021/8/11 10:35 上午
*/
public class TCPServer implements Runnable {
private int port;
private final int port;
private ServerSocket serverSocket;
private TCPService servicer;
private TCPService server;
public TCPServer(int port) {
this.port = port;
@ -22,30 +22,23 @@ public class TCPServer implements Runnable {
public void openSocket() throws Exception {
this.serverSocket = new ServerSocket(this.port);
while (true) {
do {
if (!this.serverSocket.isClosed()) {
Socket socket = this.serverSocket.accept();
servicer = new TCPService(socket, port);
servicer.run();
}
if (this.serverSocket.isClosed()) {
break;
}
server = new TCPService(socket, port);
server.run();
}
} while (!this.serverSocket.isClosed());
}
public boolean isSocketOpen() {
if (this.serverSocket != null && !this.serverSocket.isClosed()) {
return true;
} else {
return false;
}
return this.serverSocket != null && !this.serverSocket.isClosed();
}
public void closeSocket() throws Exception {
if (this.serverSocket != null && !this.serverSocket.isClosed()) {
if (servicer != null) {
servicer.close();
if (server != null) {
server.close();
}
this.serverSocket.close();
}

View File

@ -9,30 +9,51 @@ import io.metersphere.commons.utils.LogUtil;
import io.metersphere.commons.utils.mock.MockApiUtils;
import io.metersphere.service.MockConfigService;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.protocol.tcp.sampler.ReadException;
import org.json.JSONObject;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class TCPService {
private Socket s;
private InputStream is;
private OutputStream os;
private int port;
private final Socket socket;
private final int port;
public TCPService(Socket s, int port) {
this.s = s;
public TCPService(Socket socket, int port) {
this.socket = socket;
this.port = port;
}
public void run() {
byte[] b = new byte[1024];
public String read(InputStream is) throws ReadException {
try (ByteArrayOutputStream w = new ByteArrayOutputStream()) {
final int size = 1024;
byte[] buffer = new byte[size];
while (true) {
try {
is = s.getInputStream();
os = s.getOutputStream();
int len = is.read(b);
String message = new String(b, 0, len);
int x = is.read(buffer);
if (x < size) {
w.write(buffer, 0, x);
break;
}
w.write(buffer, 0, x);
} catch (IOException e) {
break;
}
}
return w.toString(StandardCharsets.UTF_8);
} catch (UnsupportedEncodingException e) {
throw new ReadException("Error decoding bytes from server with " + StandardCharsets.UTF_8 + ", bytes read: ",
e, "<Read bytes with bad encoding>");
} catch (IOException e) {
throw new ReadException("Error reading from server, bytes read: ", e, StringUtils.EMPTY);
}
}
public void run() throws IOException {
try (InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream()) {
String message = this.read(is);
TCPMockReturnDTO returnDTO = this.getReturnMsg(message);
if (StringUtils.isNotEmpty(returnDTO.getEncode())) {
@ -106,25 +127,9 @@ public class TCPService {
return returnDTO;
}
public void close() {
//关闭资源
try {
is.close();
} catch (Exception e) {
LogUtil.error(e);
} finally {
try {
os.close();
} catch (Exception e) {
LogUtil.error(e);
} finally {
try {
s.close();
} catch (Exception e) {
LogUtil.error(e);
public void close() throws IOException {
if (socket != null) {
socket.close();
}
}
}
}
}

View File

@ -1084,7 +1084,7 @@ public class MockConfigService {
builder.parse(new InputSource(new ByteArrayInputStream(message.getBytes(StandardCharsets.UTF_8))));
isXml = true;
} catch (Exception e) {
e.printStackTrace();
LogUtil.error(e);
}
return isXml;
}