客户端连接或服务器?

时间:2012-04-01 10:39:09

标签: java client-server

我正在编写客户端服务器应用程序。我想知道结束连接,哪一方应该决定结束它,客户端还是服务器?

然后,如果客户端做了,服务器是否仍然保持打开状态?

假设我们为每个客户端和服务器提供以下代码:

           socket = new Socket("127.0.0.1",3000);
........

            socket.close();

            serverSocket = new ServerSocket(3000);
            socket = serverSocket.accept();
......

            serverSocket.close();

编辑: 根据matt的回答,我把我的代码放在这里,让我们看看为什么我的代码不起作用:

一般来说,我有一个Jframe程序作为客户端将连接到服务器,当它打开时,我希望连接处于活动状态,因为它将信息发送到服务器,服务器应该响应结果。但如果我不使用从服务器关闭套接字它会出错,如果我使用,一旦计算,它会关闭连接:

服务器

        private static PrintWriter toClient;
        private static BufferedReader fromClient;


  public static void run() throws IOException, SAXNotRecognizedException, SAXNotSupportedException, ParserConfigurationException, SAXException, XPathExpressionException
        {


        System.out.println("Server is waiting for connections...");

        while(true)
        {
                 openStreams();
                  processClient();
                  closeStreams();
 }

    }

的OpenStream:

  public static void openStreams() throws IOException, SAXNotRecognizedException, SAXNotSupportedException, ParserConfigurationException, SAXException, XPathExpressionException
            {
            serverSocket = new ServerSocket(3000);
            socket = serverSocket.accept();
                System.out.println("Connected");

             toClient = new PrintWriter(socket.getOutputStream(),true);

            fromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));


            }

Closestearms:

   public static void closeStreams() throws IOException
            {
            fromClient.close();
            toClient.close();
            socket.close();
            serverSocket.close();
                System.out.println("Disconnected");
        }

如果删除closestream();

,我会收到错误
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
    at java.net.ServerSocket.bind(ServerSocket.java:319)
    at java.net.ServerSocket.<init>(ServerSocket.java:185)
    at java.net.ServerSocket.<init>(ServerSocket.java:97)

3 个答案:

答案 0 :(得分:2)

取决于您的应用程序的逻辑。两者都是有效的,你必须确保你的代码在两种情况下都是正确的,因为如果连接被“不自觉地”破坏(如网络丢弃),它将在双方看来好像另一方已经关闭了连接。 / p>

因此,您的代码必须优雅地处理这两种情况。

你的结束代码是可疑的:你正在关闭监听套接字,这是不寻常的。只有当您不想再有传入连接时(通常是服务器,当您关闭服务器时),您才应该关闭侦听套接字。 只关闭从accept获得的套接字以结束该“对话”,并且不要重新打开服务器侦听套接字。 (在这种情况下,您获得的例外可能是“已使用的地址”。有关如何避免该特定问题的示例,请参阅How to set reuse address option for a datagram socket in java code?。)

答案 1 :(得分:0)

两端都可以关闭连接 - 两者都不是“更正确”。

但是,重要的是要清除代码中的一个(似乎)误解: 关闭ServerSocket并没有关闭代表两个端点之间连接的套接字。

ServerSocket是端口上的侦听套接字。当客户端在该端口上建立与ServerSocket的连接时,ServerSocket.accept()方法返回(正常)Socket。两个端点之间的通信使用与此(正常)套接字关联的输入和输出流。

关闭ServerSocket只是停止侦听众所周知的端口,并且与已建立的套接字无关。

答案 2 :(得分:0)

套接字存在于客户端和服务器程序中。关闭任何套接字都会在另一端抛出异常。