




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
湖南商學(xué)院《面對對象程序設(shè)計》課程設(shè)計報告題目一對一客戶通知器姓名:學(xué)號:專業(yè):計算機科學(xué)與技術(shù)班級:計科指導(dǎo)教師:職稱:講師計算機與電子工程學(xué)院2009年6月課程設(shè)計評審表姓名學(xué)院計算機與電子工程學(xué)院學(xué)號專業(yè)班級計科題目一對一客戶通知器評審意見評審成績指導(dǎo)教師簽名職稱評審時間年月日目錄TOC\o"1-3"\f1課程設(shè)計題目描述和基本設(shè)計要求 41.1題目描述 41.2基本設(shè)計要求 42系統(tǒng)需求分析與設(shè)計 42.1系統(tǒng)需求分析 42.1.1功能需求分析 42.1.2其他需求分析 42.2系統(tǒng)設(shè)計 52.2.1總體設(shè)計 52.2.2詳細設(shè)計 53系統(tǒng)測試與使用說明 73.1系統(tǒng)測試 73.2系統(tǒng)使用說明 93.2.1系統(tǒng)中存在的問題 104課程設(shè)計總結(jié) 104.1遇到的問題及解決辦法 104.2心得體會 10附錄 11一對一客戶通知器1課程設(shè)計題目描述和基本設(shè)計要求1.1題目描述本程序是基于對單個特殊用戶(如VIP用戶)進行實時通知的需求而產(chǎn)生的。要求實現(xiàn)在服務(wù)器端發(fā)送消息,并顯示發(fā)送時的具體時間,由單個客戶端接收。1.2基本設(shè)計要求界面應(yīng)盡量簡潔,易于操作,功能一目了然。2系統(tǒng)需求分析與設(shè)計2.1系統(tǒng)需求分析2.1.1功能需求分析1、能進行由服務(wù)器端到客戶端的實時消息的發(fā)送;2、只支持單一客戶端一對一發(fā)送消息;3、由服務(wù)端先發(fā)送請求,客戶端同意接收時開始發(fā)送;2.1.2其他需求分析(1)性能要求使用性強,占用內(nèi)存空間小,運行速度快。(2)設(shè)計約束開發(fā)工具:jdk1.5運行環(huán)境:Windows2000,WindowsXP(3)界面要求可視圖形界面,以JAVA的默認觀感為UI,確保能在移植的情況下正常使用。2.2系統(tǒng)設(shè)計2.2.1總體設(shè)計在用戶界面方面,盡量做到美觀大方,簡潔易用。無菜單欄,因為完成信息的發(fā)送不需要用戶過多的設(shè)置,使操作更為簡單。整個界面大約占到桌面的1/16,小巧精致。在服務(wù)器端包含“偵聽”“發(fā)送”兩個按鈕,而在客戶端只包含“連接”一個按鈕。服務(wù)端與客戶端都有可滾動的文本顯示域,方便查看已發(fā)送的信息。在服務(wù)端有輸入文本的區(qū)域。最重要的是客戶端和服務(wù)端都有端口地址的輸入域,只有保證這個域的內(nèi)容相同才能成功進行連接??蛻舳擞幸粋€本地IP域。整個工作2.2.2詳細設(shè)計這個簡易客戶通知器由用戶界面和網(wǎng)絡(luò)兩部分構(gòu)成。(1)用戶界面包含有以下幾個類的使用:JFramejava.awt.Frame的擴展版本,該版本添加了對JFC/Swing組件架構(gòu)的支持。它是本程序中使用的框架,與Frame不同,它特屬swing的組件,擁有更強的功能特性。JPanel它是本程序的面板,其本身也是一個容器。與普通的容器不同的是,它具有顯示繪圖的功能。JTextFieldJTextField具有建立字符串的方法,此字符串用作針對被激發(fā)的操作事件的命令字符串。它是本程序中使用的文本域,是一個固定文本域。JTextArea多行純文本顯示域。JLabel標簽域,用于顯示固定的不可更改的字符,具有提示用戶的作用。JButton按鈕,有觸發(fā)事件的功能。JScrollPane可設(shè)橫向與縱向滾動功能的文本域,由它可以顯示大量文本信息。Thread線程,可根據(jù)系統(tǒng)需要單獨執(zhí)行一項程序。CalendarDateFormat使用calendar來生成實現(xiàn)日期和時間格式化所需的時間字段值。子類應(yīng)將此calendar初始化為適合于與此DateFormat關(guān)聯(lián)的語言環(huán)境的日歷。包含以下接口的實現(xiàn):ActionListener用于監(jiān)聽事件的發(fā)生,用actionPerformed方法來實現(xiàn)事件的反應(yīng)機制。網(wǎng)絡(luò)在網(wǎng)絡(luò)應(yīng)用的實現(xiàn)方面,需要導(dǎo)入一個包,由于要借助流來實現(xiàn),java.io包和java.util包也是需要的。Socket由于要實現(xiàn)網(wǎng)絡(luò)通訊,套接字是一個不錯的選擇。它想一條虛擬的光纜,將兩臺(或多臺)主機連接起來。套接字是通訊雙方的一種約定,用套接字中的相關(guān)函數(shù)來完成通信過程。區(qū)別不同應(yīng)用程序進程間的通信過程,主要有三個參數(shù)。它們是:通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)、使用的端口號。Socket原意是“插座”。通過將這3個參數(shù)結(jié)合起來,與一個“插座”Socket綁定,應(yīng)用層就可以和傳輸層通過套接字接口,區(qū)分來自不同應(yīng)用程序進程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。套接字的工作圖示如下:圖1套接字3系統(tǒng)測試與使用說明3.1系統(tǒng)測試執(zhí)行服務(wù)端程序后,會出現(xiàn)如下界面:圖2測試1其中端口號是預(yù)置的,為“4700”??梢郧宄乜吹剑绑w中共有三個標簽“端口號”、“請輸入信息”、“已發(fā)送信息”,三個文本域(其中有一個是帶縱向滾動功能的),兩個按鈕“偵聽”、“發(fā)送”。由于是DefaultLookAndFeel(java的默認觀感),界面的放大、縮小按鈕以及關(guān)閉按鈕都已經(jīng)自動生成,形狀也已統(tǒng)一畫好。當要完成發(fā)送信息的任務(wù)時,我們可以先在服務(wù)端這邊點“偵聽”按鈕,等待客戶端響應(yīng);當客戶端點擊“連接”按鈕后,便會在客戶端與服務(wù)端提示已連接成功,此時連接工作便完成了。以下是客戶端的初始狀態(tài)圖示:圖3測試2其中,主機名稱和端口號的值是預(yù)置的??蛻舳酥挥幸粋€按鈕“連接”,它需要在服務(wù)端的“偵聽”按鈕被按下后被按下。連接成功后,會出現(xiàn)以下界面:圖4測試3此時,客戶端與服務(wù)端的“連接”“偵聽”按鈕上的文字改為“連接成功”,同時在服務(wù)端的“已發(fā)送信息”文本框中顯示信息“客戶端已經(jīng)連接到服務(wù)器”,客戶端的“已收到信息”文本框中顯示信息“收到:(16點59分49秒)已經(jīng)成功連接”,表示在本機時間16點59分49秒成功建立連接。好的,接下來就可以給客戶端發(fā)送信息了!例如,服務(wù)器端發(fā)送信息“今天8點到賢德11棟樓下會面”,先在服務(wù)器端“請輸入信息”后輸入信息,點發(fā)送,便會出現(xiàn)如下圖所示的效果:圖5測試4客戶端成功接收到信息,成功。3.2系統(tǒng)使用說明在客戶端和服務(wù)器端同時運行的前提下,確保端口號一致。其實系統(tǒng)預(yù)置的端口號是一致的,用戶不需要更改??蛻舳说闹鳈C名稱要填好,系統(tǒng)預(yù)置是“”,用戶也不需要更改。服務(wù)器端點擊“偵聽”按鈕,待客戶端點擊“連接”按鈕后,等待到按鈕文字變?yōu)椤斑B接成功”時,表示已經(jīng)成功連接。由服務(wù)器端在“請輸入信息”欄中輸入需要發(fā)送的信息,然后點擊“發(fā)送”按鈕。若成功,在服務(wù)器端的“已發(fā)送信息”文本框和客戶端的“已收到信息”文本框會顯示發(fā)送的信息和當前主機的時間。3.2.1系統(tǒng)中存在的問題由于時間有限,本系統(tǒng)還存在很多不足之處。比如,當服務(wù)器端按“偵聽”按鈕后,客戶端無法獲知服務(wù)器端是否按下“偵聽”按鈕。只有在兩者知道通信時間時才能在正確的時間按下按鈕。4課程設(shè)計總結(jié)4.1遇到的問題及解決辦法在此次課程設(shè)計過程中,經(jīng)歷了艱難的調(diào)試過程。因為方法是死的,類也有詳實的記載,將類和發(fā)法組合到一篇代碼中也不是件難事。但是在調(diào)試的過程中遇到了各種各樣的問題,讓我不得不一遍又一遍的修改代碼。有時甚至完全顛覆當初的思路,改換其他的方法。后來我通過思考,了解到,之所以會遇到這么大的困難,主要是對JAVA這門計算機語言的認識很不夠,一些細節(jié)根本不知道。但是事已至此,必須要在規(guī)定的時間內(nèi)趕出來,于是我不斷參照不同程序編寫者的方法,一個一個調(diào)試??芍^用汗水換來了集中他人智慧與我自己改良的最終程序。雖然和一開始的初衷不太一樣,但是在我還想調(diào)試的時候,發(fā)現(xiàn)時間已經(jīng)不夠了,所以只好將這件“未完成”的作品呈上。對于我的初衷來說,它是不合格的;但是作為我這些天努力的回報,我覺得它還是一份令我滿意的答卷。4.2心得體會學(xué)習是一件極費腦力的活,必須以相當認真的態(tài)度去對待。通過這次的學(xué)習,我發(fā)現(xiàn)我還要學(xué)的東西有很多,不僅僅是一門計算機語言,更重要的是對問題的態(tài)度以及如何解決它的一些技巧。比如在寫一大版代碼時,有時我自己都覺得十分凌亂,這時我就開始重新將這些代碼分塊,每一塊都不大,但能夠?qū)崿F(xiàn)一個簡單的功能。將創(chuàng)建的每一個類和變量取一個合適的名字,這樣有利于自己理解。后來,我回過頭來看自己寫的代碼,也不覺得凌亂了。附錄//clientprogramimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;import.*;importjava.util.*;publicclassClient2extendsJFrameimplementsActionListener{Containercont=newContainer();JPanelcontentPane;JLabeljLabel1=newJLabel();JLabeljLabel2=newJLabel();JTextFieldjTextField1=newJTextField("");JTextFieldjTextField2=newJTextField("4700");JButtonjButton1=newJButton();JScrollPanejScrollPane1=newJScrollPane();//創(chuàng)建一個帶有滾動條的面板。JTextAreajTextArea1=newJTextArea();//創(chuàng)建一個多行純文本區(qū)域。JLabeljLabel4=newJLabel();ServerSocketserver=null;//服務(wù)器套接字的創(chuàng)建。Socketsocket=null;BufferedReaderinstr=null;PrintWriteros=null;//客戶端套接字的創(chuàng)建。//Constructtheframepublicstaticvoidmain(String[]args){JFrame.setDefaultLookAndFeelDecorated(true);Client2frm=newClient2();frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setVisible(true);}publicClient2(){contentPane=(JPanel)this.getContentPane();contentPane.setLayout(null);this.setBounds(newRectangle(256,232,532,233));this.setTitle("client");jLabel1.setFont(newjava.awt.Font("宋體",0,14));jLabel1.setText("主機名稱");jLabel1.setBounds(newRectangle(200,27,72,28));jLabel2.setBounds(newRectangle(23,27,72,28));jLabel2.setText("端口號");jLabel2.setFont(newjava.awt.Font("宋體",0,14));jTextField1.setBounds(newRectangle(276,27,72,24));jTextField2.setBounds(newRectangle(113,27,72,24));jButton1.setBounds(newRectangle(440,28,73,25));jButton1.setFont(newjava.awt.Font("Dialog",0,14));jButton1.setBorder(BorderFactory.createEtchedBorder());jButton1.setText("連接");jButton1.setActionCommand("jButton1");jScrollPane1.setBounds(newRectangle(113,92,312,89));jLabel4.setBounds(newRectangle(23,87,87,28));jLabel4.setText("已收到信息");jLabel4.setFont(newjava.awt.Font("宋體",0,14));contentPane.add(jLabel1,null);contentPane.add(jTextField1,null);contentPane.add(jTextField2,null);contentPane.add(jButton1,null);contentPane.add(jScrollPane1,null);contentPane.add(jLabel2,null);contentPane.add(jLabel4,null);jScrollPane1.getViewport().add(jTextArea1,null);jButton1.addActionListener(this);this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){try{socket.close();instr.close();System.exit(0);}catch(Exceptionex){}}});}classMyThreadextendsThread{//與服務(wù)器不同。publicvoidrun(){try{os=newPrintWriter(socket.getOutputStream());instr=newBufferedReader(newInputStreamReader(socket.getInputStream()));while(true){this.sleep(100);if(instr.ready()){jTextArea1.append("收到:("+getTime()+")"+instr.readLine()+"\n");}}}catch(Exceptionex){}}}publicvoidactionPerformed(ActionEvente){if(e.getSource()==jButton1){Stringip=jTextField1.getText().trim();intport=Integer.parseInt(jTextField2.getText().trim());connectServer(ip,port);}}privatevoidconnectServer(Stringip,intport){//連接//這里也與服務(wù)器不同。try{if(jButton1.getText().trim().equals("連接")){socket=newSocket(ip,port);jButton1.setText("連接成功");MyThreadt=newMyThread();t.start();}}catch(Exceptionex){}}//獲取當前時間的方法 staticStringgetTime() { inth,m,s; StringnowTime; Calendart; t=Calendar.getInstance(); h=t.get(t.HOUR_OF_DAY); m=t.get(t.MINUTE); s=t.get(t.SECOND); nowTime=h+"點"+m+"分"+s+"秒"; returnnowTime; }}//serverimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;import.*;importjava.util.*;publicclassServer2extendsJFrameimplementsActionListener{Containercont=newContainer();JPanelcontentPane;JLabeljLabel2=newJLabel();JTextFieldjTextField2=newJTextField("4700");JButtonjButton1=newJButton();JLabeljLabel3=newJLabel();JTextFieldjTextField3=newJTextField();JButtonjButton2=newJButton();JScrollPanejScrollPane1=newJScrollPane();//創(chuàng)建一個帶有滾動條的面板。JTextAreajTextArea1=newJTextArea();//創(chuàng)建一個多行純文本區(qū)域。JLabeljLabel4=newJLabel();ServerSocketserver=null;//服務(wù)器套接字的創(chuàng)建。Socketsocket=null;BufferedReaderinstr=null;PrintWriteros=null;//客戶端套接字的創(chuàng)建。//Constructtheframepublicstaticvoidmain(String[]args){JFrame.setDefaultLookAndFeelDecorated(true);Server2frm=newServer2();frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setVisible(true);}publicServer2(){contentPane=(JPanel)this.getContentPane();contentPane.setLayout(null);this.setBounds(newRectangle(256,232,532,233));this.setTitle("server");jLabel2.setBounds(newRectangle(23,27,72,28));jLabel2.setText("端口號");jLabel2.setFont(newjava.awt.Font("宋體",0,14));jTextField2.setBounds(newRectangle(113,27,72,24));jButton1.setBounds(newRectangle(440,28,73,25));jButton1.setFont(newjava.awt.Font("Dialog",0,14));jButton1.setBorder(BorderFactory.createEtchedBorder());jButton1.setText("偵聽");jButton1.setActionCommand("jButton1");jLabel3.setBounds(newRectangle(23,57,87,28));jLabel3.setText("請輸入信息");jLabel3.setFont(newjava.awt.Font("宋體",0,14));jTextField3.setBounds(newRectangle(113,60,312,24));jTextField3.setText("");jButton2.setText("發(fā)送");jButton2.setBorder(BorderFactory.createEtchedBorder());//設(shè)置邊框。jButton2.setFont(newjava.awt.Font("Dialog",0,14));jButton2.setBounds(newRectangle(440,58,73,25));jButton2.setActionCommand("jButton1");jScrollPane1.setBounds(newRectangle(113,92,312,89));jLabel4.setBounds(newRectangle(23,87,87,28));jLabel4.setText("已發(fā)送信息");jLabel4.setFont(newjava.awt.Font("宋體",0,14));contentPane.add(jTextField2,null);contentPane.add(jButton1,null);contentPane.add(jLabel3,null);contentPane.add(jTextField3,null);contentPane.add(jButton2,null);contentPane.add(jScrollPane1,null);contentPane.add(jLabel2,null);contentPane.add(jLabel4,null);jScrollPane1.getViewport().add(jTextArea1,null);jButton1.addActionListener(this);jButton2.addActionListener(this);this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){try{socket.close();instr.close();System.exit(0);}catch(Exceptionex){}}});}classMyThreadextendsThread{//該線程負責接受數(shù)據(jù)publicvoidrun(){try{while(true){this.sleep(100);instr=newBufferedReader(newInputStreamReader(socket.getInputStream()));if(instr.ready()){//檢查是否有數(shù)據(jù)jTextArea1.append("客戶端:"+instr.readLine()+"\n");}}}catch(Exceptionex){}}}publicvoidactionPerformed(ActionEvente){if(e.getSourc
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《第二單元 指揮機器人行動 12 聲波測距避障礙》教學(xué)設(shè)計-2024-2025學(xué)年泰山版信息技術(shù)(2018)第三冊
- 如何提升小班班級凝聚力計劃
- 如何推動財務(wù)制度優(yōu)化計劃
- 會計記賬的技巧與實務(wù)指南計劃
- 推動品德教育與心理輔導(dǎo)融合計劃
- 社區(qū)交通安全的個人倡導(dǎo)計劃
- 慈善基金會年度項目計劃
- 神經(jīng)內(nèi)科護理個案護理模板
- 肥胖患者的護理常規(guī)
- 醫(yī)院道路知識培訓(xùn)課件
- 智慧農(nóng)場整體建設(shè)實施方案
- 被詐騙的起訴書范文
- 幼兒園食譜播報
- 公路養(yǎng)護服務(wù)投標方案(技術(shù)標)
- 灌入式半柔性復(fù)合抗車轍路面施工工法
- 小班第一學(xué)期教學(xué)進度表
- 材料性能學(xué)課件:材料的熱學(xué)性能-2-熱傳導(dǎo)-熱穩(wěn)定性-
- 幼兒園優(yōu)質(zhì)公開課:中班數(shù)學(xué)《尋寶小勇士》課件
- 監(jiān)理單位工程項目總監(jiān)及監(jiān)理人員名冊
- 北師大版小學(xué)英語3-6年級單詞-(三起)帶音標-精華版
- 聲樂第2版(學(xué)前教育專業(yè))PPT完整全套教學(xué)課件
評論
0/150
提交評論