Cliente_1.java_



import java.lang.System;
import java.net.Socket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.*;

public class Cliente
{
	public static void main(String args[])
	{
		CHAT portTalk = new CHAT(args);
		portTalk.MuestraParametrosDestino();
		portTalk.MuestraParametrosLocales();
		portTalk.chat();
		portTalk.shutdown();
	}
}

class CHAT
{
	Socket ConecciOn;
	DataOutputStream outStream;
	BufferedReader inStream;

	public CHAT(String args[])
	{
		if(args.length!=2) error("Uso: java Cliente host port");
		String Destino = args[0];
		int puerto = 0;
		try
		{
			puerto = Integer.valueOf(args[1]).intValue();
		} catch (NumberFormatException ex){ error("NUmero de puerto invAlido..."); }
		try
		{
			ConecciOn = new Socket(Destino, puerto);
		} catch (UnknownHostException ex) { error("MAquina desconocida...-host-"); }
		catch (IOException ex) { error("Error creando sockets"); }
		try
		{
			inStream = new BufferedReader(new InputStreamReader(ConecciOn.getInputStream()));
			outStream = new DataOutputStream(ConecciOn.getOutputStream());
		} catch (IOException ex) { error("Error obteniendo flujos"); }
		System.out.println("Conectado a "+Destino+" en el puerto "+puerto+".");
	}

	public void MuestraParametrosDestino()
	{
		InetAddress destAddress = ConecciOn.getInetAddress();		// Datos de la mAquina con la que se conecta
		String name = destAddress.getHostName();			// Nombre del host
		byte ipAddress[] = destAddress.getAddress();			// DirecciOn IP
		int puerto = ConecciOn.getPort();				// Puerto con el que se conecta
		MuestraParAmetros("Destino ",name,ipAddress,puerto);
	}

	public void MuestraParametrosLocales()
	{
		InetAddress localAddress = null;
		try { localAddress = InetAddress.getLocalHost(); }		// Datos de la mAquina local
		catch (UnknownHostException ex) { error("Error al leer informaciOn local"); }
		String Nombre = localAddress.getHostName();			// Nombre de la mAquina
		byte ipAddress[] = localAddress.getAddress();			// IP local
		int puerto = ConecciOn.getLocalPort();				// Puerto local
		MuestraParAmetros("Local ",Nombre,ipAddress,puerto);
	}

	public void MuestraParAmetros(String s,String name,byte ipAddress[],int puerto)
	{
		System.out.println("host " +s+" es "+name+".");
		System.out.print(s+"DirecciOn IP: ");
		for(int i=0;i<ipAddress.length;++i)
			System.out.print(ipAddress[i]+".");
			//System.out.print((ipAddress[i]+256)%256+".");
		System.out.println();
		System.out.println(s+"Puerto "+puerto+".");
	}

	public void chat()
	{
		BufferedReader Teclado = new BufferedReader(new InputStreamReader(System.in));
		boolean fin = false;
		do
		{
			try
			{
				System.out.print("Enviar, Recibir, o salir (E/R/S): ");
				System.out.flush();
				String linea = Teclado.readLine();
				if(linea.length()>0)
				{
					linea=linea.toUpperCase();
					switch (linea.charAt(0))
					{
						case 'E':
							String sendLine = Teclado.readLine();
							outStream.writeBytes(sendLine);
							outStream.write(10);
							outStream.flush();
							break;
						case 'R':
							int inByte;
							System.out.print("***");
							while ((inByte = inStream.read()) != '\n')
								System.out.write(inByte);
							System.out.println();
							break;
						case 'S':
							fin=true;
							outStream.writeBytes("salir");
							break;
						default:
							break;
					}
				}
			} catch (IOException ex) { error("Error leyendo del teclado o del socket"); }
		} while(!fin);
	}

	public void shutdown() { try { ConecciOn.close(); } catch (IOException ex) { error("IO error cerrando socket"); } }

	public void error(String s) { System.out.println(s); System.exit(1); }
}