Problema com conexao Http

18 respostas
tiagops

Pessoal,

to apanhando faz 1 semana pelo menos :cry:

Tô tentando enviar dados do celular pra um servidor meu via http Post. o código que estou utilizando é o seguinte
Thread t = new Thread( ) {
                     public void run( ) {
                        try {
                           c = (HttpConnection)Connector.open("http://e-log.no-ip.info:88/j2me.asp", Connector.WRITE);
                           //c = (HttpConnection)Connector.open("http://e-log.no-ip.info:8080/servlets-examples/servlet/RqExample/?XXX=BBB", Connector.WRITE);
                           c.setRequestMethod(HttpConnection.POST);
                           c.setRequestProperty("Content-type","application/x-www-form-urlencoded");
                           OutputStream os = null;
                           
                           os = c.openOutputStream();
                           os.write("teste=aaaaa&teste2=bbbb\r\n".getBytes());
                           os.close();
                           //                      Communicate with client here . . .
                        } catch (IOException ex) {
                           //                      Handle error
                        } finally {
                           
                     }
                     }
                  };
                  t.start( );
o código ASP :evil: que estou utilizando no servidor é o seguinte
<%

vString = ""
vString = "Data/Hora=" & Now & "<br>"
vString = vString & "IP=" & Trim(Request.ServerVariables("REMOTE_ADDR")) & "<br>"
for each Texto in Request.form

vString = vString & "RF(" & Texto & ") = " & Request.form(Texto) & "<br>"

next

response.write "<br><br><br>"

for each Texto in Request.QueryString

vString = vString & "RQ(" & Texto & ") = " & Request.querystring(texto) & "<br>"

next

vSQL = "Insert into j2me (texto) values ('" & vString & "') "

                    Set db = Server.Createobject("adodb.connection")
                    db.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & _
                              Server.MapPath("\dados\site.mdb"))

db.execute vSQL


%>

O estranho aqui é que sempre que faco a chamada pelo celular o ASP salva no banco a data e hora, quer dizer que o celular esta enviando alguma coisa e o servidor esta recebendo. Mas os dados mesmo ele nao salva :(

Tambem tentei fazer um servlet, mas nao tive sucesso! Alguem teria algum exemplo do que tenho que fazer no lado do servidor? O que posso estar fazendo de errado?

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RqExample extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        System.out.println("GET");
        PrintWriter out = response.getWriter();
        out.println("GET Request<br>");

        Enumeration e = request.getParameterNames();
        while (e.hasMoreElements()) {
            String name = (String)e.nextElement();
            String value = request.getParameter(name);
            out.println(name + " = " + value + "<br>");
            System.out.println(name + " = " + value);
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse res)
    throws IOException, ServletException
    {
        System.out.println("POST");
        Enumeration e = request.getParameterNames();
	PrintWriter out = res.getWriter ();
        while (e.hasMoreElements()) {
            String name = (String)e.nextElement();
            String value = request.getParameter(name);
            out.println(name + " = " + value + "<br>");
            System.out.println(name + " = " + value);
        }
    }
}

Obrigado!

18 Respostas

E

Bem Tiago

Eu uso este tipo de conexão HttpConnection em outra ocasião, não via celular, mas acredito que seja a mesma coisa.
Bem vamos as explicações.

O que vamos fazer é uma conexão via Stream para enviar os dados ao servidor.
No servlet eu recebo os dados através do stream aberto.

Para enviar o objeto

Thread t = new Thread( ) 
{
	public void run( ) 
	{
		try 
		{
			c = (HttpConnection)Connector.open("http://e-log.no-ip.info:88/j2me.asp", Connector.WRITE);
			//c = (HttpConnection)Connector.open("http://e-log.no-ip.info:8080/servlets-examples/servlet/RqExample/?XXX=BBB", Connector.WRITE);
			c.setRequestMethod(HttpConnection.POST);
			OutputStream is = c.getOutputStream();
			BufferedWriter b = new BufferedWriter(new OutputStreamWriter(is));
			b.write("teste1");
			b.write("teste2");
			b.write("teste3");
			b.flush();
			b.close();
			is.close();
		}
		catch (IOException ex) {
			// IOException
		}
		finally {
			// Finally
		}
	}
};
t.start( );

