目录
1.理解JavaSocket通信原理
2.定义数据通信数据规则
3.实现Socket通信
3.1创建Socket并主动连接服务器
3.2通过OutpuStream写入数据给服务器
3.3起线程通过InputStream从服务器不断的读取数据流
3.4关闭资源
1.理解JavaSocket通信原理
https://blog.csdn.net/ahou2468/article/details/80353723
2.定义数据通信数据规则
以下是CAN数据的通信结构;
一个 TCP 或 UDP 帧包含若干个 CAN 帧(最多50个, 最少1个CAN帧);一个CAN帧是13个字节;
第一字节主要区分标准帧和扩展帧,远程帧和数据帧;
3.实现Socket通信
3.1创建Socket并主动连接服务器
注意要设置连接Server地址和端口,同时设置连接时间,超时则连接失败
//客户端模式
private Socket socket;
private InputStream inputStream; //输入流,用于从服务器获取数据
private OutputStream outputStream;//输出流,用于写数据给服务器
//创建一个流套接字并将其连接到指定主机上的指定端口号。
// socket = new Socket(ipAddress_l, nWorkPort_l);
socket = new Socket(); //实例化socket
SocketAddress socketAddress = new InetSocketAddress(ipAddress_l, nWorkPort_l); //获取sockaddress对象
socket.connect(socketAddress,15000); //连接socket并设置连接超时为5秒,如果5秒后服务端还没有响应,则弹出异常信息。
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
3.2通过OutpuStream写入数据给服务器
将short(0-255)数据强制转换为byte(-128-127)类型,实际CAN设备C++Server接收byte数据属于无符号类型,实际接收数据是(0-255)
//组装实际数据,将short数据强制转换为byte
short[] msg = new short[13];
//将short数组转为byte数组
byte[] msgbyte = new byte[msg.length];
for(int i=0; i<msg.length;i++){
msgbyte[i] = (byte)msg[i];
}
//写入数据
outputStream.write(msgbyte,0, msgbyte.length);
/**
* 监听接收数据
*/
private class FrmRecvRunnable implements Runnable{
@Override
public void run() {
int nCount = 0;
while (!mPaused){
try{
if(mConnected){
if(!socket.isConnected()){
//通知设备已经断开连接
return;
}
//1.接收数据缓冲区,每一帧数据为13字节
byte[] buffer = new byte[13];
int bytes;
//2.不断循环接收数据
while(true){
//3.读数据,每次读取一帧数据,13字节
bytes = inputStream.read(buffer);//, 0, 13);
if(bytes > 0) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
short[] msg = new short[13];//LeopaardCANCtrl.toShortArray(data);
//4.根据自己需要将字节数据转换为short类型
for(int i=0;i<bytes; i++){
msg[i] = (short) (0x0FF&buffer[i]);
}
//5.根据数据需要将13字节数据转为需要的CAN数据
LeopaardFrmData frmData = new LeopaardFrmData();
LeopaardCANCtrl.canPack(frmData, msg, msg.length);
sendDataToJS(frmData, 0); //0暂未使用
// Thread.sleep(2000);
}
}
}
}catch (Exception exception){
//暂不处理
}
}
}
}
3.4关闭资源
//是否连接资源
public boolean freeResouce(){
//是否资源
try{
if(outputStream != null){
outputStream.close();
outputStream = null;
}
if(inputStream != null){
inputStream.close();
inputStream = null;
}
if(threadPool != null){
threadPool.shutdown();
threadPool = null;
}
if(socket != null){
socket.close();
socket = null;
}
return true;
}catch (Exception exception){
//暂不处理
}
return false;
}