201621123061《Java課程設計》第13次學習總結

1. 本週學習總結

以你喜歡的方式(思惟導圖、OneNote或其餘)概括總結多網絡相關內容。javascript

  • 網絡:IP+端口
  • Socket:套接字,對從Socket對象中得到的流進行操做,便可進行網絡通訊。
  • ServerSocket類爲服務器程序提供了監聽客戶端的功能,並與他們創建創建TCP鏈接。
  • TCP:通訊前需先創建鏈接,傳輸數據較爲可靠,但開銷大。UDP:通訊前不須要創建鏈接,可直接發送數據,相對不可靠,但速度快,開銷小。

2. 爲你的系統增長網絡功能(購物車、圖書館管理、鬥地主等)-分組完成

爲了讓你的系統能夠被多個用戶經過網絡同時使用,須要爲你的系統增長網絡功能。java

2.1 簡述你想爲你的系統增長什麼網絡功能?設計思路是什麼?

驗證在登陸時讀者的信息是否正確,服務器正確時則將登陸成功的信息返回客戶端,不正確則返回false。
服務器端不斷監聽一個接口,客戶端採用多線程,在讀者登陸客戶端時利用流的方式和服務器端鏈接。編程

2.2 系統經過網絡傳遞了什麼信息?信息的格式是什麼?

讀者的帳戶信息。
二進制。小程序

2.3 你的網絡模塊使用了TCP仍是UDP技術?模塊中的經常使用類是什麼?

TCP
經常使用的類:Socket、ServerSocket、Thread、ObjectInputStream、InputStream瀏覽器

2.4 截圖網絡通信部分的源代碼,並進行簡單說明。

public class SocketThread extends Thread {
    private Socket socket;
    private static AllReaders allReaders = new AllReaders();
    public SocketThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        try {
            InputStream inputStream = socket.getInputStream();
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            Reader reader = (Reader) objectInputStream.readObject();
            OutputStream outputStream;
            PrintWriter printWriter;

            if(allReaders.isReader(reader.getId(), reader.getPassword()) == true)
            {
                System.out.println("已收到讀者(ID:"+reader.getId()+"),此客戶端IP爲:"+socket.getInetAddress().getHostAddress());
                outputStream = socket.getOutputStream();
                printWriter = new PrintWriter(outputStream);// 將輸出流包裝成打印流
                printWriter.print("true");
                printWriter.flush();
                socket.shutdownOutput();// 關閉輸出流
            }
            else
            {
                outputStream = socket.getOutputStream();
                printWriter = new PrintWriter(outputStream);
                printWriter.print("false");
                printWriter.flush();
                socket.shutdownOutput();
            }
        

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } 

    }

}

2.5 選作:系統中有出現多線程的衝突或者同步問題嗎?

3. 碼雲與PTA

3.1 統計本週完成的代碼量

周次 行數 新增行數 文件數 新增文件數
1 91 91 5 5
2 504 413 18 13
3 1092 588 28 10
5 1158 129 34 6
6 1539 381 40 6
7 2023 484 49 9
8 2477 454 57 8
9 2709 232 63 6
10 3156 447 70 7
11 3531 375 79 9
12 4083 552 91 12
13 4850 106 15
12 5700 850 118 12

須要將每週的代碼統計狀況融合到一張表中。服務器

4. 網絡學習指導(如下做業內容均爲選作)

1. 網絡基礎

1.1 比較ping www.baidu.com與ping cec.jmu.edu.cn,分析返回結果有何不一樣?爲何會有這樣的不一樣?



ping www.baidu.com耗時較長,並且數據包有丟失;ping www.baidu.com耗時較短,並且數據包無丟失.這是由於前者在廣州,距離遠,由於數據落地傳輸,所以耗時長,然後者在廈門距離很近,因此耗時更短。網絡

1.2 telnet bbs.newsmth.net,上面這條命令鏈接的是遠程主機的什麼端口號?

23
多線程

1.3 telnet cec.jmu.edu.cn 80,嘗試回答:你從屏幕看到一些什麼內容?返回的內容是否是cec.jmu.edu.cn的主頁內容?嘗試使用GET /index HTTP/1.0命令,會返回什麼?詳見實驗任務書題目1。

執行 telnet cec.jmu.edu.cn 80後看到黑屏,但有光標。並非cec.jmu.edu.cn的主頁內容

返回網頁的數據。socket

1.4 啓動ConnectionWatcher, 而後啓動若干個能夠聯網的程序(如QQ, telnet,瀏覽器等),查看本機上有什麼程序聯網,使用了什麼端口?QQ佔用了什麼端口和那些遠程IP進行交互,這些IP分佈地在那裏?使用了什麼協議進行通訊?

