Java程序設(shè)計教程 (任務(wù)驅(qū)動式) 課件 模塊7、8 圖形用戶界面程序設(shè)計、網(wǎng)絡(luò)通信程序設(shè)計_第1頁
Java程序設(shè)計教程 (任務(wù)驅(qū)動式) 課件 模塊7、8 圖形用戶界面程序設(shè)計、網(wǎng)絡(luò)通信程序設(shè)計_第2頁
Java程序設(shè)計教程 (任務(wù)驅(qū)動式) 課件 模塊7、8 圖形用戶界面程序設(shè)計、網(wǎng)絡(luò)通信程序設(shè)計_第3頁
Java程序設(shè)計教程 (任務(wù)驅(qū)動式) 課件 模塊7、8 圖形用戶界面程序設(shè)計、網(wǎng)絡(luò)通信程序設(shè)計_第4頁
Java程序設(shè)計教程 (任務(wù)驅(qū)動式) 課件 模塊7、8 圖形用戶界面程序設(shè)計、網(wǎng)絡(luò)通信程序設(shè)計_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第7章

圖形用戶界面程序設(shè)計

教學(xué)導(dǎo)航教學(xué)目標了解Swing實現(xiàn)多文檔界面應(yīng)用程序的組件熟悉Swing的常用容器類組件、基本組件、對話框及相關(guān)方法熟悉容器中組件的合理布局方法熟練掌握在ApacheNetBeansIDE的可視化環(huán)境中設(shè)計窗口與添加組件的方法掌握事件監(jiān)聽的實現(xiàn)方法學(xué)會創(chuàng)建JFrame窗口、在JFrame窗口中添加組件學(xué)會在JFrame窗體中創(chuàng)建并使用菜單、快捷菜單學(xué)會在JFrame窗體中創(chuàng)建并使用工具欄學(xué)會應(yīng)用JTable組件設(shè)計JavaGUI應(yīng)用程序

教學(xué)導(dǎo)航教學(xué)重點Swing的常用組件及其相關(guān)方法創(chuàng)建JFrame窗口、在JFrame窗口中添加組件容器中組件的合理布局方法事件監(jiān)聽的實現(xiàn)方法在JFrame窗體中創(chuàng)建并使用菜單、快捷菜單在JFrame窗體中創(chuàng)建并使用工具欄在ApacheNetBeansIDE的可視化環(huán)境中設(shè)計窗口與添加組件

身臨其境Windows10自帶的計算器界面如圖7-1所示,該界面包含多個按鈕、1個標簽等組件。QQ登錄界面如圖7-2所示,該界面包含圖片、標簽、下拉列表框、密碼輸入框、復(fù)選框、登錄按鈕等組件。Windows照片查看器界面如圖7-3所示,該界面包括多個菜單、多個工具按鈕。圖7-1

Windows10自帶的計算器界面

圖7-2

QQ登錄界面圖7-3

Windows照片查看器界面

前導(dǎo)知識【知識7-1】比較Swing和AWT

抽象窗口工具箱(AbstractWindowToolkjt,AWT)和Swing分別是Java為開發(fā)GUI提供的第一代和第二代技術(shù)。Swing不但用輕量級組件代替了AWT中的重量級組件,而且提供了比AWT更加豐富的組件,還增加了很多新的特性與功能。Swing是Java基礎(chǔ)類庫(JavaFoundationClasses,JFC)的一個重要組成部分,它不僅提供了豐富的組件,還提供了獨立于運行平臺的GUI架構(gòu),并且在不同的平臺上都能夠具有一致的顯示風格。Swing組件是在AWT組件基礎(chǔ)上發(fā)展起來的新型GUI組件。Swing組件的名稱都以字母“J”開頭,很多組件的名稱是在同類AWT組件的名稱前增加了一個字母“J”,如JButton和JPanel等。Swing組件位于javax.swing包中,AWT組件位于java.awt包中。Swing組件是AWT組件的Container類的直接子類或間接子類,Container類是用來管理相關(guān)組件的類,所有Swing組件都是JComponent類的子類。Swing組件必須添加到容器組件中才可以在用戶界面中顯示。Swing組件都具有setEnable(booleanb)方法,當組件對象調(diào)用該方法且參數(shù)值為true時組件被啟用,否則組件被禁用。

前導(dǎo)知識【知識7-2】認知Swing組件的分類

Swing組件從功能上可分為如下幾類。(1)頂層容器包括JFrame、JWindow、JDialog和JApplet。頂層容器為其他組件的顯示與事件處理提供支持。(2)中間容器包括JPanel、JScrollPane、JSplitPane、JMenuBar、JToolBar。JPanel較常用,能夠通過布局來排列其內(nèi)部組件。JScrollPane與JPanel類似,可以提供滾動條。JSplitPane是一種分割面板,可以將組件分成上下或左右兩個部分。JMenuBar是一個菜單容器,用于建立菜單欄。JToolBar為按行或列排列的一組組件。(3)基本組件是實現(xiàn)人機交互的主要組件,如JButton、JTextField、JComboBox、JList、JMenu、JSlider等。(4)可編輯組件是給用戶顯示能被編輯格式化信息的組件,如JTextArea、JTable、JFileChooser、JColorChooser等。(5)不可編輯組件是給用戶顯示不可編輯信息的組件,如JLable、JProgressBar等。除了JPanel外,其他的Swing容器不允許把組件直接加入容器,JPanel及其子類可以直接添加組件。其他容器添加組件的方式有如下兩種。(1)使用getContentPane()方法獲得內(nèi)容面板,并將組件加入內(nèi)容面板,示例代碼如下。jframe.getContentPane().add(jlabel);也可以將內(nèi)容面板添加到窗口容器中,示例代碼如下。jframe.add(chileComponent);(2)建立一個JPanel或JDesktopPane之類的中間容器,把組件添加到中間容器中,并使用setContentPane()方法把中間容器設(shè)置為內(nèi)容面板,示例代碼如下。JPanelcontentPane=newJPanel();

jframe.setContentPane(contentPane);

前導(dǎo)知識【知識7-3】認知Swing的常用容器類組件及其相關(guān)方法Swing的常用容器類組件包括JFrame、JWindow、JPanel、JScrollPane、JSplitPane和JToolBar這6種。(1)JFrame組件(Component)是JavaGUI最基本的組成部分,是一個可以用圖形化方式顯示在屏幕上并且能夠與用戶進行交互的對象,如JButton、JLable等。但是組件不能獨立顯示,必須將組件放在一個容器中才能顯示出來。容器是用來組織其他圖形界面元素的基礎(chǔ)組件。容器內(nèi)部可以包含許多其他組件,也可以包含另一個容器。所有的容器類都是Container類的子類。Java應(yīng)用程序一般以一個JFrame對象作為主窗口,JFrame屬于頂層容器組件,JFrame類包含通用窗口的基本功能,如最小化窗口、移動窗口、重新設(shè)定窗口大小等。JFrame作為頂層容器,不能被其他容器包含,但可以被其他容器創(chuàng)建并彈出成為獨立的容器。(2)JWindowJWindow可以構(gòu)造無邊框的窗口(3)JPanelJPanel組件屬于中間容器,用于將小型的輕量級組件組合在一起。(4)JScrollPaneJScrollPane組件是帶滾動條的面板,除了具有滾動條以外,該組件還可以設(shè)置表頭名稱、邊角圖案與ScrollPane外框,相比于JPanel,JScrollPane具有更強的靈活性。(5)JSplitPaneJSplitPane組件一次可將兩個組件同時顯示在兩個顯示區(qū)中。如果想要同時在多個顯示區(qū)顯示組件,則必須同時使用多個JSplitPane組件。JSplitPane組件提供了兩個參數(shù)來設(shè)置水平分割(HORIZONTAL_SPLIT)和垂直分割(VERTICAL_SPLIT)。(6)JToolBarJToolBar是一個顯示一組動作、命令或功能的組件,一般工具欄中的組件都是帶圖標的按鈕,可以使用戶更加方便地選擇所需的功能。

