这是我的第一个问题,英语不是我的母语。如果我没有清楚地描述,请告诉我。
背景:在IEC104电气通信协议中,当客户端请求一次时,服务器可能会在一个tcp套接字包中以多帧电报进行响应。所有帧都以"68“开头,然后是电报的长度。例如:客户端:6814000000006701000100000000001C79BA0BAE 04 11 //time同步激活。服务器:6814000000006701 07 0000000000001C 79 BA0BAE 04 11 //time同步确认,这是预期的响应。但是,在时间同步确认之前,服务器会回复其他电报。例如,下面是群发电报(来自服务器):680E00000000460104000100000000806820020000001E02030001004A040001E50B810001010045040001060F81000101006828040000002402030001001100000000000000FE9A80000101001300000100DE4100FE9A800001010068BE06000000250C03000100C80000000000008050008100010100C90000000000008050008100010100CA0000000000008050008100010100CB0000000000008050008100010100CC0000000000008050008100010100CD0000000000008050008100010100C8000000000000814E008200010100C9000000000000814E008200010100CA000000000000814E008200010100CB000000000000814E008200010100CC000000000000814E008200010100CD00000000000081500082000101006814080000006701400001000000008E869217BF0C6368FA0A000000251003000100CA0000000000001950009A00010100CB0000000000001950009A00010100CC0000000000001950009A00010100CD0000000000001950009A00010100C80000000000001A4E009B00010100C90000000000001A4E009B00010100CA0000000000001A4E009B00010100CB0000000000001A4E009B00010100CC0000000000001A4E009B00010100CD0000000000001A51009B00010100C80000000000001B4E009C00010100C90000000000001B4E009C00010100CA0000000000001B4E009C00010100CB0000000000001B4E009C00010100CC0000000000001B4E009C00010100CD0000000000001B4E009C0001010068FA0C000000251003000100C80000000000001C4E009D00010100C90000000000001C4E009D00010100CA0000000000001C4E009D00010100CB0000000000001C4F009D00010100CC0000000000001C4F009D00010100CD0000000000001C4F009D00010100C80000000000001D4E009E00010100C90000000000001D4F009E00010100CA0000000000001D4F009E00010100CB0000000000001D4F009E00010100CC0000000000001D4F009E00010100CD0000000000001D4F009E00010100C80000000000001E4E009F00010100C90000000000001E4E009F00010100CA0000000000001E4E009F00010100CB0000000000001E4F009F0001010068FA0E000000251003000100CC0000000000001E4F009F00010100CD0000000000001E4F009F00010100C80000000000001F4E00A000010100C90000000000001F4E00A000010100CA0000000000001F4E00A000010100CB0000000000001F4E00A000010100CC0000000000001F4E00A000010100CD0000000000001F4E00A000010100C8000000000000004E00A100010100C9000000000000004E00A100010100CA000000000000004F00A100010100CB000000000000004F00A100010100CC000000000000004F00A100010100CD000000000000004F00A100010100C8000000000000015000A200010100C9000000000000015000A2000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000啊~对不起这么长时间.
有八份"68",即由8帧电报组成。在这种情况下,我有一个问题,在收集电报从服务器。正如我前面提到的,我不知道电报的多少帧和每个帧的长度,所以我定义了大数组byte2048来包含所有的电报,然后将它拆分成11个字符串(新的String11)。这在大多数情况下是可行的,但很明显,它的设计并不好。
byte[] boTimeSync = HexStrToByte.hexStringToBytes(Setting.TIMESYNC);
out.write(boTimeSync);
out.flush();
VisibleFrame.updateTextArea(Setting.TIMESYNC.toUpperCase()+"\n");
VisibleFrame.updateTextArea(TimeParsing.parsing(Setting.TIMESYNC.toUpperCase())+"\n");
byte[] biTimeSync = new byte[2048];
bin.read(biTimeSync);
str = t104.ByteToStr.byteToStr(biTimeSync);
String[] bi = new String[11];
bi = SplitTele.splitTele(str);那么,既然InputStream.available()不适合网络编程,那么如何获得所有的帧呢?
发布于 2017-04-25 21:49:06
您需要使用DataInputStream
int start;
do
{
start = din.read();
} while (start != -1 && start != 0x68);
if (start == -1)
throw new EOFException();
int length = din.readUnsignedByte();
byte[] message = new byte[length];
din.readFully(message);
return message;除非响应包含某种类型的请求ID,否则不存在“查找响应特定请求的最后一个帧”的解决方案。
https://stackoverflow.com/questions/43610958
复制相似问题