我有在获得从TCP套接字来的所有数据一些麻烦。
在我的服务器,我是从这样一个socket读取数据:
int len;
byte[] buffer = new byte[2000];
try {
this.in = new DataInputStream(this.socket.getInputStream());
this.out = new DataOutputStream(this.socket.getOutputStream());
running = true;
while (running) {
len = in.read(buffer);
if (len < 0) {
running = false;
} else {
parsePacket(buffer, len);
}
}
} catch (IOException ex) {
System.out.println("Catch IOException: " + ex);
ex.printStackTrace();
} finally {
try {
System.out.println("Closing");
in.close();
out.close();
socket.close();
} catch (IOException ex) {
System.out.println("Finally IOException: " + ex);
}
}
数据包的格式是这样的:
[HEADER] [DATA] [TERMINATOR]
- 头 - >字符序列标识消息(有关数据包的长度没有信息)的开始;
- 数据- >共分细分,如:[尺寸段用。 1] [数据波段。 1] [大小波段。 2] [数据波段。 2] [尺寸波段。 3] [数据波段。 3] ... [大小波段。 N] [数据波段。 N]
- 终止子 - > [0×00]
数据被接收到的非常快(有时为200ms或更小),所以有时read(buffer)
填充buffer
中包含的消息:
- [头1] [DATA1] [TERM1]或,
- [头1] [DATA1] [TERM1] [HEADER2] [DATA2] [TERM2] ............. [HEADER N] [数据N] [TERM N],或
- [头1] [DATA1] [TERM1] [HEADER2] [DATA2] [TERM2] ............. [HEADER N] [DAT(最后一个消息不完全的)
所述parsePacket()
方法能够解析的消息上面的格式和它是否有下一个多个消息,它们也将被(递归地)进行解析。 但是,如果它是不完整也不会解析最后一条消息(我不希望这样,但我没有找到一个合适的解决方案到现在为止)。
消息内部发出的数据被存储在一个MySQL数据库(使用JDBC驱动程序)。 消息的每个解析可能涉及多个数据库查询。 由于我只使用一个线程接收,分析和存储数据,代码的执行是没有那么快,因为它应该...的数据应该被接收并快速存储成为可能。
我想讨论的一些要点:
- 有什么能得到不失去他们中的一些所有消息的最佳方法?
- 我怎么能提高数据被接收和存储的方式吗? (该数据应该存储尽可能快的!)