前導(dǎo)知識【知識7-4】認知Swing的基本組件及其相關(guān)方法Swing的基本組件包括標簽(JLabel)、文本域(JTextField)、密碼文本框(JPasswordField)、文本域(JTextArea)、按鈕(JButton)、單選按鈕(JRadioButton)、復(fù)選框(JCheckBox)和組合框(JComboBox)這8種。(1)JLabelJLabel是其內(nèi)容只能瀏覽但不能修改的組件,可以用于顯示文字,也可以用于顯示圖標,一般為用戶提供相關(guān)的提示信息。(2)JTextFieldJTextField用于顯示或編輯單行文本,但不能顯示或編輯多行文本。(3)JPasswordFieldJPasswordField類是JTextField類的子類,可以使用JTextField類的方法。該組件常用于輸入密碼,在JPasswordField組件中輸入的文字會被其他字符(如“*”)替代。(4)JTextAreaJTextArea組件用于顯示或編輯多行文本。(5)JButtonJButton是GUI應(yīng)用程序中非常重要的一種組件,當用戶單擊按鈕時,將會自動執(zhí)行與該按鈕關(guān)聯(lián)的程序,從而實現(xiàn)預(yù)定的功能。(6)JRadioButtonJRadioButton類和JCheckBox類是JToggleButton的子類,JRadioButton類可以實現(xiàn)“多選一”的操作,即在一組單選按鈕中選擇其中一個。它們可以使用AbstractButton抽象類中的多個方法,如addItemListener()、setText()、isSelected()等。因為單選按鈕是在一組按鈕中選擇一個,所以必須將單選按鈕分組,即指明一個組中包含哪些單選按鈕,在IDE中可以通過屬性窗口的buttonGroup屬性將單選按鈕加入單選按鈕組。(7)JCheckBoxJCheckBox組件可以實現(xiàn)在一組在復(fù)選框中選擇多個復(fù)選框的操作。

前導(dǎo)知識【知識7-5】認知Swing的對話框及其相關(guān)方法對話框是一種類似窗口的容器,與一般窗口的區(qū)別在于它依賴于其他窗口(當它所依賴的窗口消失或最小化時,對話框也消失;窗口還原時,對話框又會自動恢復(fù))。對話框還具有模態(tài)特性。(1)JDialog對話框JDialog對話框是有邊框、有標題的頂層容器。對話框分為模態(tài)對話框和非模態(tài)對話框。模態(tài)對話框只讓程序響應(yīng)對話框內(nèi)的事件,對對話框以外的事件程序不響應(yīng);非模態(tài)對話框可以讓程序響應(yīng)對話框以外的事件。(2)JOptionPane對話框使用JDialog組件來制作對話框時,需要建立對話框中的每一個組件。有時候?qū)υ捒蛑皇秋@示一段文字,或一些簡單選擇(是或否),這時利用JOptionPane組件更方便,并且可以達到和使用JDialog組件同樣的效果。利用javax.swing包中的JOptionPane類提供的靜態(tài)方法可以創(chuàng)建各種類型的簡單對話框,包括Message對話框、Confirm對話框和input對話框,這些對話框還可以在建立時通過設(shè)置不同參數(shù)而產(chǎn)生不同的效果。

前導(dǎo)知識【知識7-6】認知Swing實現(xiàn)多文檔界面應(yīng)用程序的組件多文檔界面(MultipleDocumentInterface,MDI)應(yīng)用程序只有一個父窗口,子窗口在父窗口內(nèi)顯示。在父窗口內(nèi)建立一個桌面面板(JDesktopPane)作為桌面,通過繼承JInternalFrame類建立子窗口。子窗口可在父窗口內(nèi)打開、關(guān)閉、最大化和最小化。(1)桌面面板桌面面板是一種特殊的層面板,用來建立虛擬桌面,它可以顯示并管理眾多內(nèi)部窗口的層次關(guān)系。桌面面板的構(gòu)造方法為JDesktopPane()。(2)內(nèi)部窗口內(nèi)部窗口(JInternalFrame)的使用與JFrame相似,可以設(shè)置最大化、最小化、關(guān)閉、添加菜單等功能。不同的是JInternalFrame不能單獨出現(xiàn),必須依附在上層組件上,一般加入JDesktopPane進行管理。7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-1-1

設(shè)計用戶登錄窗口【任務(wù)描述】

創(chuàng)建1個用戶登錄窗口,具體要求如下。設(shè)置窗口風格為Windows風格。設(shè)置窗口標題為“用戶登錄”。設(shè)置窗口的寬度為300px、高度為150px。設(shè)置窗口圖標為QQ1.gif??刂拼翱谖挥谄聊恢行奈恢谩?刂拼翱谝频阶钋啊TO(shè)置窗口可見。設(shè)置關(guān)閉行為:當窗口關(guān)閉時,隱藏并處理該窗口。任務(wù)7-1-2

在用戶登錄窗口中添加JLabel組件【任務(wù)描述】

創(chuàng)建1個用戶登錄窗口,創(chuàng)建1個標簽對象,將標簽添加到窗口容器中?!局R7-7】在JFrame窗體中添加組件在Swing中,JPanel組件及其子類可以直接添加組件,在容器中添加組件有以下兩種方式。(1)使用getContentPane()方法獲取內(nèi)容面板,并將標簽加入組件。在容器中添加組件的代碼如下。JFrameframe=newJFrame();ContainerobjContainer=frame.getContentPane()

;

//獲取內(nèi)容面板objContainer.add(組件對象)

;

//將標簽添加到內(nèi)容面板中也可以寫成如下形式。frame.getContentPane().add(組件對象)

;

(2)建立一個JPanel之類的中間容器,把組件添加到中間容器中,并使用setContentPane()方法把該容器設(shè)置為內(nèi)容面板。示例代碼如下。JFrameframe=newJFrame()

;JPaneljp=newJPanel()

;jp.add(組件對象);frame.setContentPane(jp)

;

//把jp設(shè)置為內(nèi)容面板任務(wù)7-1-3

運用手動布局方式對用戶登錄窗口中的組件進行布局【任務(wù)描述】

創(chuàng)建1個用戶登錄窗口,在該窗口容器中添加4個標簽對象、1個文本字段組件、1個口令字段組件和2個按鈕組件,運用手動布局方式布局窗口中的組件并設(shè)置組件的大小。【知識7-8】對窗體中的組件進行布局Java為了實現(xiàn)跨平臺的特性并且獲得動態(tài)的布局效果,將容器內(nèi)所有組件安排給一個布局管理器管理,并將組件的排列順序、大小、位置等功能授權(quán)給對應(yīng)的布局管理器管理。不同的布局管理器使用不同的算法和策略。容器可以通過選擇不同的布局管理器來設(shè)置組件的布局方式。布局管理器主要包括FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout。另外,可以使用手動布局方式布局組件。手動布局方式直接定義了組件的位置和大小,即先將一個容器的布局設(shè)置為空布局(null),再使用setBounds(intx,inty,intwidth,intheight)方法設(shè)置組件在容器中的位置和大小。1.Java的布局方式(1)流式布局使用流式布局(FlowLayout)時,組件從左上角開始,按從左到右、從上到下的方式排列。這種布局方式在默認情況下,組件居中,間距為5px,是內(nèi)容面板和Applet的默認布局方式。(2)邊框布局使用邊框布局(BorderLayout)時,組件被置于容器的東、南、西、北、中的位置。這種布局方式是JFrame、JWindow和JDialog等對象的默認布局方式。任務(wù)7-1-3