Para receber o objeto

public void doPost(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException
{
	System.out.println("POST");
	response.setContentType("html/text");

	try
	{
		// Para receber o objeto
		InputStream is = response.getInputStream(); 
		BufferedReader bufr = new BufferedReader(new InputStreamReader(is)); 
		String linha = null;
		int nLinha = 1;
		while((linha = bufr.readLine()) != null )
		{
			System.out.println(nLinha + "º Linha: " + linha);
		}
	}
	catch (Exception ex)
	{
		ex.printStackTrace();
	}
}

Espero ter ajudado.

raffaele

vc já tentou imprimir no asp o comando SQL que está sendo executado?

tiagops

Edgar,

O J2ME não tem getOutputStream(); nem BufferedWriter :frowning:

Mas to testando o exemplo do servlet que voce passou!

tiagops

Então raffaele, a linha

Está funcionando pois sempre que aciono o item de menu no celular pra chamar o http, ele insere o seguinte conteúdo no banco


Data/Hora=5/9/2005 10:52:02 AM
IP=200.148.111.160

E quando chamamos esta tela ASP via IE, dá certo e ele insere corretamente.

Tem algo em mente?

tiagops

Pelo emulador da Nokia no Ecplise agora deu certo!
Mas pelo celular não :frowning:

E

Bem Tiago

Não tenho conhecimento em J2ME ( :oops: ), o que eu conhecia era como conversar usando HTTPConnection e Servlet.

Caso tenha mais alguma coisa que possa ajudar… manda uma msg ai…

Abraços e boa sorte.

:thumbup: :thumbup: :thumbup:

J

Estou com problemas tambem fazendo envio de dados via POST, segue o código:

this.con = (HttpConnection) Connector.open(url.toString());
			
			this.con.setRequestMethod(HttpConnection.POST);
//			this.con.setRequestProperty( "User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0" );
//			this.con.setRequestProperty("Content-Language", "en-US" );
//			this.con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//			this.con.setRequestProperty("Connection","close");


			this.os = this.con.openOutputStream();
			byte postmsg[] = this.postData.toString().getBytes();
			this.os.write(postmsg);
			this.os.flush();
			this.os.close();

Com esse código a página ASP sempre me retorna erro 501 (HTTP_NOT_IMPLEMENTED), caso eu comente a linha this.os.flush() ele retorna HTTP_OK mas sem nenhum dado…

Com get a comunicação funciona sem problemas.

meus dados são curtos, apenas login e senha, entao acho que não deve ser problema de transfer-encoding… Será que alguem pode me ajudar?

Valeu!

Anderson_Schmidt

Olá,

Não sei se irá ajudar, mas enfim, ai vai um código que fiz a pouco tempo, apenas pra testar o HttpConnection com método post.
Só testei no emulador, no celular, pra falar a verdade não sei como fazer, se vc puder me dizer como fez, lhe serei grato.

the client side,

package midlets;

import <a href="http://java.io">java.io</a>.<em>;

import <a href="http://javax.microedition.io">javax.microedition.io</a>.</em>;

import javax.microedition.lcdui.<em>;

import javax.microedition.midlet.</em>;

public class HitMidlet extends MIDlet implements CommandListener {

Display mDisplay;
Form mMainForm;    
TextField forename;
TextField surname;  
StringItem mMessage;
Command mConnGetCommand;

public HitMidlet() {
  
    //Cria componentes
    mDisplay = Display.getDisplay(this);
    mConnGetCommand = new Command("Post", Command.SCREEN, 1);
    forename = new TextField("Nome:", "", 10, TextField.ANY);
    surname = new TextField("Sobrenome:", "", 10, TextField.ANY);
    mMessage = new StringItem("Resposta", "");
    mMainForm = new Form("Huhu, Bingo =D");

    //Adiciona ao form
    mMainForm.append(forename);
    mMainForm.append(surname);
    mMainForm.append(mMessage);
    mMainForm.addCommand(mConnGetCommand);
    
    //Adiciona Listener ao form
    mDisplay.setCurrent(mMainForm);
    mMainForm.setCommandListener(this);

}

public void startApp() {
    
    mDisplay = Display.getDisplay(this);    
    mDisplay.setCurrent(mMainForm);
}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable s) {
  
    if (c == mConnGetCommand) {        
        Thread t =  new Thread() {
            public void run() {
                connectPost();
            }
        };
        t.start();
    }
}

public void connectPost() {

    String url = "http://localhost:8084/Server/hitServlet" + "?" + "forename=" + forename.getString() + "&" + "surname="+surname.getString();
    
    try{
        
        // Cria conexão
        HttpConnection conn = (HttpConnection) Connector.open(url);            
        
        // Seta Propriedades
        conn.setRequestMethod(HttpConnection.POST);
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.1");
        conn.setRequestProperty("Content-Language", "en-US");
        conn.setRequestProperty("Accept", "application/octet-stream");
        
        //Buco tamanho dos parametros para setar tamanho de Conteúdo
        String params = "forename=" + forename + "surname=" + surname;
        conn.setRequestProperty("Content-Length", Integer.toString(params.length()));
       
        // Abro saída de Dados
        DataOutputStream dos = conn.openDataOutputStream();
        dos.writeChars(params);
        dos.flush();
        dos.close();

        //Verifico resposta do servidor
        int rc = conn.getResponseCode();
        if (rc == HttpConnection.HTTP_OK)  {
            DataInputStream dis = conn.openDataInputStream();
            
            //Escrevo dados
            String fullName = dis.readUTF();
            mMessage = new StringItem("Success: " + rc, fullName);
            dis.close();
        }
        else{
            mMessage = new StringItem("Erro: "+ rc, "  Msg: "+ conn.getResponseMessage());
        }
    }
    catch (IOException ioe) {
        System.out.println(ioe.toString());
    }
    mMainForm.append(mMessage);
    mDisplay.setCurrent(mMainForm);        
}

}

