歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java網絡編程二:服務器處理多個用戶請求的解決方案(返回多個用戶輸入的信息)

1、用多個線程來同時為多個客戶提供服務,這是提高服務器的並發性能的最常用的手段,那麼怎樣來為多個用戶提供服務呢?

     主要有三種方法:

     

2、為了更清楚理解服務器到底是怎麼工作的,下面用第一種方式來處理多個用戶請求。如果想用第二、第三方式可以參考:java多線程總結五:線程池的原理及實現 http://www.linuxidc.com/Linux/2011-11/48063.htm

下面的示例中客戶端輸入信息,服務器端回復相同的信息,可以同時開啟多個客戶端,同時輸入信息,源代碼如下:

服務器端代碼:

  1. package demo.net;  
  2.   
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.ServerSocket;  
  7. import java.net.Socket;  
  8.   
  9.   
  10. /** 
  11.  * 服務器返回用戶輸入的信息, 為多個用戶提供服務:為每個客戶分配一個工作線程 
  12.  */  
  13. public class ChatServers {  
  14.     private int port = 8189;// 默認服務器端口   
  15.   
  16.     public ChatServers() {  
  17.     }  
  18.   
  19.     // 創建指定端口的服務器   
  20.     public ChatServers(int port) {  
  21.         this.port = port;  
  22.     }  
  23.   
  24.     public void service() {  
  25.         int i=0;  
  26.         try {  
  27.             // 建立服務器連接,設定客戶連接請求隊列的長度   
  28.             ServerSocket server = new ServerSocket(port,3);  
  29.             while (true) {  
  30.                 // 等待客戶連接   
  31.                 Socket socket = server.accept();  
  32.                 i++;  
  33.                 System.out.println("第"+i+"個客戶連接成功!");  
  34.                 new Thread(new ServerThread(socket)).start();  
  35.             }  
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40.   
  41.     public static void main(String[] args) {  
  42.         new ChatServers().service();  
  43.     }  
  44. }  
  45.   
  46. class ServerThread implements Runnable {  
  47.     private Socket socket;  
  48.   
  49.     public ServerThread(Socket socket) {  
  50.         this.socket = socket;  
  51.     }  
  52.   
  53.     // 任務是為一個用戶提供服務   
  54.     @Override  
  55.     public void run() {  
  56.         try {  
  57.             try {  
  58.                 // 讀取客戶端傳過來信息的DataInputStream   
  59.                 DataInputStream in = new DataInputStream(socket  
  60.                         .getInputStream());  
  61.                 // 向客戶端發送信息的DataOutputStream   
  62.                 DataOutputStream out = new DataOutputStream(socket  
  63.                         .getOutputStream());  
  64.                 while (true) {  
  65.                     // 讀取來自客戶端的信息   
  66.                     String accpet = in.readUTF();  
  67.                     out.writeUTF("服務器:" + accpet);  
  68.                 }  
  69.             } finally {// 建立連接失敗的話不會執行socket.close();   
  70.                 socket.close();  
  71.             }  
  72.         } catch (IOException e) {  
  73.             e.printStackTrace();  
  74.         }  
  75.     }  
  76. }  

客戶端代碼:

  1. package demo.net;  
  2.   
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.Socket;  
  7. import java.util.Scanner;  
  8.   
  9. /** 
  10.  * 注意用到的輸入輸出流DataInputStream和DataOutputStream,成對出現,最好用字節流 
  11.  */  
  12. // 客戶端類   
  13. public class ChatClients {  
  14.     private String host = "localhost";// 默認連接到本機   
  15.     private int port = 8189;// 默認連接到端口8189   
  16.   
  17.     public ChatClients() {  
  18.   
  19.     }  
  20.   
  21.     // 連接到指定的主機和端口   
  22.     public ChatClients(String host, int port) {  
  23.         this.host = host;  
  24.         this.port = port;  
  25.     }  
  26.   
  27.     public void chat() {  
  28.         try {  
  29.             // 連接到服務器   
  30.             Socket socket = new Socket(host, port);  
  31.             try {  
  32.                 // 讀取服務器端傳過來信息的DataInputStream   
  33.                 DataInputStream in = new DataInputStream(socket  
  34.                         .getInputStream());  
  35.                 // 向服務器端發送信息的DataOutputStream   
  36.                 DataOutputStream out = new DataOutputStream(socket  
  37.                         .getOutputStream());  
  38.   
  39.                 // 裝飾標准輸入流,用於從控制台輸入   
  40.                 Scanner scanner = new Scanner(System.in);  
  41.   
  42.                 while (true) {  
  43.                     String send = scanner.nextLine();  
  44.                     // 把從控制台得到的信息傳送給服務器   
  45.                     out.writeUTF(send);  
  46.                     // 讀取來自服務器的信息   
  47.                     String accpet = in.readUTF();  
  48.                     System.out.println(accpet);  
  49.                 }  
  50.   
  51.             } finally {  
  52.                 socket.close();  
  53.             }  
  54.         } catch (IOException e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.     }  
  58.   
  59.     public static void main(String[] args) {  
  60.         new ChatClients().chat();  
  61.     }  
  62. }  

運行結果:

                                 

Copyright © Linux教程網 All Rights Reserved