?

計算機網絡課程中網絡編程的教學及實驗設計

2015-03-27 03:03琚生根王相國
實驗技術與管理 2015年6期
關鍵詞:服務器端代碼編程

陳 黎,琚生根,王相國,周 剛

(四川大學 計算機學院,四川 成都 610065)

計算機網絡課程中網絡編程的教學及實驗設計

陳 黎,琚生根,王相國,周 剛

(四川大學 計算機學院,四川 成都 610065)

《計算機網絡》中網絡編程部分的內容一直被理論教學忽視,而網絡編程部分對于學生理解應用層協議及傳輸層的服務有著非常重要的促進作用,同時也可以為后續開設的“計算機網絡編程”課程提供鋪墊。在分析了目前的教學現狀情況下,結合自身的特點對“計算機網絡”課程的網絡編程部分的教學和實驗設計進行了探討,通過對這部分的加強,能夠顯著提高課堂的教學質量,提高學生的動手能力。

socket; 網絡編程; TCP; UDP

我國高校的計算機專業都開設了“計算機網絡”課程,但是目前的教學主要針對各種網絡的理論知識,書中的網絡編程部分往往被忽略。雖然有很多高校后續會開設“網絡編程”課程[1-4],但是學生在學習應用層和傳輸層相關內容的時候會存在一些障礙,例如無法理解基于TCP的傳輸和UDP傳輸具體的差異。而通過網絡編程部分的簡單學習以及相應的課程設計實驗,可以幫助學生更好地理解理論知識,同時為后續“網絡編程”課程提供扎實的鋪墊[5-6]。

1 網絡編程教學設計

四川大學計算機學院使用James F. Kurose的《計算機網絡——自頂向下方法》[7]第4版作為理論課教材,書中在第二章應用層部分介紹了基于java的UDP和TCP網絡編程實例。我們以書中的實例為例介紹在網絡編程教學過程中的教學方法。

1.1 教學內容

書中用了一個非常簡單的實例,介紹了在基于TCP和UDP不同情況下的編程方法。在以該例作為網絡編程的教學過程中,不能只局限在介紹書中的代碼,更重要的是要讓學生理解到TCP和UDP的網絡編程存在的差異,從而有效地了解TCP和UDP的工作原理。實例的協議工作步驟如下[8]:

(1)客戶端從標準輸入(鍵盤)輸入一行字符信息。

(2)將這行字符信息通過客戶端Socket發送到服務器。

(3)服務器通過Socket接收字符信息,將所有的字符轉換成大寫字母。

(4)服務器把轉換后的大寫字符通過Socket發送到服務器。

(5)客戶端收到服務器的信息后,將其在標準輸出(顯示器)上顯示出來。

1.2 基于TCP的網絡編程教學

在分析代碼之前,需要先讓學生了解TCP的基本特點:

(1)TCP在發送之前要求服務器必須先處于監聽的狀態。

(2)TCP在建立TCP連接時,必須指定服務器的地址和端口號。

(3)TCP提供可靠的、有序的字節流進行傳輸。

(4)TCP的傳輸連接是由四元組組成(源IP,源端口,目的IP,目的端口)。

學生了解TCP基本特性以后,以類比的方法進行講解。將管道類比為TCP連接,水流類比為數據流,水桶類比為緩沖區。讓學生理解,水流的傳輸不僅需要管道,還需要有水桶儲存水,同時水流是有方向的,有流入的水,也有流出的水。管道建立好以后,水能夠沿著管道自動流向目的地。因此水在流動的過程中是不需要關心目的地在什么地方的[9],只需要向對應管道里面發送,水會根據預先鋪設的管道來決定其目的地。所以,管道在建立的時候必須要清楚知道目的地,然后發送數據流的時候只需要送到輸出管道,而接收水流的時候只需要到水桶(緩沖區)中提取即可。

1.2.1 基于TCP客戶端編程教學內容設計

