|
|
1
29
据我所知,我经常使用socket,主要使用选择器,虽然不是网络OSI专家
在您给出的代码中,关闭套接字将关闭输入流和输出流,而不可能读取可能可用的数据,因此将其丢失。爪哇
如果你需要等待另一边关闭它的插座,你需要等待它的鳍。为了达到这个目的,你
不得不
发现
如下Java代码片段所示:
当然是两边
不得不
使用相同的关闭方式,否则发送部分可能始终发送足够的数据以保持
正如@WarrenDew在他的评论中指出的,丢弃程序(应用程序层)中的数据会导致应用程序层出现不正常的断开连接:尽管所有数据都是在TCP层(
|
|
|
2
18
我认为这更多的是一个套接字编程问题。Java只是遵循了socket编程的传统。
握手完成后,TCP不会对两个端点(客户端和服务器)进行任何区分。术语“客户机”和“服务器”主要是为了方便。因此,“服务器”可以发送数据,“客户机”可以同时向对方发送一些其他数据。 “接近”一词也具有误导性。只有FIN声明,意思是“我不会再给你寄东西了”,但这并不意味着航班上没有包裹,也不意味着另一个没有什么可说的。如果您将snail mail作为数据链路层实现,或者如果您的数据包经过不同的路由,则可能是接收器接收的数据包顺序错误。TCP知道如何为您解决这个问题。 另外,作为一个程序,您可能没有时间继续检查缓冲区中的内容。所以,在你方便的时候,你可以检查一下缓冲器里有什么。总之,当前的socket实现还不错。如果真的有isPeerClosed(),那就是每次要调用read时必须进行的额外调用。 |
|
|
3
11
底层sockets API没有这样的通知。
|
|
|
4
8
由于到目前为止没有一个答案能完全回答这个问题,我正在总结我目前对这个问题的理解。
当TCP连接建立并且一个对等调用时
爪哇的
没有什么方法像
|
|
|
5
7
可以使用java.net.socket.sendUrgentData(int)方法检测(TCP)套接字连接的远程端是否已关闭,并在远程端关闭时捕获它抛出的IOException。这已经在Java Java和Java-C之间进行了测试。 这避免了使用某种ping机制设计通信协议的问题。通过禁用套接字上的OOBInline(setOOBInline(false)),接收到的任何OOB数据都会被自动丢弃,但OOB数据仍然可以发送。如果远程端关闭,则尝试重置连接,但失败,并导致引发某些IOException。 如果您在协议中实际使用OOB数据,那么您的里程可能会有所不同。 |
|
|
6
4
当Java IO堆栈在突然的拆卸中被破坏时,它肯定会发送FIN。你无法检测到这一点是毫无意义的,大多数客户机只有在关闭连接时才会发送FIN。
|
|
|
7
4
这是一个有趣的话题。我刚刚翻阅了java代码以进行检查。根据我的发现,有两个不同的问题:第一个是TCP RFC本身,它允许远程关闭的套接字以半双工方式传输数据,因此远程关闭的套接字仍然是半开的。根据RFC,RST不关闭连接,您需要发送一个显式的ABORT命令;因此Java允许通过半封闭的socket发送数据 (有两种方法可以读取两个端点的关闭状态。) 另一个问题是实现说这个行为是可选的。当Java努力实现可移植性时,它们实现了最好的公共特性。我想,维护(操作系统,半双工实现)的映射可能是个问题。 |
|
|
8
3
C中的正确答案:
|
|
9
2
这是一个蹩脚的解决办法。使用SSL;)并且SSL在拆卸时执行关闭握手,因此您将收到关闭套接字的通知(大多数实现似乎执行propert handshake-teardown,即)。 |
|
|
10
2
这种行为(不是Java特有的)的原因是您没有从TCP堆栈中获得任何状态信息。毕竟,socket只是另一个文件句柄,如果不尝试(
有关详细信息,请参见 Unix socket FAQ . |
|
|
11
0
只有写操作需要交换数据包,这样才能确定连接的丢失。一个常见的解决方法是使用KEEP ALIVE选项。 |
|
|
12
-3
|
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |