随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

Java网络编程从入门到精通(27):关闭服务端连接

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(26):在服务端接收和发送数据

    在客户端和服务端的数据交互完成后,一般需要关闭网络连接。对于服务端来说,需要关闭SocketServerSocket

在关闭Socket后,客户端并不会马上感知自已的Socket已经关闭,也就是说,在服务端的Socket关闭后,客户端的SocketisClosedisConnected方法仍然会分别得到falsetrue。但对已关闭的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类的isClosedisBound方法判断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网络编程从入门到精通(28):获取ServerSocket信息的方法及FTP原理






Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2009-08-04 09:26 银河使者 阅读(3678) 评论(3)  编辑  收藏 所属分类: java 原创网络编程

评论

# re: Java网络编程从入门到精通(27):关闭服务端连接  回复  更多评论   

不错啊
2009-08-04 11:39 | 凡客诚品

# re: Java网络编程从入门到精通(27):关闭服务端连接  回复  更多评论   

好东西啊!
2009-08-04 12:10 | 99读书人

# re: Java网络编程从入门到精通(27):关闭服务端连接  回复  更多评论   

非常不错..

http://www.qixian.net
http://www.nod32id.com
http://www.fanke1.com
http://www.du84.com
2009-08-04 17:20 | 不错

只有注册用户登录后才能发表评论。


网站导航: