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.
los titulos de los temas deben ser descriptivos de la tematica discutida
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
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:
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!
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.
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);
}
}
}
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!
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: ;-)