運用手動布局方式對用戶登錄窗口中的組件進行布局【知識7-8】對窗體中的組件進行布局(3)網(wǎng)格布局使用網(wǎng)格布局(GridLayout)時,將容器區(qū)域劃分為一個矩形網(wǎng)格,組件按行和列排列。當所有的組件大小相同時,可以使用網(wǎng)格布局。網(wǎng)格布局以行為基準,按行優(yōu)先順序排列,在組件數(shù)目較多時自動擴展列,在組件數(shù)目較少時自動收縮列。網(wǎng)格布局的行數(shù)始終不變。(4)卡片布局使用卡片布局(CardLayout)時,組件會像卡片一樣排列,多個組件擁有同一個顯示區(qū)域,但同一時刻只能顯示一個組件。(5)網(wǎng)格袋布局網(wǎng)格袋布局(GridBagLayout)與網(wǎng)格布局類似,也在網(wǎng)格中定位組件,不同的是,網(wǎng)格袋組件不顯示規(guī)定網(wǎng)格中的行數(shù)和列數(shù),而是根據(jù)它布局的組件的約束條件確定行數(shù)和列數(shù),并且允許組件跨越多個網(wǎng)格單元。2.Java的空隙類進行組件布局時,還可以使用空隙類設(shè)置組件之間的間距,使組件顯示效果更好。(1)定義方形空隙Componentcomponent=Box.createRigidArea(size);(2)定義水平空隙Componentcomponent=Box.createHorizontalGlue(size);(3)定義垂直空隙Componentcomponent=Box.createVerticalStrut(size);7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-1-3

運用響應(yīng)動作事件實現(xiàn)用戶登錄功能并使用對話框【任務(wù)描述】

參考程序Example7_3.java創(chuàng)建1個用戶登錄窗口,該窗體類繼承自JFrame類,并實現(xiàn)ActionListener監(jiān)聽接口。在窗體類的構(gòu)造方法中注冊【取消】按鈕btnCancel的動作事件監(jiān)聽者為當前對象。編寫動作事件處理方法actionPerformed()的程序代碼來響應(yīng)用戶的單擊操作,并在代碼中使用對話框輸出提示信息?!局R7-9】認知事件監(jiān)聽與響應(yīng)動作事件Java處理事件響應(yīng)基本沿用AWT的事件類和監(jiān)聽接口,盡管Swing也定義了事件類和監(jiān)聽接口,但普遍使用的還是AWT的事件類和監(jiān)聽接口?;镜氖录幚硎褂胘ava.awt.event包中的類實現(xiàn),同時javax.swing.event包中增加了一些新的事件類和監(jiān)聽接口。AWT事件類都是從AWTEvent繼承來的,常用的事件有窗口事件(WindowEvent)、鼠標事件(MouseEvent)、鍵盤事件(KeyEvent)、焦點事件(FocusEvent)、動作事件(ActionEvent)、項目事件(ItemEvent)、文本事件(TextEvent)等。任務(wù)7-1-3

運用響應(yīng)動作事件實現(xiàn)用戶登錄功能并使用對話框【知識7-9】認知事件監(jiān)聽與響應(yīng)動作事件事件監(jiān)聽接口、適配器響應(yīng)方法事件源窗口事件WindowListener、WindowAdapterwindowOpened(WindowEvente)、windowActivated(WindowEvente)、windowClosing(WindowEvente)、windowClosed(WindowEvente)、windowDeactivated(WindowEvente)、windowDeiconified(WindowEvente)、windowIconified(WindowEvente)Window鼠標事件MouseListener、MouseAdaptermouseClicked(MouseEvente)、mouseEntered(MouseEvente)、mouseExited(MouseEvente)、mousePressed(MouseEvente)、mouseReleased(MouseEvente)JComponentMouseMotionListenermouseDragged(MouseEvente)、mouseMoved(MouseEvente)JComponent鍵盤事件KeyListener、KeyAdapterkeyPressed(KeyEvente)、keyReleased(KeyEvente)、keyTyped(keyEvente)JComponent焦點事件FocusListener、FocusAdapterfocusGained(FocusEvente)、focusLost(FocusEvente)JComponent動作事件ActionListeneractionPerformed(ActionEvente)AbstractButton、JComboBox、JTextField、Timer項目事件ItemListenerItemStateChanged(ItemEvente)AbstractButton、JComboBox文本事件TextListenertextValueChanged(TextEvente)JTextField表7-4

事件對應(yīng)的監(jiān)聽接口、適配器、響應(yīng)方法和事件源任務(wù)7-1-3

運用響應(yīng)動作事件實現(xiàn)用戶登錄功能并使用對話框【知識7-9】認知事件監(jiān)聽與響應(yīng)動作事件1.動作事件圖形界面程序要實現(xiàn)交互功能,就必須不斷監(jiān)聽單擊鼠標和敲擊鍵盤等事件。只有這樣,應(yīng)用程序才能對發(fā)生的事件做出響應(yīng)。單擊按鈕或在文本框中按【Enter】鍵,都會發(fā)生動作事件。Java處理事件涉及幾個重要的概念:事件源、監(jiān)聽者、事件接口。(1)事件源能夠產(chǎn)生事件的對象稱為事件源,如按鈕、文本框、菜單等,鼠標或鍵盤在事件源上操作將產(chǎn)生事件。不同的事件源會產(chǎn)生不同的事件,例如,單擊按鈕將產(chǎn)生動作事件,打開窗口將產(chǎn)生窗口事件。(2)監(jiān)聽者實現(xiàn)事件響應(yīng)的關(guān)鍵是一旦產(chǎn)生事件,監(jiān)聽者必須自動執(zhí)行響應(yīng)程序。監(jiān)聽者是指對事件進行監(jiān)聽,以便對產(chǎn)生的事件進行處理的對象。事件源通過調(diào)用相應(yīng)的方法將某個對象注冊為監(jiān)聽者。每個事件源都有注冊監(jiān)聽者的方法,例如,通過調(diào)用如下方法為按鈕類JButton注冊動作事件監(jiān)聽者:按鈕變量名.addActionListener(監(jiān)聽者);。如果動作事件監(jiān)聽者是當前對象,則“監(jiān)聽者”為“this”,即代碼形式為變量名.addActionListener(this);。這樣,一旦單擊按鈕,就會產(chǎn)生一個動作事件,如果按鈕注冊了監(jiān)聽者,則事件對象將傳送到監(jiān)聽者的actionPerformed()方法,并且監(jiān)聽者會自動執(zhí)行這個方法。(3)事件接口事件接口規(guī)定了監(jiān)聽者需要實現(xiàn)的用于處理事件的方法。如果一個類的對象能作為監(jiān)聽者,那么該類必須實現(xiàn)相應(yīng)的事件接口,即必須在類體中給出該接口中所有方法的方法體。動作事件的接口為ActionListener,該接口只有一個方法:publicvoidactionPerformed(ActionEvente)。該方法就是響應(yīng)單擊按鈕事件的方法。因為接口不能直接創(chuàng)建實例對象,所以最終負責監(jiān)聽事件的是實現(xiàn)該接口的類的對象。與實現(xiàn)其他接口一樣,實現(xiàn)監(jiān)聽接口必須重寫接口中的抽象方法。重寫的方法體就是事件響應(yīng)程序,即事件產(chǎn)生后自動運行的程序。任務(wù)7-1-3

