Java 示例 - 多线程服务器

  • 问题描述

    如何创建多线程服务器?
  • 解决方案

    下面的例子演示了如何使用 Socket 类的 ssock.accept() 方法和 ServerSocket 类的 MultiThreadServer(socketname) 方法创建一个多线程服务器。
    
    import java.io.IOException;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class MultiThreadServer implements Runnable {
       Socket csocket;
       MultiThreadServer(Socket csocket) {
          this.csocket = csocket;
       }
       public static void main(String args[]) throws Exception { 
          ServerSocket ssock = new ServerSocket(1234);
          System.out.println("Listening");
          
          while (true) {
             Socket sock = ssock.accept();
             System.out.println("Connected");
             new Thread(new MultiThreadServer(sock)).start();
          }
       }
       public void run() {
          try {
             PrintStream pstream = new PrintStream(csocket.getOutputStream());
             for (int i = 100; i >= 0; i--) {
                pstream.println(i + " bottles of beer on the wall");
             }
             pstream.close();
             csocket.close();
          } catch (IOException e) {
             System.out.println(e);
          }
       }
    }
    
  • 结果

    上面的代码示例将产生以下结果。
    
    Listening
    Connected
    
    以下是如何创建多线程服务器的另一个示例。
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
     
    public class NewClass {
       ServerSocket myServerSocket;
       boolean ServerOn = true;
       public NewClass() { 
          try {
             myServerSocket = new ServerSocket(8888);
          } catch(IOException ioe) { 
             System.out.println("Could not create server socket on port 8888. Quitting.");
             System.exit(-1);
          } 
          
          Calendar now = Calendar.getInstance();
          SimpleDateFormat formatter = new SimpleDateFormat(
             "E yyyy.MM.dd 'at' hh:mm:ss a zzz");
          System.out.println("It is now : " + formatter.format(now.getTime()));
          
          while(ServerOn) { 
             try { 
                Socket clientSocket = myServerSocket.accept();
                ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
                cliThread.start(); 
             } catch(IOException ioe) { 
                System.out.println("Exception found on accept. Ignoring. Stack Trace :"); 
                ioe.printStackTrace(); 
             }  
          } 
          try { 
             myServerSocket.close(); 
             System.out.println("Server Stopped"); 
          } catch(Exception ioe) { 
             System.out.println("Error Found stopping server socket"); 
             System.exit(-1); 
          } 
       }
       
       public static void main (String[] args) { 
          new NewClass();        
       } 
       
       class ClientServiceThread extends Thread { 
          Socket myClientSocket;
          boolean m_bRunThread = true; 
          public ClientServiceThread() { 
             super(); 
          } 
          
          ClientServiceThread(Socket s) { 
             myClientSocket = s; 
          } 
          
          public void run() { 
             BufferedReader in = null; 
             PrintWriter out = null; 
             System.out.println(
                "Accepted Client Address - " + myClientSocket.getInetAddress().getHostName());
             try { 
                in = new BufferedReader(
                   new InputStreamReader(myClientSocket.getInputStream()));
                out = new PrintWriter(
                   new OutputStreamWriter(myClientSocket.getOutputStream()));
                
                while(m_bRunThread) { 
                   String clientCommand = in.readLine(); 
                   System.out.println("Client Says :" + clientCommand);
                   
                   if(!ServerOn) { 
                      System.out.print("Server has already stopped"); 
                      out.println("Server has already stopped"); 
                      out.flush(); 
                      m_bRunThread = false;
                   } 
                   if(clientCommand.equalsIgnoreCase("quit")) {
                      m_bRunThread = false;
                      System.out.print("Stopping client thread for client : ");
                   } else if(clientCommand.equalsIgnoreCase("end")) {
                      m_bRunThread = false;
                      System.out.print("Stopping client thread for client : ");
                      ServerOn = false;
                   } else {
                      out.println("Server Says : " + clientCommand);
                      out.flush(); 
                   } 
                } 
             } catch(Exception e) { 
                e.printStackTrace(); 
             } 
             finally { 
                try { 
                   in.close(); 
                   out.close(); 
                   myClientSocket.close(); 
                   System.out.println("...Stopped"); 
                } catch(IOException ioe) { 
                   ioe.printStackTrace(); 
                } 
             } 
          } 
       } 
    }