Настройте время ожидания запроса сокета в CLDC1.1
Можно ли настроить время ожидания запроса сокета в CLDC версии 1.1? Я проверил различные реализации, но все они существуют только для CLDC версии 1.8. Ниже приведена реализация, которую я попробовал. Первая реализация останавливается из-за поведения блокировки метода InputStream#read. Пока вторая реализация не работает, потому что она останавливает соединение
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.SocketConnection;
public class ReadNonblockingMessage extends Thread{
private final int READ_TIMEOUT = 5000;
private Thread thread;
private DataInputStream dis = null;
public ReadNonblockingMessage(String host, int port) throws IOException {
SocketConnection connection = (SocketConnection)Connector.open("socket://"+host+":"+port,Connector.READ);
dis = connection.openDataInputStream();
//first implementation
while(true) {
try {
System.out.println(readFromStream(dis));
}
catch(IOException ex) {
ex.printStackTrace();
break; //exit from infinite loop if we got read timeout
}
}
//second implementation - this works fine for first time. after that connection stop
while(true) {
try {
System.out.println(read(dis));
}
catch(IOException ex) {
ex.printStackTrace();
break; //exit from infinite loop if we got read timeout
}
}
start();
}
public String read(InputStream is) throws IOException {
thread = Thread.currentThread();
return readFromStream(is);
}
public void run() {
try {
sleep(READ_TIMEOUT);
if(thread.isAlive()) {
thread.interrupt();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public final String readFromStream(InputStream inputStream) throws IOException{
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) { //read is blocking
result.write(buffer, 0, length);
}
result.close();
inputStream.close();
return result.toString();
}
}