我正在编写客户端服务器应用程序。我想知道结束连接,哪一方应该决定结束它,客户端还是服务器?
然后,如果客户端做了,服务器是否仍然保持打开状态?
假设我们为每个客户端和服务器提供以下代码:
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)
答案 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)
套接字存在于客户端和服务器程序中。关闭任何套接字都会在另一端抛出异常。