Lo que intento es que el cliente pueda enviar mensajes al servidor y este los reciba hasta que el mensaje sea "close" y entonces cierre la conexión.
El problema es que cuando recibe el "close" me da este error:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutp utStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStre am.java:141)
at clienteservidortcp.MonoServerTCPb.main(MonoServerT CPb.java:65)
Aquí dejo los codigos del servidor:
SERVIDOR:
Código:
package clienteservidortcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import javax.print.DocFlavor;
public class MonoServerTCPb {
public String dirServidor = "localhost";
public int puerto = 5555;
public static void main(String[] args) {
String dirServidor = "localhost";
int puerto = 5555;
try {
//Crear socket servidor
ServerSocket miServidor = new ServerSocket();
System.out.println("Socket Servidor creado");
//System.out.println("Haciendo binding");
InetSocketAddress datosServidor = new InetSocketAddress(dirServidor, puerto);
miServidor.bind(datosServidor);
//Esperamos y aceptamos conexiones entrantes
System.out.println("Esperando conexiones");
Socket nuevoCliente = miServidor.accept();
System.out.println("Cliente conectado");
//Canal de entrada para recibir mensajes
InputStream cEntrada = nuevoCliente.getInputStream();
//Canal de salida para enviar mensajes
OutputStream cSalida = nuevoCliente.getOutputStream();
//Mensaje de confirmacion de conexion para el cliente
String cliConectado = ("Te has conectado al servidor " + dirServidor + " en el puerto " + puerto);
//Enviamos el mensaje
cSalida.write(cliConectado.getBytes());
//Crea un array de bytes para el mensaje que recibe del cliente
byte[] mensaje = new byte[100];
do{
//Lee el mensaje
cEntrada.read(mensaje);
//Muestra el mensaje recibido
System.out.println("Mensaje recibido: " + new String(mensaje));
//Confirma el mensaje y lo reenvia al cliente
String mRecibido = "Mensaje recibido (servidor)";
cSalida.write(mRecibido.getBytes());
}while (new String(mensaje).compareToIgnoreCase("close") != 0) ;
//Cierra el socket del cliente
nuevoCliente.close();
System.out.println("Socket del cliente cerrado");
//Cierra el socket del servidor
miServidor.close();
System.out.println("Socket del servidor cerrado");
System.out.println("Programa terminado");
} catch (IOException e) {
e.printStackTrace();
}
}
}
CLIENTE:
Código:
package clienteservidortcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
/**
*
* @author Dafne
*/
public class MonoClientTCPb {
public static void main(String[] args) {
BufferedReader leer = new BufferedReader(new InputStreamReader(System.in));
try {
String dirServidor = "localhost";
int puerto = 5555;
//Creamos el socket del cliente
Socket miCliente = new Socket();
System.out.println("Socket cliente creado");
System.out.println("Estableciendo la conexión");
// Obtenemos una dirección con los datos del servidor
InetSocketAddress datosServer = new InetSocketAddress(dirServidor, puerto);
//Conectamos con el servidor
miCliente.connect(datosServer);
//System.out.println("Cliente conectado a " + dirServidor + " en puerto " + puerto);
//Canal de entrada para recibir mensajes
InputStream cEntrada = miCliente.getInputStream();
//Canal de salida para enviar mensajes
OutputStream cSalida = miCliente.getOutputStream();
byte[] cliConectado = new byte[150];
cEntrada.read(cliConectado);
System.out.println(new String(cliConectado));
String mensaje = "";
//Hace un bucle para que mientras el mensaje del cliente sea diferente a "close" siga enviando mensajes
do {
//Prepara el mensaje para enviarlo
System.out.println("Mensaje cliente: ");
mensaje = leer.readLine();
System.out.println("Enviando mensaje al servidor");
//Envia el mensaje
cSalida.write(mensaje.getBytes());
System.out.println("Mensaje enviado");
byte[] confirmacion = new byte[100];
//Lee el mensaje que entra desde el servidor
cEntrada.read(confirmacion);
//Muestra el mensaje recibido
System.out.println(new String(confirmacion));
System.out.println("");
} while (mensaje.compareToIgnoreCase("close") != 0);
//Cierra el socket del cliente
miCliente.close();
System.out.println("Socket del cliente cerrado");
System.out.println("Programa terminado");
} catch (IOException e) {
e.printStackTrace();
}
}
}