我正在开发一个应用程序,我在其中编写和读取套接字。但是,它只执行了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
,但结果相同。
答案 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();