在客户端应用程序中,我调用new Socket(serverIP,serverPort)
。因此,客户端应用程序向服务器应用程序发送请求以打开套接字。它会启动一个新线程吗?我的意思是下列哪一项是正确的?
客户端应用程序发送请求并立即开始执行以下命令(不等待答案)。
客户端发送请求并等待答案。获得答案后,客户端应用程序将继续执行以下命令。
对我来说,第二种情况似乎更为现实和合乎逻辑。但是,我不明白如果服务器没有打开套接字会发生什么,并且它没有说它“不想”打开第二个(如果服务器不存在或网络坏了就会发生)。在这种情况下会发生什么?服务器会永远等待吗?
一般来说,客户端知道它对套接字的请求结果是多么好。例如,我可以想象以下情况:
服务器打开套接字。
服务器拒绝打开套接字。因此,服务器存在,它从客户端获得请求,但它说“不”。
服务器没有回复。
我知道new Socket(serverIP,serverPort)
不会“返回”此类信息。但它抛出异常。其中一个是“UnkownHostException”。什么时候抛出?当服务器暂时没有响应时(多长时间)?
增加:
我刚刚发现抛出了UnknownHostException,表明无法确定主机的IP地址。因此,它与上述情况无关(服务器没有响应,服务器拒绝打开套接字)。
答案 0 :(得分:2)
new Socket(host,port)不会打开新线程。它启动一个同步tcp连接建立。在某些默认超时后,这可能需要几秒钟或超时。
如果服务器拒绝接受连接,或者客户端无法解析主机的ip或访问服务器(无法访问),则会抛出相应的异常。
(如果要控制超时,请使用默认构造函数和connect(SocketAddress endpoint,int timeout)方法。)
答案 1 :(得分:0)
嗯,我在文档中没有看到它创建一个新线程,所以你的问题的答案是否
答案 2 :(得分:0)
不确定它是否会打开新线程,但我知道它会阻塞,直到:
您可以控制超时限制,除此之外,您必须等待回答
答案 3 :(得分: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.
答案 4 :(得分:0)
声明
new Socket(ip, port)
不会创建新主题。它只是创建一个客户端套接字对象。
要发送和接收数据,必须在客户端套接字上使用getInputStream / getOutputStream方法,然后执行读/写操作。 outStream.write()通常表现得像一个非阻塞调用,而inStream.read()则是一个阻塞调用。
理想情况下,客户端套接字是在单独的线程中创建的,这样主进程就可以继续进行而无需等待与套接字相关的IO操作。我建议通过创建一个新线程并将客户端套接字分配给该线程来遵循类似的事情。
答案 5 :(得分:0)
如果发生了什么 服务器无法打开套接字 它并没有说它没有 “希望”打开第二个(它可以 如果服务器不存在或发生 网络坏了)。会发生什么 在这种情况下?服务器会等待吗 永远?
什么服务器?如果服务器不存在则没有服务器,那么它怎么能永远等待?如果网络被破坏,服务器将如何知道连接尝试?
这两种情况都不是'服务器[不想]打开套接字。
在任何情况下,服务器都不会永远等待。客户也不会。默认连接超时约为一分钟,与平台有关,但您可以按照其他答案中的描述缩短它。
一般情况下,它会很好 客户知道结果是什么 它对插座的要求。
确实如此。代码继续或抛出IOException。它表示出现了什么IOException。