2012-02-09 4 views
0

J'ai créé ce serveur réseau Java:Comment ajouter Java serveur réseau en bundle OSGI

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

public class EchoServer 
{   
    ServerSocket m_ServerSocket; 


    public EchoServer() 
    { 
     try 
     { 
      // Create the server socket. 
      m_ServerSocket = new ServerSocket(12111); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println("Could not create server socket at 12111. Quitting."); 
      System.exit(-1); 
     } 

     System.out.println("Listening for clients on 12111..."); 

     // Successfully created Server Socket. Now wait for connections. 
     int id = 0; 
     while(true) 
     {       
      try 
      { 
       // Accept incoming connections. 
       Socket clientSocket = m_ServerSocket.accept(); 

       // accept() will block until a client connects to the server. 
       // If execution reaches this point, then it means that a client 
       // socket has been accepted. 

       // For each client, we will start a service thread to 
       // service the client requests. This is to demonstrate a 
       // multithreaded server, although not required for such a 
       // trivial application. Starting a thread also lets our 
       // EchoServer accept multiple connections simultaneously. 

       // Start a service thread 

       ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++); 
       cliThread.start(); 
      } 
      catch(IOException ioe) 
      { 
       System.out.println("Exception encountered on accept. Ignoring. Stack Trace :"); 
       ioe.printStackTrace(); 
      } 
     } 
    } 

    public static void main (String[] args) 
    { 
     new EchoServer();  
    } 


    class ClientServiceThread extends Thread 
    { 
     Socket m_clientSocket;   
     int m_clientID = -1; 
     boolean m_bRunThread = true; 

     ClientServiceThread(Socket s, int clientID) 
     { 
      m_clientSocket = s; 
      m_clientID = clientID; 
     } 

     public void run() 
     {    
      // Obtain the input stream and the output stream for the socket 
      // A good practice is to encapsulate them with a BufferedReader 
      // and a PrintWriter as shown below. 
      BufferedReader in = null; 
      PrintWriter out = null; 

      // Print out details of this connection 
      System.out.println("Accepted Client : ID - " + m_clientID + " : Address - " + 
          m_clientSocket.getInetAddress().getHostName()); 

      try 
      {         
       in = new BufferedReader(new InputStreamReader(m_clientSocket.getInputStream())); 
       out = new PrintWriter(new OutputStreamWriter(m_clientSocket.getOutputStream())); 

       // At this point, we can read for input and reply with appropriate output. 

       // Run in a loop until m_bRunThread is set to false 
       while(m_bRunThread) 
       {      
        // read incoming stream 
        String clientCommand = in.readLine(); 

        System.out.println("Client Says :" + clientCommand); 


        if(clientCommand.equalsIgnoreCase("quit")) 
        { 
         // Special command. Quit this thread 
         m_bRunThread = false; 
         System.out.print("Stopping client thread for client : " + m_clientID); 
        } 
        else 
        { 
         // Echo it back to the client. 
         out.println(clientCommand); 
         out.flush(); 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
      finally 
      { 
       // Clean up 
       try 
       {      
        in.close(); 
        out.close(); 
        m_clientSocket.close(); 
        System.out.println("...Stopped"); 
       } 
       catch(IOException ioe) 
       { 
        ioe.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

Je veux insérer ce code dans bundle OSGI. Pour le moment, je n'ai pas configuré Glassfish avec datasource pour tester le bundle. Que dois-je faire pour configurer le serveur Java pour écouter les connexions entrantes lorsque je le déploie sur le serveur Glassfish? Ai-je besoin d'ajouter somenthing dans l'activateur de regroupement OSGI pour que le serveur Java écoute les connexions réseau entrantes?

Best Wishes

+0

Des idées ou une réponse? –

Répondre

1

Il devrait être suffisant pour créer simplement votre objet EchoServer dans la méthode start() et pour autant que je le vois va commencer à travailler. Vous pourriez penser à l'exécuter dans un fil séparé afin de ne pas bloquer l'activité de votre bundle.

+0

Vous devez * exécuter * le serveur dans un thread séparé, car la spécification OSGi exige que la méthode start() (et stop()) d'un activateur de bundle retourne le plus rapidement possible. – jawi

Questions connexes