套接字上的文件结束是什么意思?

5

在Flex Builder 3中使用Action Script 3。

当处理SOCKET_DATA事件时,有时候会出现“Error #2030:遇到文件结尾”的错误,这似乎是随机发生的。在调用socket.readInt()时会出现此错误。由于我没有在读取文件,所以对这个错误的含义感到困惑。我对sockets的使用还不够熟悉。谢谢。

2个回答

10
“文件结束”错误通常意味着套接字的另一端关闭了它们的连接,如果我没记错的话。之所以是“文件结束”是因为在程序的非常低层次上,磁盘上的文件和套接字都用一个数字表示——文件描述符——操作系统将其转换为表示文件、套接字、管道或其他对象的对象。通常情况下,您可以通过检查是否刚刚读取了EOF来避免这种类型的错误。如果确实读取了EOF,并且您尝试再次从套接字/文件读取,则会收到EOF错误。更新:根据ActionScript 9.0文档,如果另一端关闭了套接字,则确实会收到关闭事件。

谢谢,如果另一端关闭了连接,我是否会收到SOCKET_CLOSE事件或类似的事件? - AaronLS

3
当读取一个已关闭的套接字时,您会收到以下错误:错误 #2002:在无效的套接字上尝试操作。 文件流中通常会发生文件末尾错误,如果您读取的字节数超过了可用的字节数。这适用于文件、套接字等。在 Flash 中,当从SocketByteArray读取数据时甚至可能出现此类情况。
TCP/IP 是基于包的,但是模拟流式传输,因此您只能从已经通过 TCP 包发送给您的流中读取数据。检查 Socket::bytesAvailable 以查找当前有多少字节可用。请始终记住,在一次操作中写入套接字的数据可能会分成多个包到达,并且很可能导致 Flash Player 触发 socketData 事件。

只是对于其他遇到这个问题的人的跟进。我认为问题出在我只检查了bytesAvailable是否大于0,这是我从别人的代码中看到的,但是接下来又使用了readInt,而readInt需要4个字节。所以如果只有1到3个字节的数据,readInt理论上会以某种方式失败。 - AaronLS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接