各位,小弟在尝试使用socket与网络内其他计算机通断测试时,速度奇慢,不知何故,望各位帮助.
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;import QzjxxDao;
import Qzjxx;public class MonitorClient {

Socket socket;
BufferedReader in;
PrintWriter out;
long connTime;
Date currTime = new Date();

private ArrayList aList = new ArrayList(); 
public ArrayList aListOut = new ArrayList(); 
private Qzjxx qzjxx = new Qzjxx();
private QzjxxDao qzjxxDao = new QzjxxDao();
public MonitorClient() {
  try{
    aList = qzjxxDao.getQzjxxAll();
    for(int i = 0; i < aList.size(); i++){
      qzjxx = (Qzjxx)aList.get(i);        //获取服务器信息(IP,端口等)
               try{
                 connTime = System.currentTimeMillis();
        socket = new Socket(qzjxx.getIp(), Integer.parseInt(qzjxx.getPort().trim()));
        connTime = System.currentTimeMillis() - connTime;
        socket.close();
        qzjxx.setZtbz("正常");                            //连接状态
        qzjxx.setConnTime(String.valueOf(connTime));      //连接时长
        qzjxx.setConnImg("connOk.gif'>");                //连接状态图片     
                }catch(IOException e){
                 if (e.getCause() == null){
                   qzjxx.setZtbz("失败");
                   qzjxx.setConnTime("Time Out");
       qzjxx.setConnImg("connClose.gif'>");
         }
                }
                
                qzjxx.setCurrTime(DoFormatDate(currTime,true));    //当前连接时间
       aListOut.add(qzjxx);
     }
  }catch (Exception e){
  e.getStackTrace();
  }
}

/**
 * Description : 格式化显示日期型数据
 * @param Date dt_in :日期型数据
 * boolean bShowTimePart_in : 是否显示时间部分
 * @return String 格式化后的日期格式
 */ public String DoFormatDate(java.util.Date dt_in, boolean bShowTimePart_in) {
    if (bShowTimePart_in)
        return (new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(dt_in);
    else
        return (new SimpleDateFormat("yyyy-MM-dd")).format(dt_in);
} /**
 * @return 返回 aListOut。
 */
public ArrayList getAListOut() {
return aListOut;
} /**
 * @param listOut 要设置的 aListOut。
 */
public void setAListOut(ArrayList listOut) {
aListOut = listOut;
}
}

解决方案 »

  1.   

    Socket在建立的时候是非常浪费资源的,连接时间也比较长,根本就不适合用来判断远程机器是否能连接。
    建议你使用ping命令,通过ping可以知道远程机器是否可以ping通。
      

  2.   

    sandyen(杉叶) 朋友,您好。因为我们客户需要通过WEB来监控对各个服务器的状态,所以我们只有通过程序来模拟PING命令,由于没有找到合适的监控办法,所以只有想到通过socket的连接失败与否来判断是否通与不通,如果您有更好的解决办法,不防告诉,在下感激不尽。
      

  3.   

    还有个问题是,我们的各个服务器端口就只开启了我们需要的端口,其他端口都是屏蔽的。如果使用ping命令,也无法获知服务器的状态。