2

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

轮询线程.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 次?

更新-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文件中添加这一行,但结果是一样的。

4

1 回答 1

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();
于 2013-03-21T11:12:46.037 回答