请原谅我的C#.NET新手状态。如果这是显而易见的,我错过了从文档,到相关的页面或样本代码的链接,将不胜感激。

我的工作,将接受来自Java应用程序TCP套接字连接的应用程序。 (是的,需要安装Java的部分。这是一个Sun SPOT的设备和Java是唯一的选择。)的Java应用程序会定期将新数据写入到插座上,我的应用程序的工作是采取字节[],转换它为一个字符串,处理该数据(更新UI等),和可能的正向上运行的类似C#的.NET应用程序的另一台计算机中的数据。

下面就是我这样做的远:现在的应用旋转起来就启动一个线程打开一个套接字。在Java应用程序能够成功连接到使得工作插座。我一直在寻找在的NetworkStream的beginRead方法和dataAvailablelengthCanRead性质,但我不能完全肯定,当我读了一个数据包,通常约为512字节,但可以改变如何确定。

如果在Java应用程序将数据写入流或有数据积压(Java的应用程序将相当迅速地传递数据。)我怎么能确保我每次读只有一个数据包?如果Java应用程序终止无效数据时写入,将帮助?难道还不够吗?

最后,插座只会收到一个连接,但我需要保持打开状态,直到有错误或连接终止。什么是处理这方面的最优雅的方式?我不认为关闭并重新打开与每个数据包都会因为速射(近实时),这是Sun SPOT的基站上运行的Java应用程序的方面的工作。眼下,当基站结束,我的应用程序死了一个响亮而痛苦的死亡。 :)

感谢您的阅读和可以提供任何帮助。

有帮助吗?

解决方案 3

我们已经解决了这个问题的方法是为具有定点字符和固定宽度字段的组合。前两个字节是用于整个数据包的长度头部。然后,我读了包成一个byte []缓冲区,然后靠我们自己包的结构就知道,比如,前两个字节分别被解释为个别字段,然后串字段被终止\ n字符(如果的0x0A你在家里得分)。然后,长的数据字段由连续8个字节,等等。这似乎是相当不错的了我们阅读处理,但它显然是一个情况的解决方案,其中一个拥有超过插座的两端,而不是控制,其中一个是只能够控制的一端。希望这可以帮助别人了。

其他提示

“如果Java应用程序写入数据流或有数据积压(Java的应用程序将相当迅速地传递数据。)我怎么能确保我在同一时间只读取一个数据包? “

要小心,不要假设你有过在包什么样的数据结束了任何控制。如果你尝试发送一个字节的数据{ 'H', 'e', 'l', 'l', 'o' }也不能保证所有的这些数据都将在一个数据包被发送。虽然这是极不可能的,仍然可以每个数据包只能包含单个字节,所以你会得到5个不同事件的所有五个字节。问题的关键是,不靠这种方式的数据包。取而代之的是,自己最终的消息终结者,只是折腾所有传入的数据转换成某种形式的字节的缓冲区,并在检测到另一个函数来,如果有任何存在的这些终端器。如果是这样读了该终止。所以说,比如你从包含下列数据的两倍您的Java应用程序调用相应的发送方法:

{ 'H', 'e', 'l', 'l', 'o', '\0' }
{ 'W', 'o', 'r', 'l', 'd', '\0' }

如何申请应准备接收数据应该是这样的:

Server receives { 'H', 'e', 'l' }
Data stored in byte buffer { 'H', 'e', 'l' }
Check byte buffer for message terminator '\0'. None found. Buffer unchanged, no message processed.
Server receives { 'l', 'o', '\0', 'W' }
Data stored in byte buffer { 'H', 'e', 'l', 'l', 'o', '\0', 'W' }
Check byte buffer for message terminator '\0'. 1 found, extracted message { 'H', 'e', 'l', 'l', 'o' } and buffer updated { 'W' }

因此,而不是确切的答案,你原来的问题,我认为它应该给你在正确的方向推。

您可能会遇到的一件事是,目前根本没有这不可能是数据,而不是消息终止的任何字符。例如,许多文件包含数据\ 0,所以这些会破坏你的消息检测。如何这通常是处理通过为协议创建的报头规范,并检测是否你希望的标题(在这种情况下,寻找\ 0将表示一个消息的结束),或者如果你在等待一定量的数据(这可以通过接收到的最后头中指定)。如果这没有任何意义,你认为你可能需要使用这种技术让我知道,我会加入到这个答案。

当你正在阅读流你需要一些定点/结束符或数据的已知大小,以确定何时停止读取和处理信息数据。空字符或换行符是常见的。另一种技术是使用一个固定大小标头指定所述主体的所述长度。

直到关闭它或另一方终止,在此情况下,同时从插座,您shuold处理读,你会得到一个错误的插座将继续开放。的NetworkStream抛出当插座已经从远程端读取期间被关闭或写入操作一个IOException。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top