運用響應(yīng)動作事件實現(xiàn)用戶登錄功能并使用對話框【知識7-9】認知事件監(jiān)聽與響應(yīng)動作事件2.鼠標事件鼠標動作引起的事件稱為鼠標事件。鼠標事件的事件源一般為容器。當鼠標按下、釋放、單擊時會引發(fā)鼠標事件(對應(yīng)MouseEvent類),MouseEvent類存于java.awt.event包中??梢酝ㄟ^實現(xiàn)java.awt.event包中的MouseListener接口和MouseMotionListener接口處理鼠標事件。3.事件適配器Java提供了鼠標適配器(MouseAdapter)類和鼠標移動適配器(MouseMotionAdapter)類來處理鼠標事件。MouseAdapter類實現(xiàn)了MouseListener接口;MouseMotionAdapter類實現(xiàn)了MouseMotionListener接口,這些類稱為適配器(Adapter)類。適配器類重寫了接口中的所有方法,但方法體都為空,這樣通過繼承適配器類實現(xiàn)事件響應(yīng)時就不必實現(xiàn)接口中的所有方法了,只需重寫需要的方法。事件適配器為人們提供了一種簡單的實現(xiàn)監(jiān)聽的手段,可以適當減少程序代碼的編寫量。7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-2-1

創(chuàng)建記事本主窗口【任務(wù)描述】

(1)創(chuàng)建一個450px×300px的JFrame窗口【我的記事本】。(2)在該窗口中添加一個10行10列的JTextArea文本域,用來顯示多行信息。(3)創(chuàng)建一個JScrollPane組件,將JTextArea文本域作為其顯示組件。(4)向JFrame窗口【我的記事本】中添加JScrollPane組件。任務(wù)7-2-2

創(chuàng)建記事本主窗口并添加菜單【任務(wù)描述】

(1)創(chuàng)建1個【我的記事本】窗口。(2)在【我的記事本】窗口中添加1個菜單欄,在菜單欄容器中添加4個菜單:【文件】【編輯】【格式】和【幫助】。(3)在【文件】菜單中添加【新建】【打開】【另存為】【退出】4個菜單項和1根分隔線,在【編輯】菜單中添加【復(fù)制】【剪切】【粘貼】【全選】【清除】5個菜單項和1根分隔線,在【格式】菜單中添加1個復(fù)選框菜單項【自動換行】,在【幫助】菜單中添加1個菜單項【幫助】。(4)設(shè)置各個菜單和菜單項的熱鍵。(5)設(shè)置各個菜單項的快捷鍵。(6)為【退出】菜單項編寫事件處理程序,實現(xiàn)退出功能。任務(wù)7-2-2

創(chuàng)建記事本主窗口并添加菜單【知識7-10】在JFrame窗體中創(chuàng)建并使用菜單菜單組件可以使窗口顯示菜單項。Swing提供了3個層次的菜單類,第1層的菜單欄JMenuBar是存放菜單的容器;第2層為菜單JMenu,可以直接添加到JMenuBar中創(chuàng)建頂層菜單,也可以作為其他菜單的子菜單;第3層為菜單項JMenuItem,其中JCheckBoxMenuItem為帶復(fù)選框的菜單項,JRadioButtonMenuItem為帶單選按鈕的菜單項。創(chuàng)建菜單時,首先要使用JMenuBar建立一個菜單欄,然后使用JMenu建立菜單,并使用JMenuItem為每個菜單建立菜單項。(1)菜單欄菜單欄(JMenuBar)是菜單的容器,其構(gòu)造方法為JMenuBar()。(2)菜單菜單(JMenu)是用來存放和整合菜單項的組件,它可以是單一層次的結(jié)構(gòu),也可以是一個層次化的結(jié)構(gòu)。(3)菜單項JMenuItem類繼承自AbstractButton類,因此JMenuItem對象具有許多AbstractButton類的特性,也可以說JMenuItem是一種特殊的按鈕。同時,可以在JMenuItem中添加圖標,當選擇某一個菜單項時就如同按下按鈕一樣,會觸發(fā)動作事件。(4)復(fù)選框菜單項JCheckBoxMenuItem類用于建立一個復(fù)選框菜單項(JCheckBoxMenuItem)。(5)單選按鈕菜單項JRadioButtonMenuItem類用于建立一個單選按鈕菜單項(JRadioButtonMenuItem)。7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-2-3

為記事本窗口添加快捷菜單

【任務(wù)描述】

(1)創(chuàng)建1個【我的記事本】窗口。(2)在【我的記事本】窗口中添加1個快捷菜單欄,在快捷菜單欄容器中添加1個菜單【文件】、3個單選按鈕菜單項【復(fù)制】【剪切】【粘貼】、2根分隔線和1個菜單項【退出】,【文件】菜單中包含3個菜單項——【新建】【打開】【另存為】。(3)設(shè)置菜單項的快捷鍵。(4)為JFrame窗口的文本域添加鼠標事件監(jiān)聽器,實現(xiàn)右擊文本域后彈出快捷菜單的功能。(5)為【退出】菜單項編寫事件處理程序,實現(xiàn)退出功能。任務(wù)7-2-3

為記事本窗口添加快捷菜單【知識7-11】在JFrame窗體中創(chuàng)建與使用快捷菜單快捷菜單(JPopupMenu)是一種特殊的菜單,其性質(zhì)與菜單基本一致,但是JPopupMenu并不固定在窗口中的固定位置,而是由鼠標和系統(tǒng)決定其位置。JPopupMenu的構(gòu)造方法如下。①JPopupMenu()。

②JPopupMenu(Stringtext)。

其中,參數(shù)text用于指定彈出快捷菜單的文本內(nèi)容。彈出快捷菜單一般通過鼠標事件實現(xiàn),示例代碼如下。publicvoidmouseReleased(MouseEvente){if(e.isPopupTrigger()){popupMenu.show(e.getComponent(),e.getX(),e.getY());}}7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-2-4

為記事本窗體添加工具欄

【任務(wù)描述】

(1)創(chuàng)建1個【我的記事本】窗口。(2)在【我的記事本】窗口中添加1個工具欄,在工具欄中添加【新建文件】【打開文件】【保存文件】【復(fù)制文件】【剪切文件】【粘貼文件】和【退出】7個按鈕、2根分隔線。要求鼠標指針移動到按鈕上時出現(xiàn)邊框。(3)為工具欄中的【新建文件】和【退出】按鈕編寫事件處理程序。任務(wù)7-2-4

為記事本窗體添加工具欄

【知識7-12】在JFrame窗體中創(chuàng)建與使用工具欄使用JToolBar類創(chuàng)建一個工具欄對象,然后使用add()方法將按鈕添加到工具欄中。JToolBar類的構(gòu)造方法如下。①JToolBar()。

②JToolBar(Stringtext)。

③JToolBar(intorientation)。

④JToolBar(Stringtext,intorientation)。

其中,參數(shù)text用于設(shè)置工具欄中按鈕的文本內(nèi)容;參數(shù)orientation用于設(shè)置工具欄中按鈕的位置。JToolBar類的常用方法如下。①voidsetFloatable(booleanb):設(shè)置工具欄是否可以浮動。②voidsetRollover(booleanrollover):鼠標指針移動到按鈕上時是否出現(xiàn)邊框。③voidsetOrientation(into):設(shè)置工具欄方向。④voidsetToolTipText():設(shè)置按鈕提示文字。⑤voidaddSeparator():添加分隔線。7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-3

可視化設(shè)計用戶登錄程序【任務(wù)描述】

在ApacheNetBeansIDE可視化設(shè)計環(huán)境中創(chuàng)建圖7-19所示的【用戶登錄】窗口,在“用戶名”文本框中輸入正確的用戶名,在“密碼”文本框中輸入正確的密碼,單擊【登錄】按鈕,彈出“成功登錄系統(tǒng)”的提示信息對話框,否則彈出“用戶名有誤”或者“密碼不正確”的提示信息對話框。單擊【取消】按鈕,會彈出一個供用戶進行選擇的對話框。任務(wù)7-3