and, the server-side,

/*

  • hiServlet.java
  • Created on 24 de Abril de 2005, 11:05
    */

package servlets;

import javax.servlet.http.<em>;

import javax.servlet.</em>;

import <a href="http://java.io">java.io</a>.*;

public class hitServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String forename = request.getParameter("forename");
    String surname = request.getParameter("surname");
    
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);
    
    dos.writeUTF(forename + " " + surname);        
    byte[] data = baos.toByteArray();
    
    response.setStatus(response.SC_OK);
    response.setContentLength(data.length);
    response.setContentType("application/octet-stream");
    
    OutputStream os = response.getOutputStream();
    os.write(data);
    os.close();
}

}

Espero não ter lhe confundido ainda mais.
T+

Schmidt

J

Na verdade escrevi bobagem...

Com esse código:

this.con.setRequestMethod(HttpConnection.POST);
			this.con.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");
			this.con.setRequestProperty("Content-Language", "en-US");
			this.con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			this.con.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.1"); 
			this.con.setRequestProperty("Accept", "application/octet-stream"); 
			
			
			
			this.os = this.con.openDataOutputStream();
			byte postmsg[] = this.postData.toString().getBytes();
			for (int i = 0; i < postmsg.length; i++)
			{
				this.os.write(postmsg[i]);
			}
			//this.os.flush();
			this.os.close();

Ele funciona no emulador, mas no celular me retorna código 100 (HTTP_CONTINUE) no getResponseCode...

Não estou conseguindo fazer ele retornar 200 (HTTP_OK) de jeito nenhum no celular... E já cansei de procurar no Google problemas parecidos com o meu e nada... alguém ja passou por isso?

Obrigado!

tiagops

Se voce descobrir o que pode estar acontecendo me avise! :wink:

To procurando descobrir tambem.

No emulador da Nokia funciona tudo bem, mas quando passo pro celular (o meu é um Nokia 6100) ele nao funciona. Pede pra conectar, mas nao faz o post dos dados.

J

Pode deixar :slight_smile:

Continuo quebrando a cabeça, cada lugar fala uma coisa, e os exemplos que tem por ai são bem parecidos

Como disse não achei nenhuma referência a esse erro de receber código 100 no retorno…