在黑板上或幻燈片中分別繪制出客戶端數據流向的過程,如圖1所示。

圖1 基于TCP客戶端數據流向圖

在圖1中,系統的第一個數據流(System.in())將產生系統的第一個管道,將管道流出的數據信息放入到緩沖區InFromUser中存放。對應的代碼為:

·BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in)).

客戶端和服務器進行通信,創建socket,就好像為客戶端數據傳輸打開通信大門,對應代碼為:SocketclientSocket=newSocket(“hostname”,6789); 客戶端創建socket的時候開始進行TCP的3次握手,如果3次握手成功創建連接,則代碼繼續執行后續操作;如果對方服務器未打開服務,則3次握手創建失敗,java將拋出異常,終止后續代碼的執行。

接下來定義客戶端的輸入輸出流,即客戶端為輸入輸出信息架設各種管道。由于服務器發送的數據流從輸入管道進入客戶端,先放入緩沖區緩存,再進行相應處理。對應的代碼為:

·DataOutputStream outToServer = new DataOutputStream ( clientSocket.getOutputStream()); //創建輸出流 ·BufferedReader inFromServer = new BufferedReader(new InputStreamReader ( clientSocket.getInputStream())); //創建輸入流并把輸入流信息放入緩沖區緩存

最后根據協議需求定義客戶端動作,代碼如下:

·sentence = inFromUser.readLine(); ·outToServer.writeBytes(sentence + ′ ′); ·modifiedSentence = inFromServer.readLine(); ·System.out.println(″FROM SERVER:″ + modifiedSentence); ·clientSocket.close();

1.2.2 基于TCP服務器端編程教學內容設計

在黑板上或幻燈片中分別繪制出服務器端數據流向的過程,如圖2所示。

圖2 基于TCP服務器端數據流向圖

首先服務器必須打開服務端口6789,而服務器的監聽端口只負責請求的監聽,因此創建的socket類型和客戶端是不同的。

·ServerSocket welcomeSocket = new ServerSocket(6789);

當請求到來的時候,服務器的welcomeSocket需要接收請求交由connectionsocket負責處理。代碼如下:

Socket connectionSocket = welcomeSocket.accept();

連接建立完成以后,結合圖2講解服務器端的數據的流向。服務器端的數據首先從輸入流流入到服務器。從輸入流接收的數據必須流入到緩存區InFromClient中緩存起來。代碼如下:

·BufferedReader inFromClient =new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

當服務器處理完成數據以后需要送到輸出流,因此在socket上面加入一個輸入流管道outToClient,代碼如下:

·DataOutputStream outToClient =new DataOutputStream(connectionSocket.getOutputStream());

完成數據流向的路徑定義以后,根據協議的需求完成服務器端的動作代碼定義。

·client Sentence = inFromClient.readLine(); ·capitalizedSentence = clientSentence.toUpperCase()+ ′ ′; ·outToClie nt.writeBytes(capitalizedSentence); ·connectionSocket.close();

1.2.3 教學小節

代碼教學完成以后,教師應該對該段代碼分析進行總結和拓展,并以HTTP為例介紹如何拓展到其他的應用層協議。

如果將該段代碼改成Web服務,只需要改動服務器和客戶端的動作代碼,客戶端在發送信息的時候必須將字符信息按照HTTP協議格式的規定進行封裝,而服務器端需要根據HTTP協議的規范對收到的請求報文進行解析,根據要求完成動作以后,將客戶端需要的實體信息發送到outToClient的輸出流中。

1.3 基于UDP的網絡編程教學

首先需要學生了解UDP的特點:

(1)UDP是無連接的傳輸層服務。

(2)UDP是以字節組(datagram)為單位進行傳輸。

(3)UDP根據目的IP和目的端口號進行發送。

由于UDP的特點決定了它和TCP的傳輸存在很大的差異。根據如圖3所示的內容給學生一個總體的印象,了解UDP的數據發送是如何完成的。

