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

下載本文檔

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

文檔簡介

第7章

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

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

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

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

Windows10自帶的計(jì)算器界面

圖7-2

QQ登錄界面圖7-3

Windows照片查看器界面

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

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

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

Swing組件從功能上可分為如下幾類。(1)頂層容器包括JFrame、JWindow、JDialog和JApplet。頂層容器為其他組件的顯示與事件處理提供支持。(2)中間容器包括JPanel、JScrollPane、JSplitPane、JMenuBar、JToolBar。JPanel較常用,能夠通過布局來排列其內(nèi)部組件。JScrollPane與JPanel類似,可以提供滾動(dòng)條。JSplitPane是一種分割面板,可以將組件分成上下或左右兩個(gè)部分。JMenuBar是一個(gè)菜單容器,用于建立菜單欄。JToolBar為按行或列排列的一組組件。(3)基本組件是實(shí)現(xiàn)人機(jī)交互的主要組件,如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)建立一個(gè)JPanel或JDesktopPane之類的中間容器,把組件添加到中間容器中,并使用setContentPane()方法把中間容器設(shè)置為內(nèi)容面板,示例代碼如下。JPanelcontentPane=newJPanel();

jframe.setContentPane(contentPane);

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

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

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

前導(dǎo)知識(shí)【知識(shí)7-6】認(rèn)知Swing實(shí)現(xiàn)多文檔界面應(yīng)用程序的組件多文檔界面(MultipleDocumentInterface,MDI)應(yīng)用程序只有一個(gè)父窗口,子窗口在父窗口內(nèi)顯示。在父窗口內(nèi)建立一個(gè)桌面面板(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不能單獨(dú)出現(xiàn),必須依附在上層組件上,一般加入JDesktopPane進(jìn)行管理。7.1創(chuàng)建JFrame窗口并添加組件7.2事件監(jiān)聽與對(duì)話框使用7.4在JFrame窗體中創(chuàng)建并使用菜單學(xué)習(xí)要點(diǎn)7.3在JFrame窗體中創(chuàng)建并使用快捷菜單7.57.67.7在JFrame窗體中創(chuàng)建并使用工具欄在可視化設(shè)計(jì)環(huán)境中設(shè)計(jì)窗口并添加組件應(yīng)用JTable組件設(shè)計(jì)JavaGUI程序任務(wù)7-1-1

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

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

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

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

;

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

;

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

;

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

;JPaneljp=newJPanel()

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

;

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

運(yùn)用手動(dòng)布局方式對(duì)用戶登錄窗口中的組件進(jìn)行布局【任務(wù)描述】

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【任務(wù)描述】

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

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

②JPopupMenu(Stringtext)。

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

為記事本窗體添加工具欄

【任務(wù)描述】

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

為記事本窗體添加工具欄

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

②JToolBar(Stringtext)。

③JToolBar(intorientation)。

④JToolBar(Stringtext,intorientation)。

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

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

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

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

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

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

一個(gè)可以不用導(dǎo)入就可以使用的包。(2)java.io:該包包含標(biāo)準(zhǔn)I/O類,如文件操作等。(3)java.nio:為了完善io包的功能,提高io包性能而創(chuàng)建的一個(gè)新包。(4)java.util:該包包含豐富的常用工具類,包括自成體系的集合框架、事件模型、日期時(shí)間、國際化支持工具等許多有益的工具,如Date類、Vector類等。(5):該包包含實(shí)現(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與其運(yùn)行上下文環(huán)境進(jìn)行通信所需要的類。(10)javax.servlet:該包包含JSP、Servlet等使用到的類。任務(wù)7-3

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

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

可視化設(shè)計(jì)【購物車管理】窗口【知識(shí)7-14】認(rèn)知JTable組件表(JTable)組件以行和列的形式顯示數(shù)據(jù),并允許對(duì)表格中的數(shù)據(jù)進(jìn)行編輯。使用表格時(shí),首先會(huì)生成一個(gè)TableModel類的對(duì)象來表示該數(shù)據(jù),然后以該TableModel類的對(duì)象作為參數(shù)生成JTable類的對(duì)象,并將TableModel類的對(duì)象中的數(shù)據(jù)以表格形式顯示出來。JTable類的常用方法如下。①voidsetAutoResizeMode(intmode):設(shè)置自動(dòng)調(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對(duì)象,再利用TableColumnModel類定義的getColumn()方法獲取TableColumn對(duì)象,并利用此對(duì)象的setPreferredWidth()方法設(shè)置列寬。學(xué)習(xí)進(jìn)步!人民郵電出版社

第8章

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

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

身臨其境

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

圖8-1

在線客服與客戶互動(dòng)交流的界面

圖8-2

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

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

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

前導(dǎo)知識(shí)【知識(shí)8-1】認(rèn)知網(wǎng)絡(luò)通信的基本概念(1)IP地址互聯(lián)網(wǎng)中連接了無數(shù)的服務(wù)器和客戶端,但它們并不是處于無序狀態(tài),而是每一臺(tái)主機(jī)都有唯一的地址,作為該主機(jī)在互聯(lián)網(wǎng)中的唯一標(biāo)志,這個(gè)地址稱為網(wǎng)際協(xié)議(InternetProtocol,IP)地址。IP地址是一種在Internet上給主機(jī)編址的方式。IP地址由4個(gè)十進(jìn)制數(shù)組成,每個(gè)數(shù)的取值范圍是0~255,各數(shù)之間用一個(gè)點(diǎn)號(hào)“.”分隔,如。(2)端口端口(Port)是計(jì)算機(jī)數(shù)據(jù)I/O的接口。例如,個(gè)人計(jì)算機(jī)上都有的串行口,它是I/O設(shè)備上的一個(gè)物理接口。計(jì)算機(jī)接入通信網(wǎng)絡(luò)或Internet時(shí)也需要一個(gè)端口,但這個(gè)端口不是物理端口,而是一個(gè)由16位數(shù)標(biāo)識(shí)的邏輯端口,即一個(gè)假想的連接裝置,且這個(gè)端口是TCP/IP的一部分,通過這個(gè)端口可以進(jìn)行數(shù)據(jù)I/O。端口號(hào)是一個(gè)16位的二進(jìn)制數(shù),其范圍是0~65535。在實(shí)際應(yīng)用中,計(jì)算機(jī)中的1~1024端口被保留為系統(tǒng)使用,在Java程序中不應(yīng)使用這些保留端口,而應(yīng)該使用1025~65535端口中的一個(gè)來進(jìn)行通信,以免發(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)知識(shí)【知識(shí)8-1】認(rèn)知網(wǎng)絡(luò)通信的基本概念(3)協(xié)議為了保證兩臺(tái)以上的計(jì)算機(jī)之間能正確通信,必須有某種計(jì)算機(jī)都遵守的規(guī)則和約定,將這種規(guī)則和約定稱為協(xié)議(Protocol)。協(xié)議是描述數(shù)據(jù)交換時(shí)必須遵循的規(guī)則和數(shù)據(jù)格式。網(wǎng)絡(luò)協(xié)議規(guī)定了在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)類型,并規(guī)定了怎樣解釋這些數(shù)據(jù)類型和怎樣請(qǐng)求傳輸這些數(shù)據(jù)。在Internet中控制復(fù)雜服務(wù)的協(xié)議有很多,其中較為常用的協(xié)議有FTP(文件傳送協(xié)議,端口號(hào)為21)、HTTP(超文本傳送協(xié)議,端口號(hào)為80)、SMTP(簡單郵件傳送協(xié)議,端口號(hào)為25)、POPv3(郵局協(xié)議第3版,端口號(hào)為110)。(4)TCP/IP傳輸控制協(xié)議(TransmissionControlProtocol,TCP)是一種基于連接的傳輸層協(xié)議,它為兩臺(tái)計(jì)算機(jī)提供了點(diǎn)對(duì)點(diǎn)的可靠數(shù)據(jù)流,保證從連接的一個(gè)端點(diǎn)發(fā)送的數(shù)據(jù)能夠以正確的順序到達(dá)連接的另一個(gè)端點(diǎn)。TCP與IP一起使用時(shí),將兩者合稱為TCP/IP。TCP負(fù)責(zé)數(shù)據(jù)或文件的分組與重組,IP負(fù)責(zé)發(fā)送與接收數(shù)據(jù)或文件。數(shù)據(jù)或文件在網(wǎng)絡(luò)中傳輸時(shí)會(huì)被分成許多塊,將這些塊稱為包(Packet)。TCP是可靠的、面向連接的協(xié)議,非常適用于可靠性要求比較高的場合。(5)UDP用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol,UDP)是應(yīng)用層提供的一種簡單、高效的用戶數(shù)據(jù)傳輸服務(wù),但是它并不對(duì)連接狀態(tài)與數(shù)據(jù)損失做檢查。UDP從一個(gè)應(yīng)用程序向另一個(gè)應(yīng)用程序發(fā)送獨(dú)立的數(shù)據(jù)報(bào)(對(duì)應(yīng)TCP中的包),但并不保證這些數(shù)據(jù)報(bào)一定能到達(dá)另一個(gè)應(yīng)用程序,并且這些數(shù)據(jù)報(bào)的傳輸順序不可靠,即后發(fā)送的數(shù)據(jù)報(bào)可能先到達(dá)目的地。因此,使用UDP時(shí),任何必需的可靠性都必須由應(yīng)用層自身提供。UDP適用于對(duì)通信可靠性要求較低且對(duì)通信性能要求較高的應(yīng)用,如域名服務(wù)(DomainNameService,DNS)、路由信息協(xié)議(RoutingInformationProtocol,RIP)、普通文件傳送協(xié)議(TrivialFileTransferProtocol,TFTP)等應(yīng)用層協(xié)議都建立在UDP的基礎(chǔ)上。

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

圖8-5

套接字

前導(dǎo)知識(shí)【知識(shí)8-2】認(rèn)知Java網(wǎng)絡(luò)通信的支持機(jī)制Java主要提供了兩種網(wǎng)絡(luò)支持機(jī)制。(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中的傳輸層接口套接字實(shí)現(xiàn)的。Java提供了對(duì)應(yīng)套接字機(jī)制的一組類,并支持流和數(shù)據(jù)報(bào)兩種通信過程,程序設(shè)計(jì)者只需創(chuàng)建Socket類對(duì)象,即可使用套接字。在使用基于TCP的雙向通信時(shí),網(wǎng)絡(luò)中的兩個(gè)應(yīng)用程序之間必須先建立一個(gè)連接,這個(gè)連接的兩個(gè)端點(diǎn)稱為套接字。從應(yīng)用編程的角度來看,應(yīng)用程序可以將一個(gè)輸入流或輸出流綁定到某一個(gè)套接字上,讀寫這些I/O流即可實(shí)現(xiàn)基于TCP的通信。如圖8-6所示,如果要向套接字的輸出流寫數(shù)據(jù),則只需另一方從套接字的輸入流中讀取數(shù)據(jù)。圖8-6

套接字流

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

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

客戶端程序通過指定的主機(jī)名(或者InetAddress的實(shí)例對(duì)象)和端口號(hào)構(gòu)造一個(gè)套接字。②

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

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

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

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

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

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

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

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

前導(dǎo)知識(shí)【知識(shí)8-4】認(rèn)知基于UDP的通信DatagramSocket類常用的構(gòu)造方法如下。①DatagramSocket():與本機(jī)任何可用的端口綁定。②DatagramSocket(intport):與指定的端口綁定。③DatagramSocket(intport,InetAddressaddress):與指定本機(jī)地址的端口綁定。DatagramPacket類既可以描述客戶端程序發(fā)送的UDP數(shù)據(jù)報(bào),又可以描述服務(wù)器端程序接收的UDP數(shù)據(jù)報(bào)。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)知識(shí)【知識(shí)8-5】認(rèn)知基于URL的通信URL表示Internet上一個(gè)資源的引用或地址,Java網(wǎng)絡(luò)應(yīng)用程序也是使用URL來定位要訪問的Internet上的資源的。(1)熟悉URL地址URL地址使Java網(wǎng)絡(luò)應(yīng)用程序能夠在通信雙方之間以某種方式建立連接,從而完成相應(yīng)的操作。一個(gè)完整的URL的語法格式如下。<通信協(xié)議>://<主機(jī)名>:<端口號(hào)>/<文件名>①

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論