2012-05-15 3 views
1

как повторно использовать соединение сокета TCP (возможно setReuseAddress (true), но не работает для меня) для загрузки нескольких файлов с сервера (Apache, HTTPD) в соединение без отключения (и снова подключаться).Android, как повторно использовать Socket?

Мой код ниже ..

public class ClientThread implements Runnable { 
     public void run() { 
      try { 

       Log.d("ClientActivity", "C: Connecting..."); 
       SocketAddress sockaddr = new InetSocketAddress(serverIpAddress, SERVERPORT); 
       socket = new Socket(); 

       socket.setReuseAddress(true); 
       socket.setKeepAlive(true); 
       socket.setSoLinger(true, 3000); 
       socket.connect(sockaddr); 

       if (socket.isConnected()) { 
        DataInputStream input = new DataInputStream(socket.getInputStream()); 
        PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 

        output.println("GET /way/images/profile/1231 HTTP/1.1"); 
        output.println("Host: 192.168.1.2"); 
        output.println("User-Agent: Java"); 
        output.println("Accept: */*"); 
        output.println("Connection: Keep-Alive"); 
        output.println(""); 
        output.flush(); 

        String line; 
        File file = new File("/sdcard/aaa.png"); 
        if (!file.exists()) { 
         file.createNewFile(); 
        } 
        FileOutputStream fileOut = new FileOutputStream(file); 
        System.out.println("Getting first file"); 
        while ((line = input.readLine()) != null) { 
         System.out.println(line); 
         fileOut.write(line.getBytes()); 
        } 
        System.out.println("First file finished"); 
        fileOut.flush(); 
        fileOut.close(); 

        output.println("GET /way/images/profile/1231 HTTP/1.1"); 
        output.println("Host: 192.168.1.2"); 
        output.println("User-Agent: Java"); 
        output.println("Accept: */*"); 
        output.println("Connection: Keep-Alive"); 
        output.println(""); 
        output.flush(); 

        file = new File("/sdcard/aaa1.png"); 
        if (!file.exists()) { 
         file.createNewFile(); 
        } 
        fileOut = new FileOutputStream(file); 
        System.out.println("Getting second file"); 
        while ((line = input.readLine()) != null) { 
         System.out.println(line); 
         fileOut.write(line.getBytes()); 
        } 
        System.out.println("Second file finished"); 

        fileOut.flush(); 
        fileOut.close(); 
        input.close(); 
        output.close(); 

       } 
       Log.d("ClientActivity", "C: Closed."); 
      } catch (Exception e) { 
       Log.e("ClientActivity", "C: Error", e); 
       connected = false; 
      } 

      finally { 
       try { 
        Log.d("ClientActivity", "Socket: Closed."); 
        socket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

Благодаря ...

+1

(1) Определите, что «не работает для меня». (2) Вы имеете в виду, как повторно использовать * порт? * (3) Тестирование 'Socket.isConnected()' следующей строки после 'Socket.connect()' бессмысленно. Если бы он не был связан, он бы выбросил исключение, чтобы вы никогда туда не попали. – EJP

+0

(1) Я использую setReuseAddress (true), но не могу использовать повторное использование сокета после первого ответа с сервера (сервер не отправляет второй ответ). (2) Я хочу подключиться к повторному подключению (возможно, к порту), (3) Спасибо, я уже проверил код .. – Andranik

+0

Спасибо, теперь, пожалуйста, определите 'can not reuse socket'. Что вы подразумеваете под «повторным использованием»; каково ваше ожидание; и что происходит вместо этого? – EJP

ответ

0

setReuseAddress (истина) до связывания сокета позволяет сокет быть связанным, даже если предыдущее соединение находится в состоянии ожидания.

documentation of setReuseAddress

Я не вижу смысла в использовании непосредственно гнездо для HTTP связи. Я использую HttpURLConnection. В большинстве случаев работает без проблем.

Смежные вопросы