




已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
綜合實(shí)踐設(shè)計(jì)報(bào)告題目:基于TCP協(xié)議的客戶/服務(wù)器程序班級(jí):計(jì)本122 姓名: 聶樂(lè) 學(xué)號(hào): 2012021029 指導(dǎo)教師:滕艷萍2015年 12月 綜合實(shí)踐評(píng)分表班級(jí)計(jì)本122姓名聶樂(lè)指導(dǎo)教師滕艷萍題目:基于TCP協(xié)議的客戶/服務(wù)器程序評(píng)分標(biāo)準(zhǔn)評(píng)分標(biāo)準(zhǔn)分?jǐn)?shù)權(quán)重評(píng)分的依據(jù)得分AC選題10選題符合大綱要求,題目較新穎,工作量大選題基本符合大綱要求,工作量適中工作態(tài)度10態(tài)度端正,能主動(dòng)認(rèn)真完成各個(gè)環(huán)節(jié)的工作,不遲到早退,出勤好。能夠完成各環(huán)節(jié)基本工作,出勤較好。綜合實(shí)踐的設(shè)計(jì)過(guò)程20能從軟件設(shè)計(jì)的實(shí)際情況出發(fā),很好地繪制軟件設(shè)計(jì)的流程圖并編寫代碼,其代碼質(zhì)量高。能從軟件設(shè)計(jì)的實(shí)際情況出發(fā),基本能夠編寫出程序設(shè)計(jì)代碼并繪制軟件的設(shè)計(jì)流程。獨(dú)立解決問(wèn)題的能力20具有獨(dú)立分析、解決問(wèn)題能力,有一定的創(chuàng)造性,能夠獨(dú)立完成軟件的設(shè)計(jì)與調(diào)試工作,程序結(jié)構(gòu)合理,邏輯嚴(yán)謹(jǐn),功能完善。有一定的分析、解決問(wèn)題能力。能夠在老師指導(dǎo)下完成軟件的設(shè)計(jì)與調(diào)試工作,程序功能較完善。答辨問(wèn)題回答10能準(zhǔn)確回答老師提出的問(wèn)題能基本準(zhǔn)確回答老師提出的問(wèn)題程序運(yùn)行情況10程序運(yùn)行正確、界面清晰,測(cè)試數(shù)據(jù)設(shè)計(jì)合理。程序運(yùn)行正確、界面基本清晰,能給出合適的測(cè)試數(shù)據(jù)。綜合實(shí)踐報(bào)告的要求20格式規(guī)范,層次清晰,設(shè)計(jì)思想明確,解決問(wèn)題方法合理,體會(huì)深刻。格式較規(guī)范,設(shè)計(jì)思想基本明確,解決問(wèn)題方法較合理??偡种笇?dǎo)教師(簽字):注:介于A和C之間為B級(jí),低于C為D級(jí)和E級(jí),其權(quán)重A為1,B為0.8,C為0.6,D和E分別為0.4和0.2。按各項(xiàng)指標(biāo)打分后,總分在90100為優(yōu),8089為良,7079為中,6069為及格,60分以下為不及格。摘要: 本程序是根據(jù)操作系統(tǒng)綜合實(shí)踐指導(dǎo)中課題十所編寫的一個(gè)簡(jiǎn)單的基于TCP協(xié)議下的客戶/服務(wù)器程序,TCP是Transmission Control Protocol(傳輸控制協(xié)議)的縮寫。它位于網(wǎng)絡(luò)OSI七層模型中的傳輸層(IP協(xié)議位于網(wǎng)絡(luò)層;ARP協(xié)議位于數(shù)據(jù)鏈路層,ARP協(xié)議將IP地址解析為物理地址)。程序中的數(shù)據(jù)會(huì)先由TCP協(xié)議包裝,然后再由IP協(xié)議包裝,各層由上到下用自己的協(xié)議對(duì)上層傳下來(lái)的數(shù)據(jù)進(jìn)行包裝,傳到對(duì)端后,各層再由下到上解析自己的協(xié)議并把本層解析后的數(shù)據(jù)交給更高層的協(xié)議處理。熟悉Linux下的socket, 網(wǎng)絡(luò)編程的基本方法,掌握實(shí)現(xiàn)客戶/服務(wù)器程序的編寫方法。編寫一個(gè)簡(jiǎn)單的程序,帶程序可實(shí)現(xiàn)基于TCP協(xié)議的簡(jiǎn)單的客戶/服務(wù)器方式。關(guān)鍵詞: TCP;socket;1、課題研究的內(nèi)容 學(xué)習(xí)操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)原理,是計(jì)算機(jī)應(yīng)用專業(yè)的學(xué)生全面了解和掌握系統(tǒng)軟件,一般軟件設(shè)計(jì)方法和技術(shù)的必不可少的綜合課程,也是了解計(jì)算機(jī)硬件和軟件如何銜接的必經(jīng)之路. 本課程的學(xué)習(xí)目的與任務(wù)是使學(xué)生通過(guò)本課程的學(xué)習(xí),理解操作系統(tǒng)的基本概念和主要功能,掌握常用操作系統(tǒng)(如Windows,UNIX,Linux)的使用和一般管理方法,了解它是如何組織和運(yùn)作的,從而為學(xué)生以后的學(xué)習(xí)和工作打下基礎(chǔ). 2、 課題運(yùn)行環(huán)境計(jì)算機(jī)一臺(tái),操作系統(tǒng): Linux, 開(kāi)發(fā)環(huán)境 Eclipse 3.3.0+ jdk 1.6.3、 相關(guān)概念TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)TCP/IP是一種網(wǎng)絡(luò)通信協(xié)議,它規(guī)范了網(wǎng)絡(luò)上的所有通信設(shè)備,尤其是一個(gè)主機(jī)與另一個(gè)主機(jī)之間的數(shù)據(jù)往來(lái)格式以及傳送方式。TCP/IP是INTERNET的基礎(chǔ)協(xié)議,也是一種電腦數(shù)據(jù)打包和尋址的標(biāo)準(zhǔn)方法。在數(shù)據(jù)傳送中,可以形象地理解為有兩個(gè)信封,TCP和IP就像是信封,要傳遞的信息被劃分成若干段,每一段塞入一個(gè)TCP信封,并在該信封面上記錄有分段號(hào)的信息,再將TCP信封塞入IP大信封,發(fā)送上網(wǎng)。在接受端,一個(gè)TCP軟件包收集信封,抽出數(shù)據(jù),按發(fā)送前的順序還原,并加以校驗(yàn),若發(fā)現(xiàn)差錯(cuò),TCP將會(huì)要求重發(fā)。因此,TCP/IP在INTERNET中幾乎可以無(wú)差錯(cuò)地傳送數(shù)據(jù)。在任何一個(gè)物理網(wǎng)絡(luò)中,各站點(diǎn)都有一個(gè)機(jī)器可識(shí)別的地址,該地址叫做物理地址.物理地址有兩個(gè) 特點(diǎn): (1)物理地址的長(zhǎng)度,格式等是物理網(wǎng)絡(luò)技術(shù)的一部分,物理網(wǎng)絡(luò)不同,物理地址也不同. (2)同一類型不同網(wǎng)絡(luò)上的站點(diǎn)可能擁有相同的物理地址. 以上兩點(diǎn)決定了,不能用物理網(wǎng)絡(luò)進(jìn)行網(wǎng)間網(wǎng)通訊. 在網(wǎng)絡(luò)術(shù)語(yǔ)中,協(xié)議中,協(xié)議是為了在兩臺(tái)計(jì)算機(jī)之間交換數(shù)據(jù)而預(yù)先規(guī)定的標(biāo)準(zhǔn)。TCP/IP并不是一個(gè)而是許多協(xié)議,這就是為什么你經(jīng)常聽(tīng)到它代表一個(gè)協(xié)議集的原因,而TCP和IP只是其中兩個(gè)基本協(xié)議而已。你裝在計(jì)算機(jī)-的TCP/IP軟件提供了一個(gè)包括TCP、IP以及TCP/IP協(xié)議集中其它協(xié)議的工具平臺(tái)。特別是它包括一些高層次的應(yīng)用程序和FTP(文件傳輸協(xié)議),它允許用戶在命令行上進(jìn)行網(wǎng)絡(luò)文件傳輸。TCP/IP是美國(guó)政府資助的高級(jí)研究計(jì)劃署(ARPA)在二十世紀(jì)七十年代的一個(gè)研究成果,用來(lái)使全球的研究網(wǎng)絡(luò)聯(lián)在一起形成一個(gè)虛擬網(wǎng)絡(luò),也就是國(guó)際互聯(lián)網(wǎng)。原始的Internet通過(guò)將已有的網(wǎng)絡(luò)如ARPAnet轉(zhuǎn)換到TCP/IP上來(lái)而形成,而這個(gè)Internet最終成為如今的國(guó)際互聯(lián)網(wǎng)的骨干網(wǎng)。如今TCP/IP如此重要的原因,在于它允許獨(dú)立的網(wǎng)格加入到Internet或組織在一起形成私有的內(nèi)部網(wǎng)(Intranet)。構(gòu)成內(nèi)部網(wǎng)的每個(gè)網(wǎng)絡(luò)通過(guò)一種-做路由器或IP路由器的設(shè)備在物理上聯(lián)接在一起。路由器是一臺(tái)用來(lái)從一個(gè)網(wǎng)絡(luò)到另一個(gè)網(wǎng)絡(luò)傳輸數(shù)據(jù)包的計(jì)算機(jī)。在一個(gè)使用TCP/IP的內(nèi)部網(wǎng)中,信息通過(guò)使用一種獨(dú)立的叫做IP包(IPpacket)或IP數(shù)據(jù)報(bào)(IP datagrams)的數(shù)據(jù)單元進(jìn)-傳輸。TCP/IP軟件使得每臺(tái)聯(lián)到網(wǎng)絡(luò)上的計(jì)算機(jī)同其它計(jì)算機(jī)“看”起來(lái)一模一樣,事實(shí)上它隱藏了路由器和基本的網(wǎng)絡(luò)體系結(jié)進(jìn)入討論組討論。TCP/IP 在網(wǎng)路中所扮演的角色 TCP/IP 的全稱是 Transmission Control Protocol / Internet Protocol (TCP/IP)當(dāng)初是用來(lái)配合 ARPANET 來(lái)處理不同硬體之間的連接問(wèn)題的比如Sun系統(tǒng)和MainframeMainframe和個(gè)人電腦之間的連接。 Internet Protocol (IP) 工作于網(wǎng)路層它提供了一套標(biāo)準(zhǔn)讓不同的網(wǎng)路有規(guī)則可循當(dāng)然前提是您想使用 IP 從一個(gè)網(wǎng)路將封包路由到另一個(gè)網(wǎng)路。IP 在設(shè)計(jì)上是用來(lái)在 LAN 和 LAN 及 P C 和 PC 之間進(jìn)行傳輸每一臺(tái) PC 或每一個(gè) LAN都可以由一組 IP 位址來(lái)區(qū)分。一個(gè) IP 位址的格式是四個(gè)用小數(shù)點(diǎn)( . ) 分隔開(kāi)來(lái)的十進(jìn)位數(shù)字每各數(shù)值介乎于 0 到 255 之間。實(shí)實(shí)上,每一組數(shù)字在 IP 位址中是以 “Octet”的格式承現(xiàn)的,也就是完整的 8 個(gè) bit 。我們會(huì)在后面的網(wǎng)際網(wǎng)路層中詳細(xì)講解 IP 位址的所包含的信息和功用。 您可以把 IP 看成是游戲規(guī)則而 TCP 則用來(lái)詮釋這些規(guī)則的更準(zhǔn)確來(lái)說(shuō)TCP 在 IP 的基礎(chǔ)之上解釋了參與通訊的雙方是如何透過(guò) IP 進(jìn)行資料傳送的。TCP 提供了一套協(xié)定能夠?qū)㈦娔X之間使用的資料透過(guò)網(wǎng)路相互傳送同時(shí)也提供一套機(jī)制來(lái)確保資料傳送的準(zhǔn)確性和連續(xù)性。 雖然 TCP/IP 原先是專門為幾所大學(xué)和機(jī)構(gòu)的使用而設(shè)計(jì)的但現(xiàn)在TCP/IP已經(jīng)成為最流行的通訊協(xié)定了我們使用的Internet就是用TCP/IP來(lái)傳送封包的。4、 程序的總體設(shè)計(jì)服務(wù)器,使用ServerSocket監(jiān)聽(tīng)指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。 客戶端,使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開(kāi)會(huì)話;會(huì)話完成后,關(guān)閉Socket。客戶端不需要指定打開(kāi)的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。 Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來(lái)開(kāi)發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué)Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。 Socket接口設(shè)計(jì)者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個(gè)類似于打開(kāi)文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^(guò)該Socket實(shí)現(xiàn)的。 常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用。 Socket建立為了建立Socket,程序可以調(diào)用Socket函數(shù),該函數(shù)返回一個(gè)類似于文件描述符的句柄。socket函數(shù)原型為:int socket(int domain, int type, int protocol);domain指明所使用的協(xié)議族,通常為PF_INET,表示互聯(lián)網(wǎng)協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型:SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol通常賦值0。Socket()調(diào)用返回一個(gè)整型socket描述符,你可以在后面的調(diào)用使用它。 Socket描述符是一個(gè)指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描述符表入口。調(diào)用Socket函數(shù)時(shí),socket執(zhí)行體將建立一個(gè)Socket,實(shí)際上建立一個(gè)Socket意味著為一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間。 Socket執(zhí)行體為你管理描述符表。兩個(gè)網(wǎng)絡(luò)程序之間的一個(gè)網(wǎng)絡(luò)連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。 socket在測(cè)量軟件中的使用也很廣泛5、 程序源代碼及運(yùn)行截圖服務(wù)端:import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import .*;import java.io.*;/* * 聊天服務(wù)端的主框架類 */public class ChatServer extends JFrame implements ActionListenerpublic static int port = 8888;/服務(wù)端的偵聽(tīng)端口ServerSocket serverSocket;/服務(wù)端SocketImage icon;/程序圖標(biāo)JComboBox combobox;/選擇發(fā)送消息的接受者JTextArea messageShow;/服務(wù)端的信息顯示JScrollPane messageScrollPane;/信息顯示的滾動(dòng)條JTextField showStatus;/顯示用戶連接狀態(tài)JLabel sendToLabel,messageLabel;JTextField sysMessage;/服務(wù)端消息的發(fā)送JButton sysMessageButton;/服務(wù)端消息的發(fā)送按鈕UserLinkList userLinkList;/用戶鏈表/建立菜單欄JMenuBar jMenuBar = new JMenuBar(); /建立菜單組JMenu serviceMenu = new JMenu (服務(wù)(V); /建立菜單項(xiàng)JMenuItem portItem = new JMenuItem (端口設(shè)置(P);JMenuItem startItem = new JMenuItem (啟動(dòng)服務(wù)(S);JMenuItem stopItem=new JMenuItem (停止服務(wù)(T);JMenuItem exitItem=new JMenuItem (退出(X);JMenu helpMenu=new JMenu (幫助(H);JMenuItem helpItem=new JMenuItem (幫助(H);/建立工具欄JToolBar toolBar = new JToolBar();/建立工具欄中的按鈕組件JButton portSet;/啟動(dòng)服務(wù)端偵聽(tīng)JButton startServer;/啟動(dòng)服務(wù)端偵聽(tīng)JButton stopServer;/關(guān)閉服務(wù)端偵聽(tīng)JButton exitButton;/退出按鈕/框架的大小Dimension faceSize = new Dimension(400, 600);ServerListen listenThread;JPanel downPanel ;GridBagLayout girdBag;GridBagConstraints girdBagCon;/* * 服務(wù)端構(gòu)造函數(shù) */public ChatServer()init();/初始化程序/添加框架的關(guān)閉事件處理this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();/設(shè)置框架的大小this.setSize(faceSize);/設(shè)置運(yùn)行時(shí)窗口的位置Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - faceSize.getWidth() / 2, (int) (screenSize.height - faceSize.getHeight() / 2);this.setResizable(false);this.setTitle(聊天室服務(wù)端); /設(shè)置標(biāo)題/程序圖標(biāo)icon = getImage(icon.gif);this.setIconImage(icon); /設(shè)置程序圖標(biāo)show();/為服務(wù)菜單欄設(shè)置熱鍵VserviceMenu.setMnemonic(V);/為端口設(shè)置快捷鍵為ctrl+pportItem.setMnemonic (P); portItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK);/為啟動(dòng)服務(wù)快捷鍵為ctrl+sstartItem.setMnemonic (S); startItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK);/為端口設(shè)置快捷鍵為ctrl+TstopItem.setMnemonic (T); stopItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK);/為退出設(shè)置快捷鍵為ctrl+xexitItem.setMnemonic (X); exitItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK);/為幫助菜單欄設(shè)置熱鍵HhelpMenu.setMnemonic(H);/為幫助設(shè)置快捷鍵為ctrl+phelpItem.setMnemonic (H); helpItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK);/* * 程序初始化函數(shù) */public void init()Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout();/添加菜單欄serviceMenu.add (portItem);serviceMenu.add (startItem);serviceMenu.add (stopItem);serviceMenu.add (exitItem);jMenuBar.add (serviceMenu); helpMenu.add (helpItem);jMenuBar.add (helpMenu); setJMenuBar (jMenuBar);/初始化按鈕portSet = new JButton(端口設(shè)置);startServer = new JButton(啟動(dòng)服務(wù));stopServer = new JButton(停止服務(wù) );exitButton = new JButton(退出 );/將按鈕添加到工具欄toolBar.add(portSet);toolBar.addSeparator();/添加分隔欄toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();/添加分隔欄toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);/初始時(shí),令停止服務(wù)按鈕不可用stopServer.setEnabled(false);stopItem .setEnabled(false);/為菜單欄添加事件監(jiān)聽(tīng)portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);/添加按鈕的事件偵聽(tīng)portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);combobox = new JComboBox();combobox.insertItemAt(所有人,0);combobox.setSelectedIndex(0);messageShow = new JTextArea();messageShow.setEditable(false);/添加滾動(dòng)條messageScrollPane = new JScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400);messageScrollPane.revalidate();showStatus = new JTextField(35);showStatus.setEditable(false);sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setText(發(fā)送);/添加系統(tǒng)消息的事件偵聽(tīng)sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(發(fā)送至:);messageLabel = new JLabel(發(fā)送消息:);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel( );girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.gridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);/關(guān)閉程序時(shí)的操作this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)stopService();System.exit(0););/* * 事件處理 */public void actionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = startServer | obj = startItem) /啟動(dòng)服務(wù)端startService();else if (obj = stopServer | obj = stopItem) /停止服務(wù)端int j=JOptionPane.showConfirmDialog(this,真的停止服務(wù)嗎?,停止服務(wù),JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();else if (obj = portSet | obj = portItem) /端口設(shè)置/調(diào)出端口設(shè)置的對(duì)話框PortConf portConf = new PortConf(this);portConf.show();else if (obj = exitButton | obj = exitItem) /退出程序int j=JOptionPane.showConfirmDialog(this,真的要退出嗎?,退出,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();System.exit(0);else if (obj = helpItem) /菜單欄中的幫助/調(diào)出幫助對(duì)話框Help helpDialog = new Help(this);helpDialog.show();else if (obj = sysMessage | obj = sysMessageButton) /發(fā)送系統(tǒng)消息sendSystemMessage();/* * 啟動(dòng)服務(wù)端 */public void startService()tryserverSocket = new ServerSocket(port,10);messageShow.append(服務(wù)端已經(jīng)啟動(dòng),在+port+端口偵聽(tīng).n);startServer.setEnabled(false);startItem.setEnabled(false);portSet.setEnabled(false);portItem.setEnabled(false);stopServer .setEnabled(true);stopItem .setEnabled(true);sysMessage.setEnabled(true);catch (Exception e)/System.out.println(e);userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();/* * 關(guān)閉服務(wù)端 */public void stopService()try/向所有人發(fā)送服務(wù)器關(guān)閉的消息sendStopToAll();listenThread.isStop = true;serverSocket.close();int count = userLinkList.getCount();int i =0;while( i count)Node node = userLinkList.findUser(i);node.input .close();node.output.close();node.socket.close();i +;stopServer .setEnabled(false);stopItem .setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append(服務(wù)端已經(jīng)關(guān)閉n);combobox.removeAllItems();combobox.addItem(所有人);catch(Exception e)/System.out.println(e);/* * 向所有人發(fā)送服務(wù)器關(guān)閉的消息 */public void sendStopToAll()int count = userLinkList.getCount();int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;continue;trynode.output.writeObject(服務(wù)關(guān)閉);node.output.flush();catch (Exception e)/System.out.println($+e);i+;/* * 向所有人發(fā)送消息 */public void sendMsgToAll(String msg)int count = userLinkList.getCount();/用戶總數(shù)int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;continue;trynode.output.writeObject(系統(tǒng)信息);node.output.flush();node.output.writeObject(msg);node.output.flush();catch (Exception e)/System.out.println(+e);i+;sysMessage.setText();/* * 向客戶端用戶發(fā)送消息 */public void sendSystemMessage()String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText() + n;messageShow.append(message);/向所有人發(fā)送消息if(toSomebody.equalsIgnoreCase(所有人)sendMsgToAll(message);else/向某個(gè)用戶發(fā)送消息Node node = userLinkList.findUser(toSomebody);trynode.output.writeObject(系統(tǒng)信息);node.output.flush();node.output.writeObject(message);node.output.flush();catch(Exception e)/System.out.println(!+e);sysMessage.setText();/將發(fā)送消息欄的消息清空/* * 通過(guò)給定的文件名獲得圖像 */Image getImage(String filename) URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();URL url = null;Image image = null;url = urlLoader.findResource(filename);image = Toolkit.getDefaultToolkit().getImage(url);MediaTracker mediatracker = new MediaTracker(this);try mediatracker.addImage(image, 0);mediatracker.waitForID(0);catch (InterruptedException _ex) image = null;if (mediatracker.isErrorID(0) image = null;return image;public static void main(String args) ChatServer app = new ChatServer();客戶端:import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.io.*;import .*;/* * 聊天客戶端的主框架類 */public class ChatClient extends JFrame implements ActionListenerString ip = ;/連接到服務(wù)端的ip地址int port = 8888;/連接到服務(wù)端的端口號(hào)String userName = 匆匆過(guò)客;/用戶名int type = 0;/0表示未連接,1表示已連接Image icon;/程序圖標(biāo)JComboBox combobox;/選擇發(fā)送消息的接受者JTextArea messageShow;/客戶端的信息顯示JScrollPane messageScrollPane;/信息顯示的滾動(dòng)條JLabel express,sendToLabel,messageLabel ;JTextField clientMessage;/客戶端消息的發(fā)送JCheckBox checkbox;/悄悄話JComboBox actionlist;/表情選擇JButton clientMessageButton;/發(fā)送消息JTextField showStatus;/顯示用戶連接狀態(tài)Socket socket;ObjectOutputStream output;/網(wǎng)絡(luò)套接字輸出流ObjectInputStream input;/網(wǎng)絡(luò)套接字輸入流ClientReceive recvThread;/建立菜單欄JMenuBar jMenuBar = new JMenuBar(); /建立菜單組JMenu operateMenu = new JMenu (操作(O); /建立菜單項(xiàng)JMenuItem loginItem = new JMenuItem (用戶登錄(I);JMenuItem logoffItem = new JMenuItem (用戶注銷(L);JMenuItem exitItem=new JMenuItem (退出(X);JMenu conMenu=new JMenu (設(shè)置(C);JMenuItem userItem=new JMenuItem (用戶設(shè)置(U);JMenuItem connectItem=new JMenuItem (連接設(shè)置(C);JMenu helpMenu=new JMenu (幫助(H);JMenuItem helpItem=new JMenuItem (幫助(H);/建立工具欄JToolBar toolBar = new JToolBar();/建立工具欄中的按鈕組件JButton loginButton;/用戶登錄JButton logoffButton;/用戶注銷JButton userButton;/用戶信息的設(shè)置JButton connectButton;/連接設(shè)置JButton exitButton;/退出按鈕/框架的大小Dimension faceSize = new Dimension(400, 600);JPanel downPanel ;GridBagLayout girdBag;GridBagConstraints girdBagCon;public ChatClient()init();/初始化程序/添加框架的關(guān)閉事件處理this.setDefaultCloseOperation(JFrame.E
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理質(zhì)控整改措施風(fēng)險(xiǎn)評(píng)估
- 語(yǔ)言文字工作領(lǐng)導(dǎo)小組職責(zé)法制保障研究
- 科研項(xiàng)目質(zhì)量保障2025年工作計(jì)劃
- 腫瘤醫(yī)院醫(yī)務(wù)科職責(zé)他
- 青藍(lán)工程徒弟骨干成長(zhǎng)計(jì)劃
- 音樂(lè)學(xué)專業(yè)實(shí)習(xí)總結(jié)范文
- 2025年行政人事部崗位競(jìng)聘計(jì)劃
- 以建構(gòu)主義重塑語(yǔ)文閱讀課堂:理論、實(shí)踐與創(chuàng)新發(fā)展
- 以實(shí)驗(yàn)為翼:物理教學(xué)中實(shí)驗(yàn)?zāi)芰ε囵B(yǎng)的探索與實(shí)踐
- 以實(shí)證探究篇章認(rèn)知分析法在大學(xué)英語(yǔ)精讀教學(xué)中的應(yīng)用與成效
- 新人教版九年級(jí)物理全冊(cè)知識(shí)點(diǎn)總結(jié)(課堂筆記)
- DB13T 5519.7-2022 軌道交通AFC系統(tǒng)線網(wǎng)技術(shù)要求 第7部分:數(shù)據(jù)接口
- 駐戈壁某部隊(duì)糖尿病流行病學(xué)調(diào)查
- 《網(wǎng)店運(yùn)營(yíng)與管理》整本書電子教案全套教學(xué)教案
- GB 27954-2020 黏膜消毒劑通用要求
- 中考《紅星照耀中國(guó)》各篇章練習(xí)題及答案(1-12)
- (完整版)ECRS培訓(xùn)課件
- 外輪理貨工作英語(yǔ)
- 河流改道施工方案
- 技術(shù)規(guī)格書Word版
- 《醫(yī)療機(jī)構(gòu)使用統(tǒng)一的〈北京地區(qū)醫(yī)療機(jī)構(gòu)門急診病歷手冊(cè)〉有關(guān)規(guī)
評(píng)論
0/150
提交評(píng)論