可視化設(shè)計用戶登錄程序【知識7-13】創(chuàng)建與使用Java中的包1.初識包利用面向?qū)ο蟪绦蛟O(shè)計技術(shù)開發(fā)軟件時,程序員需要定義許多類并使其共同工作,有些類可能要反復(fù)被使用。為了使這些類易于查找和使用、避免命名沖突以及限定類的訪問權(quán)限,程序員可以將一組功能相關(guān)的類與接口打包成一個包(Package)。Java通過包可以方便地管理程序的類和接口。包是類和接口的集合,或者說包是類和接口的容器,它將一組類或接口集中到一起。在文件系統(tǒng)中,包被轉(zhuǎn)換成一個文件夾。包中還可以有包,形成一種層次結(jié)構(gòu)。包的優(yōu)點主要體現(xiàn)在以下幾個方面。(1)程序員可以很容易地確定包中的類是相關(guān)的,并且根據(jù)所需要的功能找到對應(yīng)的類。(2)包可以防止類命名混亂。每個包都創(chuàng)建了一個獨立的命名空間,因此位于不同包中的相同類名不會產(chǎn)生沖突。(3)包可以控制內(nèi)部類、接口、成員變量和方法的可見性。在包中,除了訪問權(quán)限聲明為private的成員變量和方法之外,類中所有的成員變量和方法還可以被同一包中的其他類和方法訪問。2.使用package創(chuàng)建包

創(chuàng)建包就是將類與接口放入指定的包中,創(chuàng)建包可通過在類和接口的源文件中使用package相應(yīng)語句實現(xiàn)。聲明包的語句格式如下。package包名稱1[.包名稱2……];其中,符號“.”代表分隔符;“包名稱1”為最外層的包;“包名稱2”為內(nèi)層的包。示例代碼如下。packagepackage7_3;在ApacheNetBeansIDE中,可以快捷創(chuàng)建包。任務(wù)7-3

可視化設(shè)計用戶登錄程序【知識7-13】創(chuàng)建與使用Java中的包3.Java中常用的包Java提供了以下幾個常用的包。(1)java.lang:該包包含Java編程所需要的基礎(chǔ)類和接口,如Object類、Math類、String類、StringBuffer類、Thread類、Throwable類和Runnable接口等。這個包是唯一

一個可以不用導(dǎo)入就可以使用的包。(2)java.io:該包包含標準I/O類,如文件操作等。(3)java.nio:為了完善io包的功能,提高io包性能而創(chuàng)建的一個新包。(4)java.util:該包包含豐富的常用工具類,包括自成體系的集合框架、事件模型、日期時間、國際化支持工具等許多有益的工具,如Date類、Vector類等。(5):該包包含實現(xiàn)網(wǎng)絡(luò)功能的類,如URL、URLConnection等。(6)java.sql:該包包含訪問數(shù)據(jù)庫的類和接口,如Connection、Statement、ResultSet等。(7)java.awt:該包包含所有創(chuàng)建用戶界面(UserInterface,UI)、繪圖及圖像處理的類,其部分功能正在被java.swing取代。(8)java.awt.event:該包包含事件處理的類。(9)java.applet:該包包含創(chuàng)建Applet以及Applet與其運行上下文環(huán)境進行通信所需要的類。(10)javax.servlet:該包包含JSP、Servlet等使用到的類。任務(wù)7-3

可視化設(shè)計用戶登錄程序【知識7-13】創(chuàng)建與使用Java中的包4.使用import導(dǎo)入包中的類將類組織成包是為了更好地利用包中的類。通常一個類只能直接引用與它在同一個包中的類。如果要使用其他包中的類,則可以在類名前面加上完整的包名,即使用“包名稱.類名”的形式,但這種方式有些煩瑣,一般只有兩個包中含有同名的類時,為了對兩個同名類加以區(qū)分時才使用。更簡便的方法是使用import語句導(dǎo)入需要的類,在隨后的程序中直接使用類名進行操作。(1)從包中導(dǎo)入指定類的語法格式如下。import包名稱.類名其中,包名稱對應(yīng)文件夾名稱;類名用于指明要導(dǎo)入的類。包名稱可以包含多個層次,形式如“父包名稱1.子包名稱2”。示例代碼如下。importjava.util.Calendar;(2)從包中導(dǎo)入該包全部類的語法格式如下。import包名稱.*Java編譯器默認為所有的Java程序?qū)隞DK的java.lang包中所有的類(importjava.lang.*;),該包中定義了一些編程時常用的類,如System類、String類、Object類、Math類等,在進行程序設(shè)計時,這些類可以直接使用。但使用其他包中的類時,必須先導(dǎo)入后使用。導(dǎo)入包的代碼書寫在類聲明語句的上方、創(chuàng)建包語句的下方,import語句在一個源代碼文件中可以書寫任意多句。注意,import語句只會導(dǎo)入指定包中的類,而不會導(dǎo)入該包中子包中的類。7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習要點7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計環(huán)境中設(shè)計窗口并添加組件應(yīng)用JTable組件設(shè)計JavaGUI程序任務(wù)7-4

可視化設(shè)計【購物車管理】窗口【任務(wù)描述】在ApacheNetBeansIDE可視化設(shè)計環(huán)境中創(chuàng)建圖7-23所示的【購物車管理】窗口,該窗口運行時,JTable組件中將顯示商品數(shù)據(jù),包括商品編碼、商品名稱、商品價格和購買數(shù)量4列。在JTable組件中單擊某一行,在該組件的下方將顯示對應(yīng)的商品編碼,如果單擊【刪除】按鈕,則將從JTable組件中刪除對應(yīng)的行。在窗口下方的“商品編碼”文本框、“商品名稱”文本框、“商品價格”文本框和“購買數(shù)量”文本框中分別輸入相應(yīng)的數(shù)據(jù),單擊【添加】按鈕,可將新的商品數(shù)據(jù)添加到JTable組件的商品數(shù)據(jù)表中。單擊【清空】按鈕,將會清空JTable組件中的所有商品數(shù)據(jù)。圖7-23【購物車管理】窗口任務(wù)7-4

可視化設(shè)計【購物車管理】窗口【知識7-14】認知JTable組件表(JTable)組件以行和列的形式顯示數(shù)據(jù),并允許對表格中的數(shù)據(jù)進行編輯。使用表格時,首先會生成一個TableModel類的對象來表示該數(shù)據(jù),然后以該TableModel類的對象作為參數(shù)生成JTable類的對象,并將TableModel類的對象中的數(shù)據(jù)以表格形式顯示出來。JTable類的常用方法如下。①voidsetAutoResizeMode(intmode):設(shè)置自動調(diào)整列寬的模式。②intgetRowCount():獲取表格的行數(shù)。③intgetColumnCount():獲取表格的列數(shù)。④StringgetColumnName(intcolumn):獲取表格的列名稱。⑤ObjectgetValueAt(introw,intcol):獲取表格中特定位置的值。⑥voidsetValueAt(Objectobj,introw,intcol):設(shè)置表格中特定位置的值。⑦voidsetGridColor(Colorc):設(shè)置網(wǎng)格顏色。⑧voidsetRowHeight(inth):設(shè)置表格的行高。⑨TableModelgetModel():獲取表格的數(shù)據(jù)類。⑩TableColumnModelgetColumnModel():獲取表格的列數(shù)據(jù)模型??梢韵壤迷摲椒ǐ@取TableColumnModel對象,再利用TableColumnModel類定義的getColumn()方法獲取TableColumn對象,并利用此對象的setPreferredWidth()方法設(shè)置列寬。學(xué)習進步!人民郵電出版社

