线程在读取socket的响应后几次迭代后休眠

时间:2013-03-21 10:29:33

标签: java multithreading sockets

我正在开发一个应用程序,我在其中编写和读取套接字。但是,它只执行了11次任务,然后就睡了。

PollThread.java

public class PollThread {

    static String result;
    private static Timer myTimer;
    static String ip = "192.168.1.19";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("PollThread");
        myTimer = new Timer();
        myTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                ClientThread cThread = new ClientThread(ip);
                String status = cThread.readStatus();
                System.out.println("Staus :: "+status);
            }
        }, 0, 2000);

    }
}

ClientThread.java

public class ClientThread {

    String byte_to_hex, swapped_result, result,ipAddr;
    public Socket s;
    public InputStream i;
    public OutputStream o;
    int status;

    public ClientThread(String ip) {
        // TODO Auto-generated constructor stub
        this.ipAddr=ip;

    }

    public int readStatus() {
        try {
            s = new Socket(ipAddr, 502);
            i = s.getInputStream();
            o = s.getOutputStream();

            byte[] data1 = new byte[1024], packet1 = { (byte) 0x00,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x06, (byte) 0x01, (byte) 0x01, (byte) 0x00,
                    (byte) 0x00, (byte) 0x00, (byte) 0x19 };

            o.write(packet1);
            i.read(data1, 0, 1024);//Comment this
            byte_to_hex = bytesToHex(data1).substring(18, 26);

            char[] arr = byte_to_hex.toCharArray();
            for (int i = 0; i < arr.length - 1; i += 2) {
                char temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }

            swapped_result = new String(arr);

            result = hexStringToNBitBinary(swapped_result, 32);

            int counter = 0;
            for (int i = 0; i < result.length(); i++) {
                if (result.charAt(i) == '1') {
                    counter++;
                }
            }
            status = counter;

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return status;
    }
}

结果

Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1
Staus :: 1

如果我注释掉i.read(data1, 0, 1024);,那么它可以正常工作,但我需要这一行来获得结果。

这可能是什么问题?为什么它只运行了11次?

UPDATE-1

Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...
Status :: 1
Reading status...

更新2

我也尝试在cThread.start();文件中添加此行PollThread.java,但结果相同。

1 个答案:

答案 0 :(得分:1)

正如其他评论者所提到的,您的Timer实际上是创建多个客户端连接,每两秒钟一次,而不是定期测试的单个连接。您的“服务器模拟器”很可能最大连接数为10或11.尝试将您的客户端连接移到TimerTask之外,因此每次都不会创建它:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("PollThread");
    myTimer = new Timer();
    final ClientThread cThread = new ClientThread(ip);
    myTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            String status = cThread.readStatus();
            System.out.println("Staus :: "+status);
        }
    }, 0, 2000);
}

很抱歉只是注意到你在readStatus方法中创建了一个新的Socket,这实际上是多个连接问题。尝试将这些内容移动到构造函数中,例如:

public ClientThread(String ip) {
    // TODO Auto-generated constructor stub
    this.ipAddr=ip;

    try {
        s = new Socket(ipAddr, 502);
        i = s.getInputStream();
        o = s.getOutputStream();
    // ...
}

public int readStatus() {
    try {
        //s = new Socket(ipAddr, 502);
        //i = s.getInputStream();
        //o = s.getOutputStream();