我可以关闭并重新打开套接字吗?

Rom*_*man 6 java sockets networking

我学习了套接字使用的一个例子.在此示例中,客户端向服务器发送请求以打开套接字然后服务器(侦听特定端口)打开套接字并且一切正常,套接字从双方(客户端和服务器)"打开".

但我仍然不清楚这些东西有多灵活.例如,客户端是否可以关闭打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下).

服务器是否可以"知道"客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?

添加:

对我来说更重要的一件事.如果应用程序(无主服务器或客户端)崩溃,异常终止,被杀,会发生什么?它会关闭应用程序侧面打开的所有套接字吗?

增加2:

如果套接字一侧的应用程序被关闭(终止,关闭,终止)然后再次打开(在相同的IP地址和相同的端口上),该怎么办?我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建).

hao*_*hao 9

套接字可以用于很多事情,这些问题的答案会改变,但我会假设你在谈论TCP.

例如,客户端是否可以关闭打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下).

不,因为TCP将执行再见而您无法再从那里获取连接.您必须再次进行三次握手,这将启动一个全新的连接.

服务器是否可以"知道"客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?

是的.TCP可以发送一个再见包,或者一方可以超时,在这两种情况下完全可以检测到这些情况.


Rom*_*man 2

服务器是否有可能“知道”客户端的套接字已关闭?

当服务器尝试向该客户端发送一些数据时,将抛出相应的异常。

对我来说更重要的一件事。如果应用程序(无论是服务器还是客户端)崩溃、异常终止、终止,会发生什么?它会关闭应用程序一侧打开的所有套接字吗?

创建异常是为了处理这些异常情况。如果发生停电并且客户端(或服务器)被关闭,那么另一方一旦尝试与关闭的一方交互就会收到异常。

更新:

如果套接字一侧的应用程序被关闭(杀死、关闭、终止),然后再次打开(在相同的 IP 地址和相同的端口上),会怎么样?我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建)。

创建新套接字。