Мне нужно создать TCP-соединение в AppEngine (на стороне сервера) и поддерживать его на неопределенное время (или не менее ~ 30 минут). Я создал фоновый поток, открыл java.net.Socket
и попытался прочитать строку с завернутым BufferedReader
. Примерно через 3 секунды бездействия, я получаю следующее исключение:GAE Keep Socket Alive
java.net.SocketException: Socket operation timed out: The API call remote_socket.Receive() took too long to respond and was cancelled.
Я включу скелет кода я использую ниже. Любая помощь будет с благодарностью (включая обходные пути или информацию об ограничениях сокетов в GAE). Благодаря!
ThreadFactory tm = ThreadManager.backgroundThreadFactory();
thread = tm.newThread(new Runnable() {
@Override
public void run() {
Socket socket = null;
try {
socket = new Socket("localhost", 8000);
socket.setSoTimeout(0);
socket.setKeepAlive(true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String in = reader.readLine();
// execution never gets past here
//...
} catch (IOException e) {
e.printStackTrace();
} finally {
// ... <close socket>
}
}
});
thread.start();
В случае, если это уместно, вот случай использования: У меня есть сервер TCP, который используется для работы со встроенным апплетом на стороне клиента. Я бы хотел перепроектировать Applet как webapp, но сервер все еще работает нормально, поэтому я не хочу его менять. Я хотел бы написать простой сервлет, который поддерживает соединение TCP и передает сообщения туда и обратно между сервером TCP и клиентом GWT.
Это, вероятно, не будет работать. Каков ваш прецедент? Мы могли бы подумать об альтернативах с другими продуктами Google Cloud – Mario
Я добавил описание - см. Последний абзац выше. – thomas88wp