該研究顯示,接受宮腹腔鏡子宮肌瘤剔除術治療的實驗組糖尿病子宮肌瘤伴不孕患者,其手術用時、手術出血量、住院時間均明顯低于開腹子宮肌瘤剔除術治療的對照組;實驗組并發癥幾率(5.00%)較對照組并發癥幾率(30.00%)低;實驗組血糖穩定性明顯優于對照組。同時,實驗組子宮幾率殘留率以及子宮肌瘤復發率均明顯低于對照組,其成功妊娠率明顯高于對照組。

圖3 基于UDP的packet發送接收流程圖

1.3.1 基于UDP的客戶端編程

客戶端創建客戶端Socket,為發送打開大門,代碼如下:

·DatagramSocket clientSocket = new DatagramSocket();

UDP客戶端的Socket和TCP的Socket是完全不同的類型,提供的服務也不相同。由于創建Socket時和服務器端無任何聯系,因此,服務器端口是否打開不影響clientSocket的創建,這個和TCP不相同,也體現了其無連接的特性。

UDP的特點是封裝發送和接收的Packet,首先客戶端先發送Packet,因此先構造發送的數據報。

·InetAddress IPAddress=InetAddress.getByName(″hostname"); ·byte;]sendData=new byte;1024]; ·byte;]receiveData=new byte;1024]; ·String sentence=inFromUser.readLine(); ·sendData=sentence.getBytes(); ·DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,9876);

然后通過send()方法即可發送sendPacket。

·clientSocket.send(sendPacket);

當UDP客戶端從Socket中通過receive()方法接收數據的時候,需要構造接收的Packet。

·DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); ·clientSocket.receive(receivePacket);

然后再根據協議的要求,將獲取的Packet通過getData()方法獲取應用層數據內容,并在顯示器顯示修改結果。

·String modifiedSentence = new String(receivePacket.getData()); ·System.out.println("FROM SERVER:" + modifiedSentence);

clientSocket.close();

1.3.2 基于UDP的服務器端編程

UDP服務器端的編程和客戶端的編程方法幾乎是相同的。UDP服務器首先需要打開UDP9876端口提供服務。

·DatagramSocket serverSocket = new DatagramSocket(9876);

UDP服務器端和客戶端的操作是相反的,先接收Packet然后再發生Packet,因此,先定義接收的Packet。

·DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); ·serverSocket.receive(receivePacket);

接下來服務器需要讀取receivePacket中的應用層數據信息,并根據協議需要完成字母轉換成大寫的功能。

·String sentence = new String(receivePacket.getData()); ·String capitalizedSentence = sentence.toUpperCase();

獲取待發送數據以后,需要進行封裝,由于UDP服務器只能通過接收的receivePacket中獲取客戶端的地址信息,為此,服務器需要從receivePacket中獲取發送方的IP地址及端口號。代碼如下:

·InetAddress IPAddress = receivePacket.getAddress(); ·int port = receivePacket.getPort();

接下來封裝sendPacket,然后通過和客戶端相同的方法send()方法發送packet。

·sendData = capitalizedSentence.getBytes(); ·DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,port); ·serverSocket.send(sendPacket);

1.4 課后思考

教科書提供了一道課后思考題可以作為這個代碼完成以后的思考練習,幫助學生進一步理解TCP下的網絡編程和UDP下的網絡編程的差異。

思考題:安裝編譯java的TCPClient和UDPClient在一臺主機,然后將TCPServer和UDPServer安裝在另外一臺主機,回答下面的問題:

(1)假設你在TCPServer之前運行TCPClient,會發生什么事情?

(2)假設你在UDPServer之前運行UDPClient,會發生什么事情?

這2個問題可以讓學生思考答案以后再到機器上將課堂上講解的代碼編譯執行一遍,查看最后的結果和自己思考的結果是否相同。

2 網絡編程實驗設計

