1. 程式人生 > >java網絡編程學習之——構建基於多線程的網絡通信模型1

java網絡編程學習之——構建基於多線程的網絡通信模型1

傳遞 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,設置端口號為6666
ServerSocket 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