你的位置:首页 > 软件开发 > Java > Java SE ——TCP协议网络编程(三)

Java SE ——TCP协议网络编程(三)

发布时间:2017-01-17 00:00:26
之前的代码中关闭了 socket 对象的输入流与输出流,但并没有关闭掉socket 对象,会造成服务器资源的浪费,应通过调用 socket 的 close() 方法来关闭当前的socket 对象。 因此,可以通过创建一个 ServerScanThread 线程,使其一直 ...

Java SE ——TCP协议网络编程(三)

之前的代码中关闭了 socket 对象的输入流与输出流,但并没有关闭掉socket 对象,会造成服务器资源的浪费,应通过调用 socket 的 close() 方法来关闭当前的socket 对象。

 

因此,可以通过创建一个  ServerScanThread 线程,使其一直在后台运行,扫描看哪些 socket 对象的 Input Stream 与 OutputStream 均已关闭,当扫描到当前 socket 对象的输入输出流均已关闭,则关闭当前 socket 对象。

扫描线程代码:

public class ServerScanThread extends Thread {  public static List<Socket> socketList = new LinkedList<Socket>(); //实例化一个静态列表,使其存放 Socket,使用LinkedList 便于删除  public ServerScanThread(){    setDaemon(true);//设置为后台线程    start();  }  public void run(){    while(true){      //1.我要去扫描整个集合,如果当前集合是空的,我就去睡觉去喽      while(socketList == null ||socketList.size()<= 0){        System.out.println("这会儿集合里没有socket,我先睡觉10s");//测试代码        try {          Thread.sleep(10000);        } catch (InterruptedException e) {          // TODO Auto-generated catch block          e.printStackTrace();        }              }      //2.如果运行到这里,则说明 socketList 中有元素,则有开始扫描判断其socket 对象是否已经关闭了其输入流和输入流。      for(int i = 0;i<socketList.size();i++){        Socket socket = socketList.get(i);//从socketList 集合中获得一个 socket 对象。        if(socket.isInputShutdown() & socket.isOutputShutdown()){          try {            socket.close();//关闭当前 socket 对象            socketList.remove(i);//从当前列表中移除当前 socket 对象。            System.out.println("有一个 socket 被关闭了");//测试代码            //i--; LinkedList在移除掉一个元素后,其后边的元素下标统统会减一,为保证不会跳过某一个元素,可在此处将 i 自减,也可以不因为会进行再次扫描          } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();          }        }      }      try {

原标题:Java SE ——TCP协议网络编程(三)

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。