Java网络编程从入门到精通(27):关闭服务端连接
2015-04-20 16:39
302 查看
转自:
http://www.blogjava.net/nokiaguy/archive/2009/06/archive/2009/06/archive/2009/nokiaguy/archive/2009/nokiaguy/archive/2009/07/archive/2009/08/04/289706.html
在客户端和服务端的数据交互完成后,一般需要关闭网络连接。对于服务端来说,需要关闭Socket和ServerSocket。
在关闭Socket后,客户端并不会马上感知自已的Socket已经关闭,也就是说,在服务端的Socket关闭后,客户端的Socket的isClosed和isConnected方法仍然会分别得到false和true。但对已关闭的Socket的输入输出流进行操作会抛出一个SocketException异常。
在关闭服务端的ServerSocket后,ServerSocket对象所绑定的端口被释放。这时客户端将无法连接服务端程序。下面的代码演示了在服务端关闭Socket后,客户端是所何反应的。
package server;
import java.net.*;
class Client
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 1234);
Thread.sleep(1000);
// socket.getOutputStream().write(1);
System.out.println("read() = " + socket.getInputStream().read());
System.out.println("isConnected() = " + socket.isConnected());
System.out.println("isClosed() = " + socket.isClosed());
}
}
public class CloseSocket
{
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket = new ServerSocket(1234);
while (true)
{
Socket socket = serverSocket.accept();
socket.close();
}
}
}
测试
执行下面的命令
java server.CloseSocket
java server.Client
运行结果
read() = -1
isConnected() = true
isClosed() = false
从上面的运行结果可以看出例程Client并未抛出SocketException异常。而在012行的read方法返回了-1。如果将socket.close去掉,客户端的read方法将处于阻塞状态。这是因为Java在发现无法从服务端的Socket得到数据后,就通过read方法返回了-1。如果将011行的注释去掉,Client就会抛出一个SocketException异常。大家可以试试,并socket.close行改成serverSocket.close后,客户端就会抛出连接异常:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
at chapter5.Client.main(CloseSocket.java:12)
显式地调用close方法关闭ServerSocket并不是必须的,在程序退出时将自动关闭ServerSocket。但通过close方法关闭ServerSocket,可以使其他的ServerSocket对象绑定该端口。可以使用ServerSocket类的isClosed和isBound方法判断ServerSocket是否处于活动状态,如下面的代码所示:
ServerSocket serverSocket = new ServerSocket(1234);
if (serverSocket.isBound() == true && serverSocket.isClosed() == false)
System.out.println("serverSocket处于活动状态!");
else
System.out.println("serverSocket处于非活动状态!");
上面代码所示的“非活动状态”可能是serverSocket对象已经关闭,也可能是serverSocket对象是使用ServerSocket类的默认构造方法创建的,而且未调用bind方法绑定端口。在这里要注意的是isBound方法返回true并不意味着serverSocket对象处于活动状态,调用close方法并不会将绑定状态置为false。这一点和Socket类的isConnected方法类似。
http://www.blogjava.net/nokiaguy/archive/2009/06/archive/2009/06/archive/2009/nokiaguy/archive/2009/nokiaguy/archive/2009/07/archive/2009/08/04/289706.html
在客户端和服务端的数据交互完成后,一般需要关闭网络连接。对于服务端来说,需要关闭Socket和ServerSocket。
在关闭Socket后,客户端并不会马上感知自已的Socket已经关闭,也就是说,在服务端的Socket关闭后,客户端的Socket的isClosed和isConnected方法仍然会分别得到false和true。但对已关闭的Socket的输入输出流进行操作会抛出一个SocketException异常。
在关闭服务端的ServerSocket后,ServerSocket对象所绑定的端口被释放。这时客户端将无法连接服务端程序。下面的代码演示了在服务端关闭Socket后,客户端是所何反应的。
package server;
import java.net.*;
class Client
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 1234);
Thread.sleep(1000);
// socket.getOutputStream().write(1);
System.out.println("read() = " + socket.getInputStream().read());
System.out.println("isConnected() = " + socket.isConnected());
System.out.println("isClosed() = " + socket.isClosed());
}
}
public class CloseSocket
{
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket = new ServerSocket(1234);
while (true)
{
Socket socket = serverSocket.accept();
socket.close();
}
}
}
测试
执行下面的命令
java server.CloseSocket
java server.Client
运行结果
read() = -1
isConnected() = true
isClosed() = false
从上面的运行结果可以看出例程Client并未抛出SocketException异常。而在012行的read方法返回了-1。如果将socket.close去掉,客户端的read方法将处于阻塞状态。这是因为Java在发现无法从服务端的Socket得到数据后,就通过read方法返回了-1。如果将011行的注释去掉,Client就会抛出一个SocketException异常。大家可以试试,并socket.close行改成serverSocket.close后,客户端就会抛出连接异常:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
at chapter5.Client.main(CloseSocket.java:12)
显式地调用close方法关闭ServerSocket并不是必须的,在程序退出时将自动关闭ServerSocket。但通过close方法关闭ServerSocket,可以使其他的ServerSocket对象绑定该端口。可以使用ServerSocket类的isClosed和isBound方法判断ServerSocket是否处于活动状态,如下面的代码所示:
ServerSocket serverSocket = new ServerSocket(1234);
if (serverSocket.isBound() == true && serverSocket.isClosed() == false)
System.out.println("serverSocket处于活动状态!");
else
System.out.println("serverSocket处于非活动状态!");
上面代码所示的“非活动状态”可能是serverSocket对象已经关闭,也可能是serverSocket对象是使用ServerSocket类的默认构造方法创建的,而且未调用bind方法绑定端口。在这里要注意的是isBound方法返回true并不意味着serverSocket对象处于活动状态,调用close方法并不会将绑定状态置为false。这一点和Socket类的isConnected方法类似。
相关文章推荐
- Java网络编程从入门到精通(27):关闭服务端连接
- Java网络编程从入门到精通(27):关闭服务端连接
- Java网络编程从入门到精通(27):关闭服务端连接
- 关闭服务端连接
- Netty学习4—NIO服务端报错:远程主机强迫关闭了一个现有的连接
- 客户端会话成功连接至Oracle服务端后,监听的启动和关闭就不会影响已经连接的会话
- 没有任何关闭socket的日志,客户端和服务端进程都在, 网络连接完好, 为什么进行某操作后好好的tcp连接莫名其妙地断了呢?
- 服务器端主动关闭连接, 产生的TIME_WAIT状态为什么会占用服务端大量端口?
- 没有任何关闭socket的日志,客户端和服务端进程都在, 网络连接完好, 为什么进行某操作后好好的tcp连接莫名其妙地断了呢?
- 关闭服务端连接
- 如何在关闭ssh连接的情况下,让程序继续运行?
- 关闭TCP连接的学问
- android7.0+关闭wifi连接CA验证
- WCF 基础连接已经关闭:连接被意外关闭
- 客户端正确地关闭WCF连接
- setsockopt 设置 SO_LINGER 选项 关闭连接
- Ubuntu Linux关闭红外连接[00原创]
- PostgreSQL服务端监听设置及客户端连接方法
- EF Core 2.0中Transaction事务会对DbContext底层创建和关闭数据库连接的行为有所影响
- Socket的使用实例,控制台上的编程。嗨!这里是服务端,您已连接成功!