2010-03-17 22 views
4

在客户端应用程序中,我打电话给new Socket(serverIP,serverPort)。因此,客户端应用程序向服务器应用程序发送请求以打开套接字。它是否开始一个新的线程?我的意思是以下哪一项是正确的?套接字是否打开另一个线程?它会返回什么吗?

  1. 客户端应用程序发送请求并立即开始执行以下命令(不等待答案)。

  2. 客户端发送请求并等待答案。一旦获得答案,客户端应用程序将继续执行以下命令。

第二种情况对我来说似乎更现实合乎逻辑。但是,我不明白如果服务器没有打开套接字会发生什么情况,并且没有说它不会“打开”第二个(如果服务器不存在或网络中断)。在这种情况下会发生什么?服务器会永远等待吗?

一般来说,客户端会很高兴知道它对套接字的请求是什么结果。例如,我可以想象下列情况:

  1. 套接字由服务器打开。

  2. 服务器拒绝打开套接字。所以,服务器存在,它从客户端获得请求,但它说“不”。

  3. 服务器没有响应。

我知道new Socket(serverIP,serverPort)不会“回归”这样的信息。但它会抛出异常。其中之一是“UnkownHostException”。当它被抛出?当服务器没有响应一段时间(多长时间)?

新增:

我刚刚发现的UnknownHostException被抛出,指示主机的IP地址无法确定。所以,它与上述情况无关(服务器没有响应,服务器拒绝打开套接字)。

回答

2

新的套接字(主机,端口)没有打开一个新的线程。它启动一个同步tcp连接建立。在某些默认超时后,这可能需要几秒钟或超时。

如果服务器拒绝接受连接,或者客户端无法解析主机的IP或访问服务器(无法访问),则会引发相应的异常。

(如果要控制超时使用默认构造函数和connect(SocketAddress endpoint,int timeout)方法)。

0

嗯,我什么也看不到的文件说,它创建了一个新的线程,所以回答你的问题是NO

0

不知道,如果它打开新的主题,但我知道它会阻止,直到:

  • 成功打开
  • 发生异常
  • 超时

您可以控制ŧ他超时限制,除此之外,你将不得不等待一个答案

0
server is not responding 
maybe means before timeout the server dosen't response the request. 
server refuses to open a socket 
maybe means there hasn't any server process listen listen on this port,the port dosen't open. 
0

new Socket(ip, port) 

不会创建一个新线程的语句。它只是创建一个客户端套接字对象。

为了发送和接收数据,您必须在客户端套接字上使用getInputStream/getOutputStream方法,然后执行读取/写入操作。 outStream.write()通常表现得像一个非阻塞的调用,而inStream.read()是一个阻塞调用。

理想情况下,客户端套接字是在单独的线程中创建的,这样主进程将继续进行,而不会等待套接字相关的IO操作。我建议通过创建一个新线程并将客户端套接字分配给该线程来遵循类似的事情。

0

如果 服务器不打开插座和 不说,它不 “希望”打开第二个发生了什么(它可以 发生,如果服务器不存在或 网络破碎)。在这种情况下会发生什么 ?请问服务器永远等待 ?

什么服务器?如果服务器不存在,则不存在服务器,那么它如何能永远等待?如果网络被破坏,服务器如何知道连接尝试?

这两种情况都不是'服务器[不想]打开套接字'。

在这两种情况下服务器都不会永远等待。客户也不会。有一个默认连接超时大约一分钟,取决于平台,但您可以缩短它,如其他答案中所述。

一般来说这将是很好的 客户知道什么是 其套接字请求的结果。

它的确如此。代码继续或抛出IOException。哪个IOException表示出了什么问题。

相关问题