java網絡編程學習之——構建基於多線程的網絡通信模型1
阿新 • • 發佈:2017-08-08
傳遞 println util adl 多個 start oid stream 數值
該例展示了多用戶/服務器通信模型,包含三個文件:Server.java ServerThread.java 和Client.java類。其中ServerThread類支持多線程,為客戶提供的所有操作都封裝到該類中,該類的構造方法ServerThread(Socket socket)接收一個套接字對象,用來與客戶進行數據通信。Server類是一個應用程序,其main方法中通過一個無限的whlie循環,等待並監聽多個用戶連接請求(本例中只演示了一個客戶請求),每個客戶的連接都由服務器端的一個單獨線程來處理,如此可實現多用戶機/服務器之間的通信。
Server類的代碼如下:
import java.io.IOException;import java.net.ServerSocket; import java.net.Socket; /** * Server類接收客戶端的套接字請求,然後創建一個ServerThread線程來處理請求 * @author Administration * */ public class Server { public static void main(String[] args) { System.out.println("等待連接。。。"); try { //1.創建一個套接字對象serverSocket,設置端口號為6666ServerSocket serverSocket = new ServerSocket(6666); Socket clientSocket = null; //2.監聽套接字響應,一旦獲得相應,則新建一個Serverhread類來處理這個響應 while(true) { clientSocket = serverSocket.accept();//監聽 new ServerThread(clientSocket); } }catch (IOException e) { e.printStackTrace(); } } }
ServerThread類的代碼如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class ServerThread extends Thread { //客戶端靠套接字 private Socket clientSocket = null; //客戶端輸入流 private InputStream clientInput = null; //客戶端輸出流 private OutputStream clientOutput = null; //1.首先從構造方法中獲得客戶端的套接字請求,創建向客戶端輸入和輸出的流,啟動線程指執行接下來的請求 public ServerThread(Socket socket) throws IOException { clientSocket = socket; clientInput = clientSocket.getInputStream(); clientOutput = clientSocket.getOutputStream(); this.start(); } //2.線程啟動後,通過緩沖流來獲取從客戶端傳來的數據並進行分析,如果傳過來的是“over”,則終止線程並關閉端口; //反之,則計算從客戶端傳過來的數值對應於正方形邊長的面積,並將返回結果返回客戶端,之後關閉端口 public void run() { try { //構建緩沖輸入流,獲取客戶端傳過來的數據 BufferedReader bufReader = new BufferedReader(new InputStreamReader(clientInput)); //按行讀取輸入流內容(數據) String strLine = bufReader.readLine(); //判斷輸入流數據 if("OVER".equalsIgnoreCase(strLine)) { //創建輸出流,傳遞“over”信息,表示連接結束 PrintWriter printWriter = new PrintWriter(clientOutput,true); printWriter.println("連接OVER"); }else { //輸入正方形邊長,並輸出邊長及面積 double side = Double.parseDouble(strLine); side = Double.parseDouble(strLine); System.out.println("Side of Square Received:"+side); double squareArea = side*side; String str = "Side:"+side+"Square:"+squareArea; //創建輸出流向客戶端傳遞運算結果 PrintWriter printWriter = new PrintWriter(clientOutput,true); printWriter.println(str); System.out.println("Finish sending to client!"); } } catch (IOException e) { e.printStackTrace(); }finally { //關閉流和端口 try { clientInput.close(); clientOutput.close(); clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
客戶端Client類代碼如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; /** * 客戶端類 * @author Administration * */ public class Client { public static void main(String[] args) { Socket socket = null; try { //1.根據端口號創建與服務器端的連接 socket = new Socket("127.0.0.1",6666); //2.客戶端從獲取用戶在控制臺輸入的信息 //通過Scanner獲取鍵盤輸入的值 System.out.println("Input Side:"); Scanner keyInput = new Scanner(System.in); //按行讀取鍵盤輸入 String strLine = keyInput.nextLine(); //3.創建客戶端的輸入流和輸出流,將用戶輸入的信息發送到服務器端,之後再接收來自服務器端的運算結果 //獲取服務器輸入流 OutputStream outputStream = socket.getOutputStream(); //獲取服務器輸出流 InputStream inputStream = socket.getInputStream(); //通過PrintWriter輸出流向服務器傳數據 PrintWriter printWriter = new PrintWriter(outputStream,true); printWriter.println(strLine); BufferedReader bufdReader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println(bufdReader.readLine()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { //4.關閉套接字和流 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
服務器端的運行結果:
等待連接。。。 Side of Square Received:5.0 Finish sending to client!
客戶端的運行結果:
Input Side: 5 Side:5.0 Square:25.0
java網絡編程學習之——構建基於多線程的網絡通信模型1