代碼的講解結束以后,學生不一定能真正有效地掌握基于java的網絡編程實驗,因此可以給學生設計相應的課程設計。

我們采用的教學方式為,以2~3人為一組,采用組長負責制,完成一個網絡編程的實驗項目[10-11]。以組為單位的目的是希望鍛煉學生的團隊合作能力以及組織能力。完成以后要求小組的組員講解該項目的設計過程,從而鍛煉學生的表達能力。

設計的主要的網絡編程實驗內容見表1[1,12]。

表1 網絡編程實驗的設計

3 結束語

本文針對“計算機網絡”課程理論教學中忽略網絡編程部分教學的問題,提出了相應的強化教學方案以及實驗設計。在實際的教學過程中取得了較好的效果,能夠有效地幫助學生理解應用層協議及傳輸層的工作原理。

References)

[1] 張愛科.面向TCP/IP網絡編程實驗平臺的設計[J].通信技術,2012,45(11):61-63.

[2] 劉琰,常斌.面向能力培養的網絡編程技術課程教學方法探討[J].計算機教育,2010(18):52-55.

[3] 李鵬.網絡編程技術課程的教學改革思路[J].西安郵電學院學報,2010,15(2):166-168.

[4] 任浩,朱培棟,徐明.網絡編程實踐課程的探索[J].計算機教育,2010(23):97-100.

[5] 成衛青,楊哲睿.網絡編程實驗設計與教學研究[J].2010,8(2):99-101.

[6] 向渝,張駿,劉杰彥.《計算機網絡編程》實驗教學的探索[J].實驗科學與技術,2012,10(6):250-252.

[7] James F Kurose,Keith W Ross. 計算機網絡:自頂向下方法[M].北京:高等教育出版社,2009.

[8] 曹麗.基于案例驅動教學法的“計算機網絡編程技術”教學改革研究[J].計算機教學,2013(1):166.

[9] Y.Daniel Liang. Java語言程序設計[M].北京:機械工業出版社,2014.

[10] 朱金秀,陳小剛,朱昌平,等.項目式實驗教學的探索與實踐[J].實驗室研究與探索,2008,27(11):93-95.

[11] 楊瀟瀟,李光文.任務驅動教學法在計算機基礎教學中的應用[J].中國信息技術教育,2010(12):14-15.

[12] 吳雪麗,李建春.網絡編程課程體系構建與優化[J].中國電力教育,2012(10):56-57.

Teaching and experimental design of network programming in Computer Network course

Chen Li,Ju Shenggen,Wang Xiangguo,Zhou Gang

(School of Computer Science,Sichuan University,Chengdu 610065,China)

Network programming of Computer Network is always neglected in theoretical teaching. However, it is very important for students to realize application-layer protocols and transport-layer service which can provide the theory foreshadowing for the subsequent course of Computer Network Programming. Therefore,with the analysis of current education,exploring and reinforcing the teaching and experimental design on Computer Network based on their own characteristics could improve the teaching effect and the students’ operating abilities dramatically.

socket; network programming; TCP,UDP

2014- 06- 10 修改日期:2014- 06- 30

四川大學實驗技術立項資助項目(2013-79);四川大學教改立項(SCUY101);四川大學計算機學院實驗技術立項資助項目

陳黎(1977—),女,四川成都,博士,講師,研究方向為智能信息處理

琚生根(1970—),男,四川成都,博士,副教授,研究方向為智能信息處理、高校實驗室建設及實驗教學研究.

E-mail:cl@scu.edu.cn

TP393;G642.423

A

1002-4956(2015)5- 0217- 04

猜你喜歡
服務器端代碼編程
編程,是一種態度
元征X-431實測:奔馳發動機編程
Linux環境下基于Socket的數據傳輸軟件設計
編程小能手
紡織機上誕生的編程
創世代碼
創世代碼
創世代碼
創世代碼
淺析異步通信層的架構在ASP.NET 程序中的應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合