第8章

網(wǎng)絡(luò)通信程序設(shè)計人民郵電出版社

教學(xué)導(dǎo)航教學(xué)目標了解網(wǎng)絡(luò)通信的基本概念和Java網(wǎng)絡(luò)通信的支持機制了解基于TCP的通信、基于UDP的通信和基于URL的通信的實現(xiàn)方法掌握服務(wù)器端與客戶端套接字的創(chuàng)建與連接方法學(xué)會設(shè)計基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序?qū)W會設(shè)計基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序?qū)W會設(shè)計基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序教學(xué)重點服務(wù)器端與客戶端套接字的創(chuàng)建及連接方法基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計

身臨其境

在線客服與客戶互動交流的界面如圖8-1所示,客服可以通過該界面與客戶進行實時互動交流。石頭剪子布小游戲的操作界面如圖8-2所示,單擊【重新開始】按鈕,可以重新開始玩石頭剪子布小游戲。

圖8-1

在線客服與客戶互動交流的界面

圖8-2

石頭剪子布小游戲的操作界面

前導(dǎo)知識【知識8-1】認知網(wǎng)絡(luò)通信的基本概念在進行網(wǎng)絡(luò)編程之前,有必要了解網(wǎng)絡(luò)通信的基本概念,主要包括IP地址、端口、協(xié)議(其中TCP/IP和UDP為兩項重要協(xié)議,單獨介紹)等。為了實現(xiàn)兩臺計算機通信,必須有一條網(wǎng)絡(luò)線路連接兩臺計算機,如圖8-3所示。服務(wù)器是指提供信息的計算機或者程序,客戶端是指請求信息的計算機或程序,網(wǎng)絡(luò)用于連接服務(wù)器與客戶端,實現(xiàn)相互通信。圖8-3

客戶端、服務(wù)器和網(wǎng)絡(luò)

前導(dǎo)知識【知識8-1】認知網(wǎng)絡(luò)通信的基本概念(1)IP地址互聯(lián)網(wǎng)中連接了無數(shù)的服務(wù)器和客戶端,但它們并不是處于無序狀態(tài),而是每一臺主機都有唯一的地址,作為該主機在互聯(lián)網(wǎng)中的唯一標志,這個地址稱為網(wǎng)際協(xié)議(InternetProtocol,IP)地址。IP地址是一種在Internet上給主機編址的方式。IP地址由4個十進制數(shù)組成,每個數(shù)的取值范圍是0~255,各數(shù)之間用一個點號“.”分隔,如。(2)端口端口(Port)是計算機數(shù)據(jù)I/O的接口。例如,個人計算機上都有的串行口,它是I/O設(shè)備上的一個物理接口。計算機接入通信網(wǎng)絡(luò)或Internet時也需要一個端口,但這個端口不是物理端口,而是一個由16位數(shù)標識的邏輯端口,即一個假想的連接裝置,且這個端口是TCP/IP的一部分,通過這個端口可以進行數(shù)據(jù)I/O。端口號是一個16位的二進制數(shù),其范圍是0~65535。在實際應(yīng)用中,計算機中的1~1024端口被保留為系統(tǒng)使用,在Java程序中不應(yīng)使用這些保留端口,而應(yīng)該使用1025~65535端口中的一個來進行通信,以免發(fā)生端口沖突。如圖8-4所示,HTTP服務(wù)器一般使用80端口,F(xiàn)TP服務(wù)器一般使用21端口,客戶端1通過80端口才可以連接到服務(wù)器系統(tǒng)的HTTP服務(wù)器,而客戶端2通過21端口才可以連接到服務(wù)器系統(tǒng)的FTP服務(wù)器。圖8-4

端口示意

前導(dǎo)知識【知識8-1】認知網(wǎng)絡(luò)通信的基本概念(3)協(xié)議為了保證兩臺以上的計算機之間能正確通信,必須有某種計算機都遵守的規(guī)則和約定,將這種規(guī)則和約定稱為協(xié)議(Protocol)。協(xié)議是描述數(shù)據(jù)交換時必須遵循的規(guī)則和數(shù)據(jù)格式。網(wǎng)絡(luò)協(xié)議規(guī)定了在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)類型,并規(guī)定了怎樣解釋這些數(shù)據(jù)類型和怎樣請求傳輸這些數(shù)據(jù)。在Internet中控制復(fù)雜服務(wù)的協(xié)議有很多,其中較為常用的協(xié)議有FTP(文件傳送協(xié)議,端口號為21)、HTTP(超文本傳送協(xié)議,端口號為80)、SMTP(簡單郵件傳送協(xié)議,端口號為25)、POPv3(郵局協(xié)議第3版,端口號為110)。(4)TCP/IP傳輸控制協(xié)議(TransmissionControlProtocol,TCP)是一種基于連接的傳輸層協(xié)議,它為兩臺計算機提供了點對點的可靠數(shù)據(jù)流,保證從連接的一個端點發(fā)送的數(shù)據(jù)能夠以正確的順序到達連接的另一個端點。TCP與IP一起使用時,將兩者合稱為TCP/IP。TCP負責數(shù)據(jù)或文件的分組與重組,IP負責發(fā)送與接收數(shù)據(jù)或文件。數(shù)據(jù)或文件在網(wǎng)絡(luò)中傳輸時會被分成許多塊,將這些塊稱為包(Packet)。TCP是可靠的、面向連接的協(xié)議,非常適用于可靠性要求比較高的場合。(5)UDP用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol,UDP)是應(yīng)用層提供的一種簡單、高效的用戶數(shù)據(jù)傳輸服務(wù),但是它并不對連接狀態(tài)與數(shù)據(jù)損失做檢查。UDP從一個應(yīng)用程序向另一個應(yīng)用程序發(fā)送獨立的數(shù)據(jù)報(對應(yīng)TCP中的包),但并不保證這些數(shù)據(jù)報一定能到達另一個應(yīng)用程序,并且這些數(shù)據(jù)報的傳輸順序不可靠,即后發(fā)送的數(shù)據(jù)報可能先到達目的地。因此,使用UDP時,任何必需的可靠性都必須由應(yīng)用層自身提供。UDP適用于對通信可靠性要求較低且對通信性能要求較高的應(yīng)用,如域名服務(wù)(DomainNameService,DNS)、路由信息協(xié)議(RoutingInformationProtocol,RIP)、普通文件傳送協(xié)議(TrivialFileTransferProtocol,TFTP)等應(yīng)用層協(xié)議都建立在UDP的基礎(chǔ)上。

前導(dǎo)知識【知識8-2】認知Java網(wǎng)絡(luò)通信的支持機制Java提供了強大的網(wǎng)絡(luò)支持功能,Java程序網(wǎng)絡(luò)通信功能的實現(xiàn)位于應(yīng)用層,Java的網(wǎng)絡(luò)編程API隱藏了網(wǎng)絡(luò)通信編程的一些煩瑣細節(jié),為用戶提供了與平臺無關(guān)的使用接口,使程序員不需要關(guān)心傳輸層中TCP/UDP的實現(xiàn)細節(jié)就能夠?qū)崿F(xiàn)網(wǎng)絡(luò)編程。Java支持網(wǎng)絡(luò)通信的類位于包中,其中URL類、URLConnection類、Socket類和ServerSocket類使用TCP實現(xiàn)網(wǎng)絡(luò)通信,DatagramPacket類、DatagramSocket類、MulticastSocket類使用UDP實現(xiàn)網(wǎng)絡(luò)通信。生活中,我們通常將可以用來插插頭的裝置稱為插座,其一般用于連接電器與電源,與此類似,網(wǎng)絡(luò)程序中的套接字(Socket)用于將應(yīng)用程序與端口連接起來。套接字是一個軟件實現(xiàn),是一個假想的連接裝置,如圖8-5所示。

