Consulta sobre Socket.....

Iniciado por bash, 29 Julio 2016, 20:00 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

Saludos En general!


Disculpen la molestia , tengo una duda sobre la conexion con Socket en java, es posible que alguien me muestre un ejemplo en java donde pueda hacer una conexion , a una url o IP  con un puerto especifico  solo enviar un buffer y luego esperar un respuesta immediata, si parece una pregunta de alguien que esta haciendo una tarea pero no la verdad programo en c / c++ tengo un poquito de experiencia en socket. en c es sencillo
si eres un cliente creas el socket, haces un connect, si conecta haces un send y receive y luego un close , pero en java es bien diferente y me gustaria ver como podria aprender eso
si es posible , gracias de antemano.


postdata : Disculpe por no poner titulo.
gracias por responder mis dudas

engel lex

los titulos de los temas deben ser descriptivos de la tematica discutida
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Once

Hola, en java es exactamente igual, solo cambian las librerias:

1) Creas el socket indicando al constructor la dirección y el puerto al cual te quieres conectar

Código (java) [Seleccionar]
Sockect cliente = new Socket("direccion", puerto)

2) Envias datos con el método send() y recibes con read(), readLine()

3) Cierras la conexión con el método close()

No sé como sea en C/C++ pero en Java debes tener cuidado, porque los sockets se leen como si fueran archivos, así que para leer y escribir debes usar los objetos (InputStream y OutputStream respectivamente) que te devuelve los métodos getInputStream() y getOutputStream(). Objetos que luego puedes envolver en otros objetos un poco más convenientes para lo que quieres leer (depronto acá es donde, al principio, las cosas se ponen un poco confusas). Solo recuerda que en Java los sockets se leen como si fueran archivos de texto y hay mucha documentación al respecto.

Acá un ejemplo que tengo de cuando comencé con los Sockets en Java:

Código (java) [Seleccionar]

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

/**
*
* @author once
*/
public class Enviar {
    private String host;
    private int port;
    private String peticion;
    private Socket web;
    private BufferedReader entrada;
    private BufferedWriter salida;
   
    public Enviar(String host, int port, String peticion) {
        this.host = host;
        this.port = port;
        this.peticion = peticion;
       
        System.err.printf("Host: %s", host);
    }
   
    public String enviar() {
        String data;
        String buffer = "";
        int b = 0;
        try {
            web = new Socket(host, port);
            entrada = new BufferedReader(new InputStreamReader(web.getInputStream()));
            salida = new BufferedWriter(new OutputStreamWriter(web.getOutputStream()));

            System.out.println("enviando: " + peticion);

            // Envia la informacion
            salida.write(peticion);
            salida.flush();

            int bytes = 0;

            // Lee la informacion
            while((bytes = entrada.read()) > 0) {
                buffer += (char)bytes;
            }

            System.err.println("Terminado de leer la petición longitud: " + buffer.length());
           
            // Cerramos los flujos
            entrada.close();
            salida.close();
            web.close();
           
            System.out.println("Recibido del servidor: " + buffer);
            return buffer;


        } catch (UnknownHostException e) {
            System.err.println("No se encontro el host");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("Error entrada salida");
            e.printStackTrace();
        }
        return "";
    }
}


Saludos!

bash

Muchas Gracias !!

Bien ya que me puede conectar desde escritorio
estoy probando ahra desde android  quisiera sus comment para ver si puedo arreglarle
el codigo no es mio para nada he hecho copias de varias url para obterner algo que funcione me gustaria saber su opinion.

Código (java) [Seleccionar]



import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.AsyncTask;
import java.io.BufferedWriter;
import java.io.BufferedReader;
/**
* Created by aperez on 8/2/2016.
    usando codigo de este sitio : http://android-er.blogspot.com/2014/02/android-  sercerclient-example-client.html
  Ayuda de : Once ,  del el hacker.net url del tema :http://foro.elhacker.net/java/consulta_sobre_socket-t455790.0.html


*/
public class NetworkWrapper
{
    String url;
    int port;
    String SendBuffer;


    OutputStream outputStream;
    InputStream inputStream;
    Socket socket;
    String Result;

    NetworkWrapper(String sendbuffer, String Url, int port)
    {
        this.url = Url;
        this.port = port;
        this.SendBuffer = sendbuffer;
    }



   public String SendAndRecevied()
   {
       String ret ="";
       MyClientTask myClientTask = new MyClientTask(  this.SendBuffer,  this.url,  this.port);
       myClientTask.execute();
       ret.concat(Result);
       return ret;
   }





    public class MyClientTask extends AsyncTask<Void, Void, Void> {

        String dstAddress;
        int dstPort;
       
        String sed;


        public MyClientTask(String sn, String addr, int port){
            dstAddress = addr;
            sed = sn;
            dstPort = port;

        }

        @Override
        protected Void doInBackground(Void... arg0) {

            try {
                socket = new Socket(dstAddress, dstPort);
                byte[] buffer = new byte[1024];
                outputStream = socket.getOutputStream();
                inputStream = socket.getInputStream();

                BufferedReader entrada = new BufferedReader(new InputStreamReader(inputStream));
                BufferedWriter  salida = new BufferedWriter(new OutputStreamWriter(outputStream));


                salida.write(sed);
                salida.flush();
                int b;
                while((b = entrada.read())!= -1)
                {
                    Result +=(char) b;
                }

                entrada.close();
                salida.close();
                socket.close();
                socket = null;
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Result = "UnknownHostException: " + e.toString();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Result = "IOException: " + e.toString();
            }finally{
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }

    }
}
gracias por responder mis dudas

Once

No tengo experiencia en Android, yo creo que sería mejor crear un nuevo hilo para que más gente lo vea y te conteste alguien con más experiencia

Saludos!

bash

correcto debo usar un hilo nuevo, para eso estoy usando AsyncTask que es una clase abtracta disenada para operaciones cortas que requieran usar paralelismo o multiprocesamiento (eso creo) en Desktop el codigo que me diste va excelente ahora vere como lo pongo a correr en android luego lo subire aqui o pondre en git seguro que otra persona lo necesitara algun dia. :D  :laugh: :laugh: ;-)
gracias por responder mis dudas