No fórum da Sun me disseram duas coisas:

  • Usar só minúsculas nos request properties.
  • E a seguinte mensagem altamente animadora: “I experienced many problems with POST method. Finally it was random set of properties, that made it work. You must keep trying…”
tiagops

hehehehe
Valeu!

J

Acho que finalmente consegui!

O que acontece é que, quando você recebe um código de resposta 100, pode ser que o pacote de resposta em si esteja inteiro dentro da parte de dados do pacote, no meu caso, já no celular, olha o que eu recebi dentro da parte de dados do meu pacote (que você pega dando um readBuffer no InputStream):

HTTP/1.1 200 OK


Connection: close


Date: Mon, 16 May 2005 20:54:01 GMT


Server: Microsoft-IIS/6.0


MicrosoftOfficeWebServer: 5.0_Pub


X-Powered-By: ASP.NET


X-AspNet-Version: 1.1.4322


Set-Cookie: ASP.NET_SessionId=05lbke45pvwuwx551a4bkrep; path=/


Cache-Control: private


Content-Type: text/html; charset=utf-8


Content-Length: 34





<os dados de verdade vem aqui  :) >

Bizarro... Espero que ajude! E pensar que perdi alguns dias com isso :roll:

tiagops

Jay_Santos,

qual o modelo do seu celular?

Tô comecando a achar que o meu problema esta no meu celular. Nokia 6100 :cry:

J

tiagops:
Jay_Santos,

qual o modelo do seu celular?

Tô comecando a achar que o meu problema esta no meu celular. Nokia 6100 :cry:

O meu é um Motorola V600

Agora ta funcionando redondinho, se voce usar MSN e/ou icq, manda uma msg. privada pra mim, quem sabe “on-line” eu possa te dar alguma ajuda :slight_smile:

Falou!

tiagops

Legal!

Agora deu certo aqui tambem!

Só que só recebo o HTTP_OK
Quando mina pagina JSP dá um response e um OutPutStream eu nao recebo :(

O codigo do server que dá a resposta é esse :
response.setStatus(HttpServletResponse.SC_OK);
       response.setContentLength(data.length);
       response.setContentType("application/octet-stream");
       OutputStream os = response.getOutputStream();
       os.write(data);
       os.close();
O meu J2Me esta assim :
int rc = conn.getResponseCode();
                   if (rc == HttpConnection.HTTP_OK) {
                      result += "HTTP_OK\n"; 
                      DataInputStream dis = new DataInputStream(conn.openInputStream());
                       while (dis.available() > 0) {
                           result += "-" + dis.readInt() + "-" + dis.readUTF() + "-" + dis.readInt() + "-\n";
                           tasks.addElement(result);
                       }
                       dis.close();

Obrigado

alex_sandro_formigar

.

N

Boa tarde pessoal, estou desenvolvendo um projeto que tem que importar/exportar dados para um banco de dados no servidor externo. Criei uma action do struts2, conectei via j2me, fiz um post no aplicativo celular. A conexão foi estabelecida corretamente. Ao transmitir os dados via DataOutputStream, dá seguinte forma:

out.writeUTF(String.valueOf(paciente.getId()));
    out.writeUTF(paciente.getNome());
    out.writeUTF(paciente.getCpf());
    out.writeUTF(paciente.getTelefone());
    [b]out.writeUTF(paciente.getEndereco());[/b]

     out.writeUTF(paciente.getCep());
     out.writeUTF(paciente.getBairro());
     out.writeUTF(paciente.getCidade());

A transmissão para na linha em negrito acima, vai para o aplicativo celular e ocorreu o seguinte erro na linha em negrito abaixo:

java.io.EOFException

paciente.setCodigo(Integer.parseInt(dados.readUTF()));
                   paciente.setNome(dados.readUTF()); 
                   paciente.setCpf(dados.readUTF());
                   paciente.setTelefone(dados.readUTF());
                   [b]paciente.setStrEndereco(dados.readUTF());[/b]

Alguém poderia me ajudar a resolver esse problema?

Criado 9 de maio de 2005
Ultima resposta 6 de ago. de 2008
Respostas 18
Participantes 7