Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema al ejecutar código

Hola, estoy empezando a leer un libro de programación cliente-servidor y no puedo ejecutar el siguiente ejemplo:

import java.net.Socket;
import java.net.SocketException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TCPEchoClient {

public static void main(String[] args) throws IOException {

if ((args.length < 2) || (args.length > 3)) // Test for correct # of args
{
throw new IllegalArgumentException("Parameter(s): <Server> <Word> [<Port>]");
}

String server = args[0]; // Server name or IP address
// Convert argument String to bytes using the default character encoding
byte[] data = args[1].getBytes();

int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;

// Create socket that is connected to server on specified port
Socket socket = new Socket(server, servPort);
System.out.println("Connected to server...sending echo string");

InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

out.write(data); // Send the encoded string to the server

// Receive the same string back from the server
int totalBytesRcvd = 0; // Total bytes received so far
int bytesRcvd; // Bytes received in last read
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd,
data.length - totalBytesRcvd)) == -1) {
throw new SocketException("Connection closed prematurely");
}
totalBytesRcvd += bytesRcvd;
} // data array is full

System.out.println("Received: " + new String(data));

socket.close(); // Close the socket and its streams
}
}


He intentado hacerlo con el netbeans pasándole como argumentos una dirección IP + espacio + un puerto y no sé si se debe hacer de otro modo, si no pongo direcciones correctas, ... Me podríais ayudar?

agosto 29, 2015 | Registered Commentermarti-pm93

Hola,

segun entiendo el programa recibe tres parametros por consola

ip data puerto

Si lo ejecutas desde consola seria algo asi.
digamos: C:\Users>java TCPEchoClient 127.0.0.1 aaaaaaa 10
donde 127.0.0.1(localhost) es la ip donde corre tu servidor imagino que es en local.
aaaaaa es la data, en el programa representa el tamaño de la data que se recibe es decir se reciben 7 bytes.
y el 10 es el puerto, que debe coincidir con el servidor, imagino que ese código
tambien lo debes tener, y no esta demás decir que debes correr primero el código del servidor.


imagino que no te sale porque no envías bien el segundo parámetro ya que según tu mensaje entendiste que el segundo parámetro es el puerto donde se ejecuta el servidor cuando no lo es.

bueno nos cuentas,

saludos

agosto 31, 2015 | Unregistered Commenterjhosep

Ya me ha funcionado, muchísimas gracias tenias razón, me faltaba el código del servidor para poder hacer que funcione (es que el del servidor sale un par de páginas más adelante y me pensaba que era independiente, soy muy torpe...) y el segundo parámetro es el mensaje. Dejaré aquí el programa del servidor por si a alguien le interesa en un futuro:

import java.net.*; // for Socket, ServerSocket, and InetAddress
import java.io.*; // for IOException and Input/OutputStream

public class TCPEchoServer {

private static final int BUFSIZE = 32; // Size of receive buffer

public static void main(String[] args) throws IOException {

if (args.length != 1) // Test for correct # of args
{
throw new IllegalArgumentException("Parameter(s): <Port>");
}

int servPort = Integer.parseInt(args[0]);

// Create a server socket to accept client connection requests
ServerSocket servSock = new ServerSocket(servPort);

int recvMsgSize; // Size of received message
byte[] receiveBuf = new byte[BUFSIZE]; // Receive buffer

while (true) { // Run forever, accepting and servicing connections
Socket clntSock = servSock.accept(); // Get client connection

SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);

InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();

// Receive until client closes connection, indicated by -1 return
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf, 0, recvMsgSize);
}
clntSock.close(); // Close the socket. We are done with this client!
}
/* NOT REACHED */
}
}

agosto 31, 2015 | Registered Commentermarti-pm93

No puedo editar el título del thread?

agosto 31, 2015 | Registered Commentermarti-pm93

jeje pensé que si lo estabas ejecutando el servidor, bueno cosas de novatos a cualquiera nos pasa asi que no seas duro contigo mismo. Además son de esas anécdotas divertidas, que tendrás para contarle a alguien y pasar un buen rato XD.

Lo del titulo del hilo solo pueden los administradores, tendrías que hacer una solicitud o crear otro hilo.

Saludos.

agosto 31, 2015 | Unregistered Commenterjhosep