› Foros › PC › Software libre
minius escribió:La aplicación se basa en que un cliente puede ir enviándo mensajes(escribir) que se almacenan en un buffer o bien ir sacando los mensajes del buffer(leer)
EXGeese escribió:minius escribió:La aplicación se basa en que un cliente puede ir enviándo mensajes(escribir) que se almacenan en un buffer o bien ir sacando los mensajes del buffer(leer)
No sé si lo he entendido bien:
- Hay un "buffer" en el server
- Se puedan conectar múltiples clientes (al mismo puerto, no hace falta crear un servidor en otro puerto por cada nuevo cliente)
- Cada cliente puede leer o escribir del buffer
Si es así, te recomiendo primero la lectura de:
http://docs.oracle.com/javase/tutorial/ ... erver.html
Mírate los ejemplos del final, la parte de múltiples clientes.
En tu caso, supongo que habría que añadir el buffer de forma "static" en la clase MultiServerThread, junto con el protocolo de leer y escribir.
Por curiosidad, ¿cuál es la clase Buffer que usas?
package sockets;
import java.io.*;
import java.net.*;
public class Client
{
public static void main(String[] args) throws IOException
{
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
try
{
socket = new Socket("localhost", 4444);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
catch (UnknownHostException e)
{
System.err.println("Host desconocido: localhost.");
System.exit(1);
}
catch (IOException e)
{
System.err.println("No se puede establecer conexión I/O con: localhost.");
System.exit(1);
}
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null)
{
System.out.println("Server: " + fromServer);
if (fromServer.equals("ADIOS"))
break;
fromUser = stdIn.readLine();
if (fromUser != null)
{
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
out.close();
in.close();
stdIn.close();
socket.close();
}
}
package sockets;
import java.net.*;
import java.io.*;
public class MultiServer
{
public static void main(String[] args) throws IOException
{
int portNumber = 4444;
boolean listening = true;
try (ServerSocket serverSocket = new ServerSocket(portNumber))
{
while (listening)
{
new MultiServerThread(serverSocket.accept()).start();
}
}
catch (IOException e)
{
System.err.println("No se encuentra disponible el puerto " + portNumber);
System.exit(-1);
}
}
}
package sockets;
import java.net.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.io.*;
public class MultiServerThread extends Thread
{
private Socket socket = null;
private static ArrayBlockingQueue<String> abq = new ArrayBlockingQueue<String>(5, true);
public MultiServerThread(Socket socket)
{
super("KKMultiServerThread");
this.socket = socket;
}
public void run()
{
try (
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
)
{
String inputLine, outputLine = "";
out.println("HOLA");
while ((inputLine = in.readLine()) != null)
{
if(inputLine.equalsIgnoreCase("LEER"))
{
if (abq.size() > 0)
{
outputLine = abq.poll();
}
else
{
outputLine = "No hay mensajes";
}
}
else if( (inputLine.length() > 8) && (inputLine.substring(0,8).equalsIgnoreCase("ESCRIBIR")) )
{
try
{
abq.put(inputLine.substring(9));
outputLine = "Ok, mensaje recibido";
}
catch (InterruptedException e)
{
outputLine = "Fallo, mensaje interrumpido";
e.printStackTrace();
}
}
else if(inputLine.equalsIgnoreCase("SALIR"))
{
outputLine = "ADIOS";
}
else
{
outputLine = "Comando desconocido: " + inputLine;
}
out.println(outputLine);
}
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}