聯網的程序:qq,Google瀏覽器,TeamViewer等。端口如上圖。qq佔用端口:5161五、51400。IP分佈在深圳等,協議是TCP。tcp

1.5 編寫網絡程序必不可少的幾個信息是什麼?

ip、端口、域名、協議。利用域名解析出ip地址,利用ip地址找到主機,利用協議創建某種聯繫,經過端口肯定主機的某種服務。

2. 編寫TCP客戶端程序

2.1 參照SocketTest.java編寫一個簡單的鏈接遠程服務器小程序Client.java,能夠接收並顯示服務器發送的信息。啓動時須要首先在控制檯指定遠程主機IP與端口號。(截圖,出現本身學號)。

2.2 將程序中的網址改爲bbs.newsmth.net,端口號改成23,再次觀察返回結果?嘗試執行telnet bbs.newsmth.net 23,對比返回結果。



顯示內容同樣,只不過一個是黑白一個是彩色的

2.3 將程序中的網址改爲cec.jmu.edu.cn,端口號改成80進一步觀察返回結果。沒有任何返回結果,爲何?怎麼修改代碼才能正常顯示?選作:爲何會返回亂碼?如何解決?

要發送GET請求才能返回網頁內容,在本題中只有創建鏈接,沒有發送請求。
修改後代碼:

2.4 啓動網絡調試助手,將其設置爲TCP Server,並啓動,以下圖所示(做業中不要出現下圖)

嘗試使用Client.java鏈接該TCP Server,使用該服務器向Client發送信息。(截圖關鍵代碼與運行結果)
參見2.1

2.5 回答:如今的Client.java只能接收信息,可否改造Client.java使其能夠與服務器進行交互(服務器能夠發送信息給Client,Client也可發送信息給服務器),寫出大概思路,不要運行截圖。

建立兩個線程,一個用來接收消息,一個來接受消息。

2.6 選作:實現2.5。截取關鍵代碼並進行說明。

public class SocketTest {
    public static void main(String[] args) throws UnknownHostException, IOException {
        
            Socket s = new Socket("127.0.0.1", 80);
            Runnable r1=new Output(s);
            Runnable r2=new Input(s);
            Thread t1=new Thread(r1);
            Thread t2=new Thread(r2);
            t1.start();
            t2.start();
    }
}

class Output implements Runnable{
    private Socket out;
    public Output(Socket out){
        this.out=out;
    }
    @Override
    public void run() {
        
        OutputStream os=null;
        Scanner sc=new Scanner(System.in);
        try{
            os=out.getOutputStream();
            PrintWriter pw=new PrintWriter(os,true);
            while(sc.hasNextLine()){
                String str=sc.nextLine();
                pw.println(str);
            }
        }catch(Exception e){
            System.out.println(e);
        }
    }
}


class Input implements Runnable{
    private Socket in;
    public Input(Socket in){
        this.in=in;
    }
    @Override
    public void run() {     
        InputStream is=null;        
        try{
            is=in.getInputStream();
            Scanner sc=new Scanner(is);
            
            while(sc.hasNextLine()){
                String str=sc.nextLine();
                System.out.println(str);
            }
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

3. ServerSocket與TCP服務器

3.1 簡易單線程MenuServer,題目3.1-3.4。(關鍵代碼及運行截圖,包含學號)可使用網絡調試助手,將其設置爲TCP Client(IP與端口填你的MenuServer的IP與端口),鏈接你的MenuServer。其中的文件搜索功能爲選作。

3.2 多線程MenuServer(截取關鍵代碼證實你這個是多線程服務器,請使用多個telnet鏈接測試)。

  1. UDP服務器

4.1 改造3.1或3.2,將其改形成基於UDP的MenuServer。(區別題目3的TCP服務器的關鍵代碼,需截大圖、包含學號,不要截圖運行界面)。可使用網絡調試助手模擬UDP客戶端,將其設置爲UDP,要填本機IP與端口也要填遠程服務器的IP與端口。
4.2 對比相應的基於TCP的MenuServer,主要有何不一樣?爲了鏈接多個客戶端,必定要經過多線程技術嗎?若是不使用,怎麼區分不一樣的客戶端呢?

. 論述題:網絡程序與流

5.1 前面編寫的程序用到了大量的流的相關知識。簡述,編寫網絡程序時應當選擇什麼樣的流?Java網絡編程、流之間的關係。任選一場景描述,場景如:簡單的文字聊天、文件傳輸、應用層協議服務器,如QQ、聊天室、網絡遊戲。

相關文章
相關標籤/搜索