/**
*
*/
package io.nettythrift;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
/**
* @author HouKx
*
*/
public class DemoClientTEST {
// TSimpleJsonProtocol format
private static final String PING = "[\"ping\",1,2,[]]";
@Test
public void test_tcp_shortMsg_framed() throws Exception {
Socket socket = null;
try {
socket = new Socket("localhost", 8083);
// configSocket(socket);
/**
* 发送TCP请求
*/
OutputStream out = socket.getOutputStream();
byte[] frame;
{
byte[] arrContent = PING.getBytes();
final int msgLen = arrContent.length;
// System.out.printf("*** 客户端 msgLen = %d, time=%d,
// connection = %s\n", msgLen, System.currentTimeMillis(),
// connection);
frame = new byte[4 + msgLen];// 前四个字节代表消息长度
frame[0] = (byte) (msgLen >> 24);
frame[1] = (byte) ((msgLen >> 16) & 0xff);
frame[2] = (byte) ((msgLen >> 8) & 0xff);
frame[3] = (byte) (msgLen & 0xff);
// System.out.printf("** arrayLen = [%d, %d, %d, %d]\n",
// arr4Req[0], arr4Req[1], arr4Req[2], arr4Req[3]);
System.arraycopy(arrContent, 0, frame, 4, msgLen);
}
out.write(frame);
out.flush();
System.out.println("==== 响应 ========");
InputStream in = socket.getInputStream();
int readLen = in.read(frame, 0, 4);
if (readLen == 1) {
readLen = in.read(frame, 1, 4);
}
System.out.println("readLen = " + readLen);
System.out.println(new String(read(in)));
in.close();
} finally {
System.out.println("关闭socket");
if (socket != null) {
socket.close();
}
}
}
@Test
public void test_tcp_shortMsg() throws Exception {
Socket socket = null;
try {
socket = new Socket("localhost", 8083);
// configSocket(socket);
/**
* 发送TCP请求
*/
OutputStream out = socket.getOutputStream();
out.write(PING.getBytes());
out.flush();
System.out.println("==== 响应 ========");
InputStream in = socket.getInputStream();
System.out.println(new String(read(in)));
in.close();
} finally {
System.out.println("关闭socket");
if (socket != null) {
socket.close();
}
}
}
@Test
public void test_tcp_shortMsgAndProxy() throws Exception {
Socket socket = new Socket();
try {
// configSocket(socket);
// socket.connect(new InetSocketAddress("10.50.0.174", 8081), 6000);
socket.connect(new InetSocketAddress("localhost", 8083), 6000);
socket.setReuseAddress(true);
socket.setSoLinger(false, 0);
socket.setTcpNoDelay(true);
socket.setKeepAlive(false);
// socket.setSoTimeout(5000);
/**
* 发送TCP请求
*/
OutputStream out = socket.getOutputStream();
String proxy = "PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n";
// out.write((proxy + getPingBao).getBytes());
out.write((proxy + PING).getBytes());
out.flush();
System.out.println("==== 响应 ========");
System.out.println(new String(read(socket.getInputStream())));
} finally {
System.out.println("关闭socket");
socket.close();
}
}
String proxy = "PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n";
@Test
public void test_MockHttpProxyToNettyServer() throws Exception {
Map<String, String> params = new HashMap<String, String>();
params.put("", PING);
Map<String, String> respMap = HTTPUtil.sendPostRequest("http://localhost:8083", params, "UTF-8", proxy);
HTTPUtil.printResult(respMap);
}
@Test
public void test_MockHttpToNettyServer() throws Exception {
Map<String, String> params = new HashMap<String, String>();
params.put("", PING);
Map<String, String> respMap = HTTPUtil.sendPostRequest("http://localhost:8083", params, "UTF-8");
HTTPUtil.printResult(respMap);
}
private static byte[] read(InputStream in) throws IOException {
// 事实上就像JDK的API所述:Closing a ByteArrayOutputStream has no effect
// 查询ByteArrayOutputStream.close()的源码会发现,它没有做任何事情,所以其close()与否是无所谓的
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
byte[] buffer = new byte[512];
int len = -1;
while ((len = in.read(buffer)) > 0) {
System.out.println("readBuf: len=" + len);
// 将读取到的字节写到ByteArrayOutputStream中
// 所以最终ByteArrayOutputStream的字节数应该等于HTTP响应报文的整体长度,而大于HTTP响应正文的长度
bytesOut.write(buffer, 0, len);
if (len < buffer.length) {
break;
}
}
// 响应的原始字节数组
return bytesOut.toByteArray();
}
}