【问题标题】:Does Socket open another thread? Does it return something?Socket是否打开另一个线程?它会返回一些东西吗?
【发布时间】:2010-03-17 09:34:23
【问题描述】:

在客户端应用程序中,我调用new Socket(serverIP,serverPort)。结果,客户端应用程序向服务器应用程序发送请求以打开套接字。它会启动一个新线程吗?我的意思是以下哪项是正确的?

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

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

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

一般来说,客户端最好知道它请求套接字的结果是什么。例如我可以想象以下几种情况:

  1. 套接字已被服务器打开。

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

  3. 服务器没有响应。

我知道new Socket(serverIP,serverPort) 不会“返回”此类信息。但它抛出异常。其中之一是“UnkownHostException”。什么时候扔?当服务器有一段时间没有响应(多长时间)?

添加:

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

【问题讨论】:

    标签: java networking sockets client


    【解决方案1】:

    new Socket(host,port) 不打开新线程。它开始一个同步的 tcp 连接建立。这可能需要几秒钟或在一些默认超时后超时。

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

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

    【讨论】:

      【解决方案2】:

      好吧,我在文档中没有看到它创建了一个新线程,所以你的问题的答案是否定的

      【讨论】:

        【解决方案3】:

        不确定它是否会打开新线程,但我知道它会阻塞直到:

        • 成功打开
        • 出现异常
        • 超时

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

        【讨论】:

          【解决方案4】:
          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.
          

          【讨论】:

            【解决方案5】:

            声明

            new Socket(ip, port)
            

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

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

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

            【讨论】:

              【解决方案6】:

              如果 服务器没有打开套接字并且 它并没有说它没有 “想要”打开第二个(它可以 如果服务器不存在或发生 网络坏了)。会发生什么 在这种情况下?服务器会等待吗 永远?

              什么服务器?如果服务器不存在就没有服务器那么它怎么能永远等待呢?如果网络中断,服务器如何知道连接尝试?

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

              在这两种情况下,服务器都不会永远等待。客户也不会。默认连接超时时间约为一分钟,具体取决于平台,但您可以按照其他答案中的说明缩短它。

              总的来说,这对 客户知道结果是什么 它对套接字的请求。

              确实如此。要么代码继续,要么抛出 IOException。它是哪个 IOException 表明出了什么问题。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-22
                • 1970-01-01
                • 1970-01-01
                • 2010-10-01
                • 1970-01-01
                • 2018-01-28
                相关资源
                最近更新 更多