Hola er_pablito_85,
Según mi experiencia en sockets, debes tener cuidado con varias cosas:
- Un socket puede enviar ó recibir datos en un instante dado de tiempo, no ambas cosas (si se quieren hacer ambas cosas, se hacen por sockets diferentes, con puertos diferentes).
- Haz simplemente que la centralita abra el ServerSocket, y "lea" por el InputStream lo que está recibiendo, sin escribir nada. El cliente deberá abrir el socket únicamente cuando ya vaya a escribir, no antes.
Aquí va un código que funciona:
Código:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
private static int numSesion=0;
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(12345);
} catch (IOException e) {
e.printStackTrace();
return;
}
while (true){
try {
Socket nuevoSocket = serverSocket.accept();
Escucha esc = new Escucha(nuevoSocket,numSesion++);
esc.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
protected static class Escucha extends Thread{
int numSesion;
Socket miSocket;
public Escucha(Socket miSocket,int numSesion) {
this.miSocket = miSocket;
this.numSesion = numSesion;
}
@Override
public void run() {
BufferedReader rd = null;
try {
rd = new BufferedReader(new InputStreamReader(miSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while (!miSocket.isClosed()){
String linea;
try {
linea = rd.readLine();
if (linea.equals("salir")){
miSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
break;
}
System.out.println(String.valueOf(numSesion) + "-" + linea);
}
}
}
}
Este código, si lo corres, crea un servidor en el puerto 12345, que si te conectas por Telnet (con el comando "telnet localhost 12345") todo lo que escribas en ese Telnet aparecerá en el System.out del servidor. La conexión se cierra si se escribe "salir" (como se está leyendo con un BufferedReader, solo se visualiza información al poner <enter>).
Creo que esto puede servir como guía para implementar lo que necesitas. Ten en cuenta el uso de Threads para abrir muchas conexiones (cada conexión nueva es un hilo) y el control de los mismos: qué condición hará que un hilo termine (control de tiempos máximos de espera, etc).
La otra solución (muuuuucho más simple) es transferir archivos por algún protocolo existente, como SSH, FTP, entre otros. Hay muchos clientes en internet para ello, y seguramente será mucho más simple de implementar, que todo el control que toca hacer para que el socket sea fiable (cosa que un protocolo como FTP ya implementa).
Saludos.