圖8-5

套接字

前導(dǎo)知識【知識8-2】認知Java網(wǎng)絡(luò)通信的支持機制Java主要提供了兩種網(wǎng)絡(luò)支持機制。(1)基于URL的通信編程Java支持使用統(tǒng)一資源定位符(UniformResourceLocator,URL)訪問網(wǎng)絡(luò)資源,這種方法適用于訪問Internet,尤其是WWW上的資源。Java提供了使用URL訪問網(wǎng)絡(luò)資源的類,使用戶不需要考慮URL中各種協(xié)議的處理過程,就可以獲得URL資源。(2)基于套接字的通信編程套接字表示應(yīng)用程序與網(wǎng)絡(luò)之間的接口,套接字通信過程是基于TCP/IP中的傳輸層接口套接字實現(xiàn)的。Java提供了對應(yīng)套接字機制的一組類,并支持流和數(shù)據(jù)報兩種通信過程,程序設(shè)計者只需創(chuàng)建Socket類對象,即可使用套接字。在使用基于TCP的雙向通信時,網(wǎng)絡(luò)中的兩個應(yīng)用程序之間必須先建立一個連接,這個連接的兩個端點稱為套接字。從應(yīng)用編程的角度來看,應(yīng)用程序可以將一個輸入流或輸出流綁定到某一個套接字上,讀寫這些I/O流即可實現(xiàn)基于TCP的通信。如圖8-6所示,如果要向套接字的輸出流寫數(shù)據(jù),則只需另一方從套接字的輸入流中讀取數(shù)據(jù)。圖8-6

套接字流

前導(dǎo)知識【知識8-2】認知Java網(wǎng)絡(luò)通信的支持機制套接字通信機制有兩種:基于TCP的通信機制和基于UDP的通信機制。在基于TCP的通信機制中,通信雙方在開始時必須進行一次連接過程,通過建立一條通信鏈路提供可靠的字節(jié)流服務(wù)。在基于UDP的通信機制中,通信雙方不存在連接過程,一次網(wǎng)絡(luò)I/O以一個數(shù)據(jù)報形式進行,且每次網(wǎng)絡(luò)I/O可以和不同主機的不同進程同時進行?;赨DP的通信機制的開銷較小,但提供的數(shù)據(jù)傳輸服務(wù)不可靠,不能保證數(shù)據(jù)報一定能到達目的地。Java同時支持基于TCP和基于UDP的這兩種通信機制,并且在這兩種機制中都采用了套接字表示通信過程中的端點。在基于TCP的通信機制中,包中的Socket類和ServerSocket類分別表示連接的客戶端和服務(wù)器端;在基于UDP的通信機制中,DatagramSocket類表示發(fā)送和接收數(shù)據(jù)包的端點。當不同計算機中的兩個程序要進行網(wǎng)絡(luò)通信時,無論是哪一種機制都需要知道遠程主機的地址或主機名,以及端口號,且網(wǎng)絡(luò)通信中的服務(wù)器端必須運行程序等待連接或等待接收數(shù)據(jù)報。

前導(dǎo)知識【知識8-3】認知基于TCP的通信(1)客戶端編程模式Socket類提供了以下重載的構(gòu)造方法在客戶端程序中創(chuàng)建Socket類的實例對象。①Socket(Stringhost,intport)。②Socket(InetAddressaddress,intport)。③Socket(Stringhost,intport,InetAddresslocalAddress,intlocalPort)。④Socket(InetAddressaddress,intport,InetAddresslocalAddress,intlocalPort)。上述Socket類的構(gòu)造方法中各個參數(shù)的含義如下:host表示服務(wù)器主機名;port表示服務(wù)器的端口號;address表示服務(wù)器的IP地址;localAddress表示本地主機的IP地址;localPort表示本地主機的端口號?;赥CP通信的客戶端編程模式的基本流程如下。①

客戶端程序通過指定的主機名(或者InetAddress的實例對象)和端口號構(gòu)造一個套接字。②

調(diào)用Socket類的getInputStream()方法和getOutputStream()方法分別打開與該套接字關(guān)聯(lián)的輸入流和輸出流,依照服務(wù)程序約定的協(xié)議讀取輸入流中的數(shù)據(jù)或?qū)?shù)據(jù)寫入輸出流。③

依次關(guān)閉I/O流和套接字。

前導(dǎo)知識【知識8-3】認知基于TCP的通信(2)服務(wù)器端編程模式ServerSocket類也提供了多種重載的構(gòu)造方法以在程序中創(chuàng)建ServerSocket類的實例對象。①ServerSocket(intport):創(chuàng)建一個服務(wù)器套接字,并將其綁定到指定端口上。②ServerSocket(intport,intbacklog):首先創(chuàng)建一個服務(wù)器套接字,然后將其綁定到指定的端口上,并指出連接請求隊列的最大長度。在ServerSocket類中最重要的方法是accept(),該方法可以建立并返回一個已與客戶端程序連接的套接字。基于TCP通信的服務(wù)器端編程模式的基本流程如下。①

服務(wù)器端程序通過指定的監(jiān)聽端口創(chuàng)建一個ServerSocket類的實例對象,然后調(diào)用該對象的accept()方法。②

調(diào)用accept()方法程序會發(fā)生阻塞,直至有一個客戶端程序發(fā)送連接請求到服務(wù)器端程序監(jiān)聽的端口。服務(wù)器端程序接收到連接請求后,將分配一個新端口號建立與客戶端程序的連接并返回該連接的一個套接字。③

服務(wù)器端程序可以調(diào)用該套接字的getInputStream()方法和getOutputStream()方法獲取與客戶端程序的連接關(guān)聯(lián)的輸入流和輸出流,并依照預(yù)先約定的協(xié)議讀取輸入流中的數(shù)據(jù)或?qū)?shù)據(jù)寫入輸出流。④

完成所有的通信后,服務(wù)器端程序依次關(guān)閉所有的輸入流、輸出流、已建立連接的套接字以及用于監(jiān)聽的套接字。

前導(dǎo)知識【知識8-4】認知基于UDP的通信UDP是傳輸層的無連接通信協(xié)議,數(shù)據(jù)報是一種在網(wǎng)絡(luò)中獨立傳播的包含地址信息的消息。UDP采用數(shù)據(jù)報進行通信。數(shù)據(jù)報是否可以到達目的地,以什么順序到達目的地,到達目的地時內(nèi)容是否依然正確等是未經(jīng)校驗的。因而UDP是一種不可靠的點對點通信,適用于對通信性能要求較高但對通信可靠性要求較低的應(yīng)用。包為實現(xiàn)UDP通信提供了兩個類:DatagramSocket類和DatagramPacket類。其中,DatagramSocket類對象代表一個被傳送的UDP數(shù)據(jù)報,DatagramSocket類封裝了被傳送數(shù)據(jù)報的內(nèi)容、源主機和端口號、目的主機和端口號等信息,且支持該UDP套接字發(fā)送和接收UDP數(shù)據(jù)報;DatagramPacket類對象代表一個用于傳送UDP數(shù)據(jù)報的UDP套接字。基于UDP的通信是將數(shù)據(jù)報從一個發(fā)送方傳輸給單個接收方。在基于UDP實現(xiàn)客戶端/服務(wù)器通信時,無論是在客戶端還是服務(wù)器端,首先都要創(chuàng)建一個DatagramSocket對象,用來表示數(shù)據(jù)報通信的端點,然后使用DatagramPacket對象封裝數(shù)據(jù)報。UDP套接字面向一個個獨立的數(shù)據(jù)報,既可用于發(fā)送UDP數(shù)據(jù)報,又可用于接收UDP數(shù)據(jù)報。在創(chuàng)建DatagramSocket類的實例對象時,可以通過不同形式的構(gòu)造方法指定UDP套接字綁定的主機地址和端口號。

