2013-10-01 3 views
2

Я пытаюсь сделать приложение для Android, которое отправит некоторые пакеты данных на встроенное устройство. Поскольку мое встроенное устройство не поддерживает протокол UDP-дейтаграммы, я бы хотел его смоделировать с использованием TCP-синхронизации.Threaded TCP connection - Android

При этом строка ответа с устройства не требуется, поэтому я хотел бы отключить TCP-сокет, как только данные будут отправлены из моего приложения.

Я был бы признателен, если бы кто-нибудь мог описать, как сделать поток, который будет выполнять соединение, и закрыть сокет, если в течение определенного периода времени данные не будут получены.

Мой текущий код прост:

try { 
     Socket s = new Socket("localhost",12345); 

     //outgoing stream redirect to socket 
     OutputStream out = s.getOutputStream(); 

     PrintWriter output = new PrintWriter(out); 
     output.println("Hello Android!"); 
     BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 

     //read line(s) 
     String st = input.readLine(); 
     . . . 
     //Close connection 
     s.close(); 


} catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 

Спасибо заранее !!!

ответ

3

Сначала позаботьтесь о протоколе, если ваше приложение застряло в String st = input.readLine();, поэтому он не означает, что сервер не отправляет данные, потому что метод readLine() ожидает строку (заканчивается CRLF), и это возможно, что сервер просто отправляет некоторую строку без подачи строки, тогда буферизованный читатель по-прежнему запускает поток (текущий поток), потому что он ожидает CRLF. Далее вы бы еще один класс, который принимает гнездо в качестве параметра, а затем ждет некоторое время, а затем закрыть сокет из-за отсутствия ответа от сервера., Что-то вроде этого

class SocketMgr implements Runnable{ 
final private int timeout=5000; 
private Socket s; 
public SocketMgr(Socket s){this.s=s;new Thread(this).start();} 
public void run(){ 
try{Thread.sleep(timeout);s.close();}catch(Exception ex){} 
} 
} 

и в коде

try { 
     Socket s = new Socket("localhost",12345); 

     //outgoing stream redirect to socket 
     OutputStream out = s.getOutputStream(); 

     PrintWriter output = new PrintWriter(out); 
     output.println("Hello Android!"); 
     output.flush(); 
     BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     ////////////////////////////////// 
     new SocketMgr(s); 
     ////////////////////////////////// 
     //read line(s) 
     String st = input.readLine(); 
     . . . 
     //Close connection 
     s.close(); 


} catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 

также вы бы это выяснили для простого [java threading tutorial] еще раз, это важно знать о протоколе, принадлежащем вашему серверу. Удачи, у вас хорошая программа сокетов :).

+0

Благодарим вас за понимание. Когда я вызываю новые SocketMgr (s); Я получаю следующее сообщение об ошибке: Gradle: не удается найти конструктор символов SocketMgr (java.net.Socket) Я относительно новичок в OOP :( – user2703038

+0

Aw, извините, ошибка типографии, я обновил код, пожалуйста, еще раз проверьте. –

+0

Еще раз спасибо Это, вероятно, вопрос для нового сообщения. Я определил разрешения для Интернета в манифесте, но когда я пытаюсь открыть сокет, приложение сработает. Я понятия не имею, почему код для TCP-соединения прост и понятен. – user2703038