做个笔记,在接收16进制数据的时候乱码了,原因是没有转byte[]发送。
既然是长连接就免不了心跳检测,这里使用了一种比较简单的做法:服务端对当前线程计时,如果超过某个时长没有收到任何数据就关闭该线程对应的Socket。代码复制粘贴即可运行。
发送时:将16进制的String转byte[]
接收时:将读取到的byte[]转为16进制的String
运行结果
客户端
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient
{
public static void main(String[] args)
{
try
{
Socket socket = new Socket("localhost", 8888);
//得到一个输出流,用于向服务器发送数据
OutputStream outputStream = socket.getOutputStream();
System.out.println("请输入16进制数据:");
Scanner sc = new Scanner(System.in);
while (true)
{
String data = sc.nextLine();
if ("exit".equals(data))
{
return;
}
byte[] byteArray = HexStrToByteArray(data);
outputStream.write(byteArray);
//刷新缓冲
outputStream.flush();
//得到一个输入流,用于接收服务器响应的数据
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1]; // 一次读取一个byte
String info = "";
while (true)
{
if (inputStream.available() > 0)
{
inputStream.read(bytes);
String hexStr = ByteArrayToHexStr(bytes);
info += HexStrToStr(hexStr);
//已经读完
if (inputStream.available() == 0)
{
System.out.println("收到来自服务端的信息:" + info);
break;
}
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 16进制Str转byte[]
*
* @param hexStr
* @return
*/