2011-02-24 21 views
27

Estoy intentando adaptar mi servidor de socket simple para que pueda tener múltiples conexiones TCP, a través de subprocesamiento múltiple, pero parece que no puedo hacerlo funcionar. Mi código hasta el momento es el siguiente, no estoy realmente seguro de a dónde ir desde aquí:Creación de un servidor de socket que permite múltiples conexiones a través de subprocesos y Java

import java.net.*; 
import java.io.*; 

public class DoSomethingWithInput implements Runnable { 
    private final Socket clientSocket; //initialize in const'r 
    public void run() { 


    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String nextline; 
     while ((nextline = in.readLine())!=null) { 
      System.out.println(nextline); 
     } //... close socket, etc. 
    } 
} 


public class Socket{ 

    public Socket() { 
} 
@Override 
public void run() { 
    try { 
    ServerSocket serverSocket = null; 
    serverSocket = new ServerSocket(5432); 
    for (;;) { 
     ServerSocket serverSocket = null; 
     serverSocket = new ServerSocket(5432); 
     for (;;) { 
     Socket clientSocket = null; 
     clientSocket = serverSocket.accept(); 
     //delegate to new thread 
     new Thread(new DoSomethingWithInput(clientSocket)).start(); 
     } 
    } 
    }catch (IOException e) { 
    System.err.println("Could not listen on port: 5432."); 
    System.exit(1); 
} 
} 
} 

qué alguien sea capaz de darme algunos consejos sobre cómo podría hacer esto, y por qué mi aplicación actual no serán trabajo ? Estaba ejecutando las sugerencias en el tutorial de Java http://download.oracle.com/javase/tutorial/networking/sockets/examples/KKMultiServerThread.java aquí, pero el ejemplo que dan aquí parece usar muchas fuentes externas y clases como KnockKnockProtocol, etc.

¿Alguien podría ayudarme con esto?

¡Muchas gracias!

Respuesta

50

El problema es que en la actualidad se está aceptando la conexión, pero el bloqueo a continuación, realizar inmediatamente lee en él hasta que está cerrado:

// After a few changes... 
Socket clientSocket = serverSocket.accept(); 
BufferedReader in = new BufferedReader(new InputStreamReader(
    clientSocket.getInputStream())); 
String nextLine; 
while ((nextLine = in.readLine()) != null) { 
    System.out.println(nextline); 
} 

Eso significa que el mismo hilo que acepta la conexión está tratando de manejar la conexión. Eso no le permitirá usar múltiples conexiones al mismo tiempo.

En su lugar, cree una clase (por ejemplo, ConnectionHandler) que implemente Runnable y tenga un constructor tomando Socket. Su método run debe manejar la conexión. Luego cambie su código a:

Socket clientSocket = serverSocket.accept(); 
Runnable connectionHandler = new ConnectionHandler(clientSocket); 
new Thread(connectionHandler).start(); 

Eso dejará su hilo "principal" libre de esperar a la próxima conexión.

(Por cierto, la clase KnockKnockProtocol no es realmente "externa" - es parte del ejemplo Ellos simplemente no lo hacen muy claro que el source is here ....)

+0

podría dar un ejemplo para esa clase que sugirió? –

+0

@DanyLavrov: No, creo que he dado suficiente información aquí. Realmente no quiero comenzar a trabajar mucho para agregar a una respuesta que tiene más de 5 años y parece que tiene suficiente información para la mayoría de las personas. . Si está tratando de usarlo y tiene problemas, tal vez debería hacer una nueva pregunta que muestre lo que ha intentado y lo que salió mal, con una referencia a esta respuesta. –

+0

no importa. Me di cuenta, gracias de todos modos. –

17

No tiene multihilo. Está creando un hilo que se une a un puerto y luego lee desde cualquier socket de cliente hasta que se cierre la conexión.

Necesita pasar el socket a un nuevo hilo y hacer que lo lea.

public class DoSomethingWithInput implements Runnable { 
    private final Socket clientSocket; //initialize in const'r 
    public void run() { 

     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String nextline; 
     while ((nextline = in.readLine())!=null) { 
      System.out.println(nextline); 
     } //... close socket, etc. 
    } 
} 

//... 
ServerSocket serverSocket = null; 
serverSocket = new ServerSocket(5432); 
for (;;) { 
    Socket clientSocket = null; 
    clientSocket = serverSocket.accept(); 
    //delegate to new thread 
    new Thread(new DoSomethingWithInput(clientSocket)).start(); 
} //... 
Cuestiones relacionadas