Problema com conexao Http

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 [code]

<%

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

%>
[/code]

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 :frowning:

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?

[code]
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);
    }
}

}[/code]

Obrigado!

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.

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

Edgar,

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

Mas to testando o exemplo do servlet que voce passou!

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

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

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

Tem algo em mente?

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

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:

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!

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 java.io.;
import javax.microedition.io.
;
import javax.microedition.lcdui.;
import javax.microedition.midlet.
;

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.;
import javax.servlet.
;
import java.io.*;

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

Na verdade escrevi bobagem…

Com esse código:

[code] 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();[/code]

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!

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.

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…”

hehehehe
Valeu!

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):

[code]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 :slight_smile: >[/code]

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

Jay_Santos,

qual o modelo do seu celular?

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

[quote=tiagops]Jay_Santos,

qual o modelo do seu celular?

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

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!

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 :frowning:

O codigo do server que dá a resposta é esse :

[code]response.setStatus(HttpServletResponse.SC_OK);
response.setContentLength(data.length);
response.setContentType(“application/octet-stream”);
OutputStream os = response.getOutputStream();
os.write(data);
os.close();

[/code]

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

.

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?