前導(dǎo)知識【知識8-4】認知基于UDP的通信DatagramSocket類常用的構(gòu)造方法如下。①DatagramSocket():與本機任何可用的端口綁定。②DatagramSocket(intport):與指定的端口綁定。③DatagramSocket(intport,InetAddressaddress):與指定本機地址的端口綁定。DatagramPacket類既可以描述客戶端程序發(fā)送的UDP數(shù)據(jù)報,又可以描述服務(wù)器端程序接收的UDP數(shù)據(jù)報。DatagramPacket類常用的構(gòu)造方法如下。①DatagramPacket(byte[]buf,intlength)。②DatagramPacket(byte[]buf,intoffset,intlength)。③DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)。④DatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport)。

前導(dǎo)知識【知識8-5】認知基于URL的通信URL表示Internet上一個資源的引用或地址,Java網(wǎng)絡(luò)應(yīng)用程序也是使用URL來定位要訪問的Internet上的資源的。(1)熟悉URL地址URL地址使Java網(wǎng)絡(luò)應(yīng)用程序能夠在通信雙方之間以某種方式建立連接,從而完成相應(yīng)的操作。一個完整的URL的語法格式如下。<通信協(xié)議>://<主機名>:<端口號>/<文件名>①

通信協(xié)議:數(shù)據(jù)交換使用的協(xié)議,常用的有HTTP、FTP等。②

主機名:資源所在的計算機,它有兩種表示方法,即IP地址和域名。③

端口號:該計算機上的某個特定服務(wù),其有效范圍是0~65535。④

文件名:該資源在目的計算機上的位置,即路徑。(2)創(chuàng)建URL對象在包中定義的URL類提供了最簡單的網(wǎng)絡(luò)編程接口,只需使用一次方法調(diào)用即可下載URL對象指定的網(wǎng)絡(luò)資源的內(nèi)容。使用URL對象下載網(wǎng)絡(luò)資源內(nèi)容之前必須創(chuàng)建一個URL類的實例對象,URL類提供的重載形式的構(gòu)造方法如下。①publicURL(Stringprotocol,Stringhost,intport,Stringfile)。②publicURL(Stringprotocol,Stringhost,Stringfile)。③publicURL(Stringspec)。④publicURL(URLcontext,Stringspec)。

前導(dǎo)知識【知識8-5】認知基于URL的通信(3)獲取URL對象的狀態(tài)URL類提供的獲取URL對象狀態(tài)的方法如表8-1所示,可以從一個字符串描述的URL地址中提取協(xié)議名、主機名、端口號和文件名等信息。(4)使用URL類的openStream()方法讀取URL地址標識的資源內(nèi)容創(chuàng)建一個URL對象以后,可以通過URL類的openStream()方法獲取一個綁定到該URL地址資源的輸入流(java.io.InputStream)對象,并通過讀取該輸入流訪問整個資源的內(nèi)容。(5)使用URLConnection類的openConnection()方法實現(xiàn)對URL資源的讀/寫操作訪問一個指定的URL數(shù)據(jù),除了使用URL類的openStream()方法實現(xiàn)讀操作之外,還可以通過URLConnection類提供的openConnection()方法在應(yīng)用程序與URL之間創(chuàng)建一個連接,從而實現(xiàn)對URL所表示資源的讀/寫操作。URLConnection類提供多個進行連接設(shè)置和操作的方法,其中獲取連接上I/O流的方法如下,通過返回的I/O流可以實現(xiàn)對URL數(shù)據(jù)的讀/寫。①InputStreamgetInputStream()。②OutputStreamgetOutputStream()。方法名稱功能說明getProtocol()獲取該URL中的協(xié)議名getHost()獲取該URL中的主機名getPort()獲取該URL中的端口號,如果沒有設(shè)置端口,則返回-1getFile()獲取該URL中的文件名getRef()獲取該URL中文件的相對位置表8-1

URL類提供的獲取URL對象狀態(tài)的方法8.1服務(wù)器端與客戶端套接字的創(chuàng)建及連接8.2基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.4基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計學(xué)習要點8.3基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.5基于UDP客戶端相互通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計任務(wù)8-1-1

創(chuàng)建并連接套接字【任務(wù)描述】編寫程序并完成以下任務(wù)。按事先指定的端口號創(chuàng)建服務(wù)器套接字。按待連接服務(wù)器的IP地址和端口號創(chuàng)建客戶端套接字,與服務(wù)器套接字連接,若與服務(wù)器套接字連接成功,則輸出提示信息。首先啟動服務(wù)器端的程序,然后啟動客戶端的程序。服務(wù)器端程序啟動成功后,監(jiān)聽客戶端的連接請求,若檢測到客戶端的連接請求,則創(chuàng)建新的套接字,并使其與客戶端套接字連接,而服務(wù)器繼續(xù)等待其他客戶端的連接請求??蛻舳藙?chuàng)建套接字后,將馬上向指定的IP地址及端口進行連接嘗試。服務(wù)器套接字與客戶端套接字連接成功后,就可以獲取套接字的輸入輸出流,進行數(shù)據(jù)交換。但本任務(wù)暫不要求進行數(shù)據(jù)交換。InetAddress類是與IP地址相關(guān)的類,利用此類可以獲取并輸出主機名、主機IP地址和本機的IP地址。任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認知創(chuàng)建并連接套接字的方法1.InetAddress類在基于TCP的網(wǎng)絡(luò)通信中,Java應(yīng)用程序需要直接使用IP地址或域名指定運行在Internet上的某一臺主機。包中定義的InetAddress類是一個IP地址或域名的抽象類。在創(chuàng)建InetAddress類的一個實例對象時,可以使用字符串表示的域名,也可以使用字節(jié)數(shù)組表示的IP地址。InetAddress類沒有提供普通的構(gòu)造方法,而是提供了用于獲取InetAddress實例對象的靜態(tài)方法。InetAddress類的常用方法如下。①publicsynchronizedstaticInetAddressgetLocalHost():返回本地主機的IntetAddress對象。②publicstaticInetAddressgetByName(Stringhost):獲取與參數(shù)host對應(yīng)的IntetAddress對象。③publicStringgetHostAddress():返回表示主機IP地址的字符串。④publicStringgetHostName():返回表示主機名的字符串。以上方法都會拋出UnknownHostException異常,這個異常會在主機不存在或網(wǎng)絡(luò)連接錯誤時發(fā)生,必須進行相應(yīng)的異常處理。任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認知創(chuàng)建并連接套接字的方法2.ServerSocket類ServerSocket類用于表示服務(wù)器套接字,通過指定的端口來等待套接字的連接。服務(wù)器套接字一次只與一個套接字進行連接,如果有多臺客戶端同時提出連接請求,則服務(wù)器套接字會將請求連接的客戶端套接字存入隊列中,并從隊列中取出一個套接字,使其與服務(wù)器套接字連接。所以隊列的大小即服務(wù)器可同時接收的連接請求數(shù)。如圖8-7所示,先按事先指定的端口號創(chuàng)建服務(wù)器套接字。服務(wù)器套接字等待客戶端的連接請求,并創(chuàng)建新的套接字使其與客戶端套接字連接,而本身繼續(xù)等待其他客戶端的連接請求。圖8-7

服務(wù)器套接字任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認知創(chuàng)建并連接套接字的方法(1)ServerSocket類的常用構(gòu)造方法如下。①publicServerSocket(intport)throwsIOException

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論