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

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

日期:2017/3/1 10:56:01   编辑:Linux編程

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

主要有三種方法:

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

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

服務器端代碼:

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

客戶端代碼:

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

運行結果:

Copyright © Linux教程網 All Rights Reserved