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

时间:2010-03-16 17:22:50

标签: java sockets networking

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

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

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

增加:

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

已添加2:

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

3 个答案:

答案 0 :(得分:9)

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

  

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

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

  

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

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

答案 1 :(得分:2)

  

服务器是否可以   “知道”套接字关闭了   客户方?

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

  

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

为处理这些异常情况创建了例外。如果出现黑屏并关闭客户端(或服务器),则一旦尝试与关闭的一方进行交互,其他方将获得异常。

UPD:

  

如果申请单侧的申请怎么办?   插座已关闭(已杀死,   关闭,终止)然后是   再次打开(在相同的IP上   地址和相同的端口)。我们应该吗   在两者之间创建一个新的套接字   应用程序或我们可以使用旧的   socket(在崩溃之前创建)。

创建新套接字。

答案 2 :(得分:2)

Q1->服务器是否可以“知道”客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?

A1 - >如果客户端关闭套接字,则服务器将知道,反之亦然。实际上FIN将从最后发送,这将开始关闭连接。

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

A2->如果创建了套接字,则fd number与ip-addr&端口,所以服务器端的socket有server-ip&客户端的一些端口和套接字有client-ip&一些港口。如果崩溃发生在客户端,则所有fd都被释放,并且无法重复使用。如果我们使用相同的fd,系统会将其视为普通文件fd。