Тайм-аут при отправке на сокет сервера - PullRequest
0 голосов
/ 03 мая 2011
 public void sendToServer(String fileToSend, String ip, int sendPort)
{
    int port = sendPort;
    String url = ip;
    File file = new File(fileToSend);
    String fileName = file.getName();

    Socket sock;
    try {
        sock = new Socket(url,port);

        //Send the file name
        OutputStream socketStream = sock.getOutputStream();
        ObjectOutput objectOutput = new ObjectOutputStream(socketStream);
        objectOutput.writeObject(fileName);

        //Send File
        byte [] mybytearray  = new byte [(int)file.length()];
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        bis.read(mybytearray,0,mybytearray.length);
        OutputStream os = sock.getOutputStream();
        os.write(mybytearray,0,mybytearray.length);
        fileSentOkay();
        os.flush();
        sock.close();

    } catch (UnknownHostException e) {
        hostNotFound();
    } catch (IOException e) {
        hostNotFound();
    }
}

Когда я пытаюсь отправить что-то на сервер, когда сервер не прослушивает соединение, телефон пытается отправить файл.В результате моя Android-программа в конце концов принудительно закроется.

Как я могу установить время, чтобы это произошло?Должен ли я использовать что-то вроде setSoTimeout() в сокете, который отправляет данные?

1 Ответ

0 голосов
/ 03 мая 2011

Первое: на всякий случай: не делайте сетевых вещей в потоке пользовательского интерфейса. Плохие вещи произойдут (тм)

Второе: setSoTimeout() должно дать вам тайм-аут в случае, если сервер принимает соединение, но не отвечает (или если вообще нет ответа от сети). В случае отклонения соединения сокет должен выйти из строя значительно быстрее.

Edit: Если конструктор класса Socket уже занимает столько времени, попробуйте использовать метод connect(SocketAddress, int). Используйте InetSocketAddress в качестве параметра:

Socket s = new Socket(); 
s.connect(..., 1000);
...