程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java在Client/Server中應用(2)

Java在Client/Server中應用(2)

編輯:關於JAVA

三. 編寫服務器類Java程序

  1. // Server.Java
  2. import Java.io.*;
  3. import Java.Net.*;
  4. public class Server extends Thread
  5. {
  6. public final static int Default_Port=6543;
  7. protectd int port;
  8. protectd ServerSockt listen_socket;
  9. // 定義出錯例程:如果出現異常錯誤,退出程序。
  10. Public static void fail(Exception e, String msg)
  11. {
  12. System.err.println(msg + ": " + e);
  13. System.exit(1);
  14. }
  15. // 定義並啟動服務器的Socket 例程,監聽客戶機的連接請求。
  16. public Server(int port)
  17. {
  18. if(port == 0) port = Default_Port;
  19. this.port = port;
  20. try
  21. {
  22. listen_socket = new ServerSocket(port);
  23. }
  24. catch(IOException e) fail(e, "Exception creating server socket");
  25. System.out.println("Server: listening on port" + port);
  26. This.start();
  27. }
  28. /* 下面為服務器監聽線程的主程序。該線程一直循環執行,監聽並接受客戶機發出的連接請求。對每一個連接,均產生一個連接對象與之對應,通過Socket 通道進行通信。*/
  29. public void run()
  30. {
  31. try
  32. {
  33. while(true)
  34. {
  35. Socket clIEnt_socket = listen_socket.accept();
  36. Connection c = new Connection(clIEnt_socket);
  37. }
  38. }
  39. catch(IOException e) fail(e,"Exception while listening for connections")
  40. }
  41. // 啟動服務器主程序
  42. public static void main(String args[])
  43. {
  44. int port = 0;
  45. if (args.length == 1)
  46. {
  47. try port = Integer.parseInt(args[0]);
  48. catch(NumberFormatException e) port = 0;
  49. }
  50. new Server(port);
  51. // End of the main
  52. } // End of Server class
  53. //以下定義了Connection 類,它是用來處理與客戶機的所有通信的線程。
  54. class Connection extends Thread
  55. {
  56. protected Socket clIEnt;
  57. protected DataInputStream in;
  58. protected PrintStream out;
  59. // 初始化通信流並啟動線程
  60. public Connection(Socket clIEnt_socket)
  61. {
  62. client = clIEnt_socket;
  63. try
  64. {
  65. in = new DataInputStream(clIEnt.getinputStream());
  66. out = new PrintStream(clIEnt.getOutputStream());
  67. }
  68. catch(IOException e)
  69. {
  70. try clIEnt.close();
  71. catch(IOException e2);
  72. System.err.println("Exception while getting socket streram: " + e);
  73. Return;
  74. }
  75. this.start;
  76. } // End of Connection method
  77. // 服務例程:讀出一行文本;反轉文本;返回文本。
  78. public void run()
  79. {
  80. String line;
  81. StringBuffer revline;
  82. int len;
  83. try
  84. {
  85. for(;;)
  86. {
  87. // Read a line
  88. line = in.readline();
  89. if(line == null) break;
  90. // Reverse the line
  91. len = line.length();
  92. revline = new StringBuffer(len);
  93. for(int i = len-1; i >=0; i--)
  94. revline.insert(len-1-I;line.charAt(i));
  95. // Write out the reverse line
  96. out.println(revline);
  97. }
  98. catch(IOException e);
  99. finally try clIEnt.close();
  100. catch(IOException e2);
  101. }
  102. // End of run method
  103. }
  104. // End of Connection class

四. 編寫客戶機類Java 程序

  1. // ClIEnt.Java
  2. import Java.io.*;
  3. import Java.Net.*;
  4. public class ClIEnt extends
  5. {
  6. public static final int Default_Port = 6543;
  7. // 定義出錯例程
  8. public static final void usage()
  9. {
  10. System.out.println("Usage: Java ClIEnt []");
  11. System.exit(0);
  12. }
  13. public static void main(String args[])
  14. {
  15. int port = Default_Port;
  16. Socket s = null;
  17. // 解析端口參數
  18. if ((args.length != 1)&&(args.length != 2 )) usage();
  19. if (args.length == 1)
  20. port = Default_Port;
  21. else
  22. {
  23. try port = Integer.parseInt(args[1]);
  24. catch(NumberFormaatException e) usage();
  25. }
  26. try{
  27. // 產生一個Socket ,通過指定的端口與主機通信。
  28. s = new Socket(args[0], port);
  29. // 產生用於發出和接收的文本字符流
  30. DataInputStream sin = new DataInputStream(s.getInputStream());
  31. PrintStream sout = new DataInputStream(s.getInputStream());
  32. // 從控制台讀入字符流
  33. DataInputStream in = new DataInputStream(System.in);
  34. // 返回連接的地址和端口
  35. ystem.out.println("Connected to"+s.getInetAddress()+":"+ s.getPort());
  36. String line;
  37. For(;;)
  38. {
  39. // 顯示提示符
  40. System.out.print(" >");
  41. System.out.flush();
  42. // 讀入控制台輸入的一行字符
  43. line = in.readline();
  44. if (line == null) break;
  45. // 將接收的文本行送至服務器
  46. sout.println(line);
  47. // 從服務器接收一行字符
  48. line = sin.readline();
  49. // Check if connection is closed(i.e. for EOF)
  50. if(line == null)
  51. {
  52. System.out.println("Connection closed by server.");
  53. Break;
  54. }
  55. // 在控制台上顯示接收的字符
  56. System.out.println(line);
  57. }
  58. // End of for loop
  59. }
  60. // End of try
  61. catch(IOException e ) System.err.println(e);
  62. // Always be sure to close the socket
  63. finally
  64. {
  65. try if(s != null) s.close();
  66. catch(IOException e2);
  67. }
  68. } // End of main
  69. } // End of ClIEnt

運行該客戶機程序時,必須以服務器主機名作為第一個參數,服務器端口號為第二個參數,其中服務器端口號可缺省。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved