手動搭建I/O網絡通訊框架1:Socket和ServerSocket入門實戰,實現單聊

資料:慕課網html

  第二章:手動搭建I/O網絡通訊框架2:Socket和ServerSocket入門實戰,實現單聊java

   這個基礎項目會做爲BIO、NIO、AIO的一個前提,後面會有數篇博客會基於這個小項目利用BIO、NIO、AIO進行改造升級。服務器

  簡單的說一下io,瞭解的直接跳過看代碼吧:IO常見的使用場景就是網絡通訊或讀取文件等方面。IO流分爲字節流和字符流。字節即Byte,包含八位二進制數,一個二進制數就是1bit,中文名稱叫位。字符即一個字母或者一個漢字。一個字母由一個字節組成,而漢字根據編碼不一樣由2個或者3個組成。Java.io包以下:詳細的API可自行查閱資料網絡

  

 

  Socket定義套接字(socket)是一個抽象層,應用程序能夠經過它發送或接收數據,可對其進行像對文件同樣的打開、讀寫和關閉等操做。套接字容許應用程序將I/O插入到網絡中,並與網絡中的其餘應用程序進行通訊。網絡套接字是IP地址與端口的組合。框架

  能夠理解爲兩臺機器或進程間進行網絡通訊的端點,這個端點包含IP地址和端口號。socket

  Socket和ServerSocket區別就如其名字同樣,簡單地說ServerSocket做用在服務端,用以監聽客戶端的請求。Socket做用在客戶端和服務端,用以發送接收消息。可是就像上面說的,它們都要包含一個IP地址和端口號。post

  Socket和ServerSocket實戰:

  首先建立一個最普通的Java項目。而後建立兩個類,Server和Client。其代碼和註釋以下,仔細看下注釋和代碼,仍是比較簡單的ui

  服務器只能爲一個客戶端服務,一旦監聽到客戶端的請求,就會一直被這個客戶端佔用。編碼

public class Client {
    public static void main(String[] args) {
        //這是服務端的IP和端口
        final String DEFAULT_SERVER_HOST = "127.0.0.1";
        final int DEFAULT_SERVER_PORT = 8888;
        //建立Socket
        try (Socket socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT)) {
            //接收消息
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream())
            );
            //發送消息
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())
            );
            //獲取用戶輸入的消息
            BufferedReader userReader = new BufferedReader(
                    new InputStreamReader(System.in)
            );
            String msg = null;
            //循環的話客戶端就能夠一直輸入消息,否則執行完try catch會自動釋放資源,也就是斷開鏈接
            while (true) {
                String input = userReader.readLine();
                //寫入客戶端要發送的消息。由於服務端用readLine獲取消息,其以\n爲終點,因此要在消息最後加上\n
                writer.write(input + "\n");
                writer.flush();
                msg = reader.readLine();
                System.out.println(msg);
                //若是客戶端輸入quit就能夠跳出循環、斷開鏈接了
                if(input.equals("quit")){
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  

public class Server {
    public static void main(String[] args) {
        final int DEFAULT_PORT = 8888;
        //建立ServerSocket監聽8888端口
        try (ServerSocket serverSocket = new ServerSocket(DEFAULT_PORT)) {
            System.out.println("ServerSocket Start,The Port is:" + DEFAULT_PORT);
            while (true) {//不停地監聽該端口
                //阻塞式的監聽,若是沒有客戶端請求就一直停留在這裏
                Socket socket = serverSocket.accept();
                System.out.println("Client[" + socket.getPort() + "]Online");
                //接收消息
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream())
                );
                //發送消息
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())
                );

                String msg = null;
                while ((msg = reader.readLine()) != null) {
                    System.out.println("Client[" + socket.getPort() + "]:" + msg);
                    //寫入服務端要發送的消息
                    writer.write("Server:" + msg + "\n");
                    writer.flush();
                    //若是客戶端的消息是quit表明他退出了,並跳出循環,不用再接收他的消息了。若是客戶端再次鏈接就會從新上線
                    if (msg.equals("quit")) {
                        System.out.println("Client[" + socket.getPort() + "]:Offline");
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  而後打開兩個命令終端,經過javac編譯後,一個運行Server表明服務器,一個運行Client表明客戶端。url

 

下一篇:基於BIO進行升級改造,打造羣聊聊天室。

相關文章
相關標籤/搜索