Problemas com HttpURLConnection

5 respostas
xFoxX

Bom, eu estou fazendo um programa que faz upload de arquivos a um server, já consegui fazer o programa enviar os arquivos ao server usando HttpURLConnection mas o problema é que enquanto o upload acontece não há qualquer tipo de “feedback”, digo, preciso que o meu programa monitore o upload, pelo menos, que ele seja capaz de saber quantos bytes ja foram enviados.
Este é o meu codigo até agora:

public void post(UploadToken ut)
{
        HttpURLConnection conn = null;
	
        String data = encodeData(ut);
        
        try{
            byte[] bytedata = data.getBytes("ISO-8859-1");
            
            URL url = new URL(ut.getURL());
            conn = (HttpURLConnection) url.openConnection();
            
            conn.setRequestMethod("POST");
            conn.setRequestProperty( "User-Agent", agent );
            conn.setRequestProperty( "Content-Type", type );
            conn.setRequestProperty( "Content-Length",Integer.toString(bytedata.length,10));
            conn.setDoInput(true);
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();

            for(int i=0;i<bytedata.length;i++)
            {
                os.write(bytedata[i]);
                os.flush(); // não adianta usar flush, nada acontece
            }

            System.out.println("è aqui que os bytes começam a ser enviados de fato");
            InputStream in = conn.getInputStream();
            System.out.println("esta linha não é executada até que todos os bytes sejam enviados");

            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = br.readLine()) != null) 
            {
                parent.response(line);
            }
            os.close();
            br.close();
        }catch(IOException ioe) 
        {
            int code = -1;
            try{code = conn.getResponseCode();}catch(Exception e){System.out.println(e);}
            System.out.println(ioe+ " httpconnection:"+code);
            parent.getInfo().setStatus(UploadInfo.ERROR);
        }
}

Eu sei que parece estranho mas acontece exatamente como esta escrito no codigo, apenas quando conn.getInputStream() é executado é que os bytes são enviados.

5 Respostas

nextuser

naum entedi muito bem sua app dei um alhada muito rápida mas se eu nuam me engano se vc fizer isso com socket vc vai enviando os bytes e vc tem o tamanho total então vc consegue saber a porcentagem enviada!

xFoxX

hm, envia o POST via socket inves de HttpURLConnection ?
vou dar uma pesquisada, você tem algum exexmplo de codigo que faça isso ?

Obrigado.

nextuser
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			System.out.println("@Server Start");
			InputStream in = Server.class.getResourceAsStream("tacndlib_2664.log");
			ServerSocket server = new ServerSocket(440);
			Socket connection = server.accept();

			OutputStream output = connection.getOutputStream();

			// 2k
			byte[] buff = new byte[2048];
			int bytesRead = 0;

			System.out.println(in.available() + " bytes");

			int i = 1;
			int a = in.available();
			int p = 0;
			while ((bytesRead = in.read(buff)) > 0) {
				output.write(buff, 0, bytesRead);
				int ip = 100 * i / (a / 2048);
				if (ip != p) {
					p = ip;
					System.out.println(p + "%");
				}
				i++;
			}
			in.close();
			server.close();
			connection.close();
			output.close();
			System.out.println("@Server End");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			System.out.println("@Client Start");
			Socket connection = new Socket("127.0.0.1", 440);
			InputStream input = connection.getInputStream();
			FileOutputStream wr = new FileOutputStream(new File("z://tacndlib_2664_____.log"));
			byte[] outBuffer = new byte[connection.getReceiveBufferSize()];
			int bytesReceived = 0;

			while ((bytesReceived = input.read(outBuffer)) > 0) {
				wr.write(outBuffer, 0, bytesReceived);
			}
			wr.close();
			input.close();
			connection.close();
			System.out.println("@Client End");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
Adolpho_Alves

ok

xFoxX

consegui fazer o upload por socket, o unico problema foi ter que montar os header do post na mão…
Mas, apesar do upload ser concluido com verificação de md5 e tudo, o server parece reclama ainda porque dentre as valores que ele me retorna parece um “null” :shock: e isso não acontece quando eu uso o otro metodo…eu devo ter feito alguma besteira por ai…

Segue o novo codigo:

public void postSocket(UploadToken ut)
{
        String CRLF = "\r\n";
        String data = encodeData(ut);
        try
        {
            byte[] bytedata = data.getBytes("ISO-8859-1");

            String header = "";
            header += "POST "+ut.getPath()+" HTTP/1.0"+CRLF;
            header += "User-Agent: "+agent+CRLF;
            header += "Content-Length: "+Integer.toString(bytedata.length,10)+CRLF;
            header += "Content-Type: "+type+CRLF;
            header += CRLF;
            
            String total = header + data;
            byte[] totalbytes = total.getBytes("ISO-8859-1");

            Socket socket = new Socket(ut.getServer(), ut.getPort());
            OutputStream out = socket.getOutputStream();
 

            for(int i=0;i<totalbytes.length;i++)
            {
                out.write(totalbytes[i]);
                parent.getInfo().addProgress(1);
            }

            
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) 
            {
                System.out.println(line);
                String r = line.trim();
                if(r.length()>0 && r.charAt(0)=='{')parent.response(r); // o que realmente importa esta entre chaves { }
            }
            out.close();
            br.close();
        }catch(Exception ex) 
        {
            System.out.println(ex+" exception");
        }
}
Criado 16 de dezembro de 2008
Ultima resposta 16 de dez. de 2008
Respostas 5
Participantes 3