第一篇:java局域聊天室實(shí)踐總結(jié)
河北科技師范學(xué)院
JAVA程序設(shè)計(jì)課程設(shè)計(jì)
個(gè)人實(shí)習(xí)總結(jié)
實(shí)習(xí)類型 課程設(shè)計(jì) 實(shí)習(xí)單位 指導(dǎo)教師 所在院(系)信息技術(shù)系 班 級(jí) 姓 名 學(xué)
號(hào)
_
一、實(shí)習(xí)時(shí)間和地點(diǎn)
時(shí)間:2015.3.17-2015.4.14 地點(diǎn):F310、F311
二、實(shí)習(xí)的內(nèi)容
我所開發(fā)的系統(tǒng)是:局域網(wǎng)聊天系統(tǒng)。系統(tǒng)功能簡(jiǎn)要說明如下:
該程序?qū)崿F(xiàn)局域網(wǎng)內(nèi)的聊天功能,包括服務(wù)器端程序和客戶端程序兩部分。
1、服務(wù)器:負(fù)責(zé)處理各個(gè)客戶端的信息,并負(fù)責(zé)將信息進(jìn)行轉(zhuǎn)發(fā)。①服務(wù)器主要負(fù)責(zé)響應(yīng)客戶端的的各種信息,包括鏈接服務(wù)器,用戶信息發(fā)送,各個(gè)客戶端的信息相互轉(zhuǎn)發(fā)。②服務(wù)器的實(shí)現(xiàn)有Server類,Server類主要是進(jìn)行初始化的工作
2、客戶端:用戶使用界面,負(fù)責(zé)接受信息以及與服務(wù)器進(jìn)行通信。①客戶端負(fù)責(zé)為用戶提供聊天界面,將信息發(fā)送至服務(wù)器,接受服務(wù)器的反饋信息等一系列的工作。②客戶端的實(shí)現(xiàn)有Client類,Client類負(fù)責(zé)與服務(wù)器,其它客戶端進(jìn)行通信。
1.連接:點(diǎn)擊“連接”按鈕之后將信息發(fā)送到服務(wù)器端,服務(wù)器端創(chuàng)建相應(yīng)的連接,并將更新后的用戶列表發(fā)送給所有用戶。2.發(fā)送:根據(jù)發(fā)送者、發(fā)送對(duì)象、發(fā)送的話創(chuàng)建一個(gè)字段發(fā)送到服務(wù)器端。3.清空:清空客戶端接收信息聊天對(duì)話框。4.私聊TA:選擇在線主機(jī)ip,根據(jù)ip地址發(fā)送一個(gè)私密聊天請(qǐng)求到服務(wù)器,服務(wù)器選擇相
應(yīng)的地址進(jìn)行信息發(fā)送。本程序可以有多個(gè)用戶,只需在一臺(tái)服務(wù)器上運(yùn)行服務(wù)端程序,所有的用戶連接上了之后就可以正常通信。
人們?nèi)粘I钪性絹?lái)越多地使用聊天室這項(xiàng)應(yīng)用來(lái)為自己的工作和學(xué)習(xí)服務(wù)。一個(gè)操作簡(jiǎn)單,界面友好、運(yùn)行穩(wěn)定的聊天室對(duì)于小型局域網(wǎng)的用戶可以起到很好的交流作用。所謂聊天室就是一個(gè)可以讓許多用戶同時(shí)互相通信的網(wǎng)上園地,個(gè)人用戶可以通過聊天室將自己融入整個(gè)主流社會(huì)中。因此我們這個(gè)聊天室選擇了簡(jiǎn)潔的界面搭建。因?yàn)橹皩W(xué)過JFrame類的使用,所以界面搭建部分代碼如下:
public class TCPClient extends JFrame {
public static String olip;private static final long serialVersionUID = 1L;JTextArea jtaContent = new JTextArea();JTextField jtaInstant = new JTextField();JButton jbSend = new JButton(“發(fā)送”);JButton jbConnect = new JButton(“連接”);JButton jbClear = new JButton(“清空”);JLabel jlTip=new JLabel(“在線主機(jī)”);JButton jbPChat=new JButton(“私聊TA”);JPanel jpBtns = new JPanel();JPanel jpContact=new JPanel();jtaContent.setEditable(false);jpBtns.setLayout(new GridLayout(1, 3, 5, 5));jpBtns.add(jbConnect);jpBtns.add(jbSend);jpBtns.add(jbClear);jpBtns.setBounds(0, 375, 350, 30);JScrollPane jspText=new JScrollPane(jtaInstant);jspText.setBounds(0, 310, 350, 65);JScrollPane jspContactOL=new JScrollPane(jcbContact);JScrollPane jspContent=new JScrollPane(jtaContent);jspContent.setBounds(0, 0, 350, 300);jpContact.setLayout(new GridLayout(5, 5, 1, 3));jpContact.add(jlTip);jpContact.add(jspContactOL);jpContact.add(jbPChat);jpContact.setBounds(350, 0, 135, 220);public void launchFrame(){
add(jpContact);add(jpBtns);add(jspText);add(jspContent);setLayout(null);setSize(500, 450);setLocation(100, 100);setTitle(“Chat Client”);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);由于本人學(xué)習(xí)的java不是特別扎實(shí),所以界面的設(shè)計(jì)代碼經(jīng)過參考反復(fù)實(shí)驗(yàn)才達(dá)到要求。界面完成后才發(fā)現(xiàn)真正的挑戰(zhàn)剛剛開始。我們需要得到本機(jī)ip地址并傳送至服務(wù)器,部分代碼如下:
InetAddress
myIP;myIP=InetAddress.getLocalHost();s = new Socket(myIP.getHostAddress(), 9402);然后我們發(fā)送IP地址,其他客戶端收到此地址時(shí)會(huì)判別,判別為IP地址,其它客戶端會(huì)將這一IP地址規(guī)劃為在線用戶:
InetAddressmyIP;myIP=InetAddress.getLocalHost();strIP=myIP.getHostAddress();dos.writeUTF(“a”+strIP);我們還設(shè)計(jì)了一個(gè)私聊功能,所以就需要實(shí)現(xiàn)事件的監(jiān)聽: Timer tm1=newTimer(1000,newActionListener(){ @Override public voidactionPerformed(ActionEvent e){ tm3.stop();jbPChat.setText(“通知”);tm2.start();}});Timer tm2=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm1.stop();jbPChat.setText(“有私聊消息”);tm3.start();}});
Timer tm3=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm2.stop();jbPChat.setText(“請(qǐng)查收”);tm1.start();}});這樣,當(dāng)有私聊信息請(qǐng)求傳送過來(lái)時(shí)通過這些提醒就可以實(shí)現(xiàn)私聊功能。起初我們有這些功能的想法,覺得通過網(wǎng)絡(luò)書籍能夠很方便的查找到??墒菍?shí)際操作實(shí)驗(yàn)中遇到了不少困難。比如這個(gè)私聊功能的實(shí)現(xiàn)。剛開始連接成功后選擇私聊對(duì)象,我們決定以IP地址為依據(jù)。加入選擇IP地址功能后點(diǎn)擊私聊,發(fā)現(xiàn)客戶端可以收到私聊提示,可是卻收不到具體的文字信息。為此我們查找了大量信息,終于成功的實(shí)現(xiàn)了私聊功能。
后來(lái)我想,能不能讓服務(wù)器端連接數(shù)據(jù)庫(kù)。在客戶端設(shè)置一個(gè)注冊(cè)界面,讓用戶更具體化,這樣識(shí)別身份時(shí)就不用再使用IP地址??蛻舳擞脩舻淖?cè)信息會(huì)保存在數(shù)據(jù)庫(kù)里,下次登錄客戶端就用屬于個(gè)人的ID和密碼。首先要實(shí)現(xiàn)用戶的注冊(cè):
public void register(){ String strServerIp = txtHost.getText();String strServerPort=txtPort.getText();this.dispose();new Register(strServerIp,strServerPort);然后向服務(wù)器端發(fā)送“注冊(cè)”的命令。服務(wù)器處理接收到的命令為“注冊(cè)”時(shí)調(diào)用函數(shù),合法注冊(cè)后,向客戶端發(fā)送“注冊(cè)成功”的消息,并斷開連接。由于時(shí)間關(guān)系,數(shù)據(jù)庫(kù)未能完成,希望下次有機(jī)會(huì)可以完善。
三、心得體會(huì)
1.成績(jī)與收獲
這次軟件開發(fā)讓我學(xué)到了很多知識(shí)。只是只有轉(zhuǎn)變成實(shí)際而有用的東西才能顯現(xiàn)出它的價(jià)值。學(xué)習(xí)不只是學(xué)習(xí)理論只是,更重要的是自己的動(dòng)手操作能力。這個(gè)軟件工程的項(xiàng)目實(shí)戰(zhàn)讓我真切感受到軟件開發(fā)的全過程,這讓我明白軟件的開發(fā)是一門藝術(shù),而不是代碼的簡(jiǎn)單疊加。這需要一個(gè)小組的共同努力。這次開發(fā)讓我跟深入的去思考了一個(gè)軟件的構(gòu)成與實(shí)現(xiàn)。以前用通訊軟件是從未思考過如何實(shí)現(xiàn)它的功能,等自己來(lái)做是才發(fā)現(xiàn)里面要考慮的東西很多。在實(shí)踐中,我也學(xué)到了很多java編程方面的知識(shí)。2.問題與不足
由于java編程運(yùn)用的不是特別熟練,加上時(shí)間問題,我們的程序還有很多不盡
如人意的地方。例如:很多功能沒有實(shí)現(xiàn)(語(yǔ)音視頻,文件傳輸,個(gè)人信息等等),并且界面比較粗糙。這些都是以后需要努力的地方。水平所限,致使程序?qū)崿F(xiàn)的功能在方法上也許不是很完美,但我以后會(huì)多向老師請(qǐng)教,自己也要加強(qiáng)對(duì)java的學(xué)習(xí)。努力進(jìn)一步提高自己的編程水平。
第二篇:java聊天室設(shè)計(jì)總結(jié)
JAVA聊天室程序設(shè)計(jì)總結(jié)
大二第一學(xué)期末我們進(jìn)行了為期兩周的java實(shí)習(xí),這次的實(shí)習(xí)內(nèi)容是設(shè)計(jì)一個(gè)多人聊天室。在網(wǎng)絡(luò)越來(lái)越發(fā)達(dá)的今天,人們對(duì)網(wǎng)絡(luò)的依賴越來(lái)越多,越來(lái)越離不開網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來(lái)越多,類似QQ、MSN,網(wǎng)絡(luò)聊天時(shí)一類的聊天系統(tǒng)的發(fā)展日新月異,因此老師布置了制作一個(gè)有簡(jiǎn)單聊天功能的網(wǎng)絡(luò)聊天程序的課程;而且通過制作該程序還能更好的學(xué)習(xí)網(wǎng)絡(luò)軟件編程知識(shí)。
一、設(shè)計(jì)內(nèi)容
利用java語(yǔ)言實(shí)現(xiàn)聊天室程序。聊天室分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負(fù)責(zé)偵聽客戶端發(fā)來(lái)的消息,客戶端需登錄到服務(wù)器端才可以實(shí)現(xiàn)正常的聊天功能。設(shè)計(jì)的聊天室能實(shí)現(xiàn)用戶登錄,顯示登錄用戶列表,以及發(fā)送聊天信息和顯示聊天信息的功能。并可以選擇接收信息的用戶進(jìn)行單發(fā)或群發(fā)的功能,運(yùn)行程序,登錄服務(wù)器后,可以從列表中選擇單個(gè)或多個(gè)用戶進(jìn)行聊天,它是圖形界面,線程,流與文件系統(tǒng)等技術(shù)的綜合應(yīng)用。
二、實(shí)現(xiàn)功能
1、啟動(dòng)服務(wù)器端,接收客戶端發(fā)來(lái)的信息,并在服務(wù)器端窗體顯示客戶端聊天信息,再吧信息返給在線用戶。
2、啟動(dòng)客戶端,進(jìn)入客戶端頁(yè)面,輸入用戶名,點(diǎn)擊登錄按鈕,在顯示在線用戶列表內(nèi)顯示用戶名。
3、發(fā)送編輯框輸入發(fā)送內(nèi)容,單擊發(fā)送按鈕,啟動(dòng)輸出流,把信息發(fā)送出去,同時(shí)把發(fā)出的信息追加到聊天內(nèi)容文本域內(nèi),顯示用戶名,時(shí)間和發(fā)送內(nèi)容。
4、聊天信息文本域,在線用戶顯示域和發(fā)送信息的文本域加了滾動(dòng)條,其中聊天信息文本域,發(fā)送信息的文本域的文字能自動(dòng)換行。
5、別的客戶端發(fā)來(lái)信息是通過輸入流讀取信息,并截取發(fā)來(lái)信息的用戶名及信息,用戶名加到在線用戶列表上顯示在線,信息追加到聊天內(nèi)容文本域內(nèi),顯示用戶名,時(shí)間和發(fā)送內(nèi)容。
三、設(shè)計(jì)收獲
這是大學(xué)以來(lái)第一次自主設(shè)計(jì)一個(gè)聊天程序,于我來(lái)說還是很有新鮮感但同時(shí)也有著稍許擔(dān)心。通過此次課程設(shè)計(jì),將我本學(xué)期所學(xué)的JAVA知識(shí)得到鞏固和應(yīng)用,在設(shè)計(jì)的過程中我遇到了很到問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查和在老師、同學(xué)們的幫助下,慢慢的走上了成功之路,同時(shí)也暴露出了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。這次課程設(shè)計(jì)還讓我懂得了寫程序不能閉門造車,要努力拓寬知識(shí)面,開闊視野,拓展思維。它還讓我學(xué)會(huì)了在網(wǎng)上查閱那些無(wú)限的資料。讓我不僅學(xué)會(huì)了書本上的知識(shí),還讓自己能夠面對(duì)困難并且克服它使我更加扎實(shí)的掌握了有關(guān)JAVA方面的知識(shí)。過而能改,善莫大焉。在聊天室設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲齲最終的檢測(cè)調(diào)試環(huán)節(jié),本身就是在踐行“過而能改,善莫大焉”的知行觀。程序雖然完成,但是距離優(yōu)秀仍存在一定差距,用JAVA開發(fā)大型項(xiàng)目還有很多我需要去努力學(xué)習(xí)的知識(shí)。希望自己能不斷學(xué)習(xí)和實(shí)踐,爭(zhēng)取以后做得更好。
第三篇:JAVA聊天室實(shí)驗(yàn)報(bào)告
Java聊天室實(shí)驗(yàn)報(bào)告
班 級(jí):學(xué) 號(hào):姓 名:
****** ******** ***
目錄:
一、實(shí)驗(yàn)?zāi)康?......................................................3
二、所需技術(shù).......................................................3
三、需求分析.......................................................3
四、系統(tǒng)設(shè)計(jì).......................................................4
1、服務(wù)器結(jié)構(gòu)..................................................4
2、客戶端結(jié)構(gòu)..................................................4
五、實(shí)現(xiàn)細(xì)節(jié).......................................................5
1、客戶端細(xì)節(jié)...................................................5
2、服務(wù)器細(xì)節(jié)...................................................6
六、系統(tǒng)展示.......................................................7
七、實(shí)驗(yàn)小結(jié).......................................................9
Rain153 WeChat 聊天室系統(tǒng)一、實(shí)驗(yàn)?zāi)康模?/p>
1、使用Java技術(shù)完成聊天室系統(tǒng),深入學(xué)習(xí)使用Java語(yǔ)言。
2、使用Java 的多線程機(jī)制,深入理解Java多線程技術(shù)的應(yīng)用。
3、使用GUI,對(duì)JFrame的深入學(xué)習(xí)。
4、使用網(wǎng)絡(luò)編程,掌握基于TCP協(xié)議的Socket編程,了解Socket編程的協(xié)議約定,掌握簡(jiǎn)單應(yīng)用協(xié)議的開發(fā)。
5、使用C/S架構(gòu),對(duì)網(wǎng)絡(luò)編程有一定的了解。
二、所需技術(shù)
本系統(tǒng)要求使用java技術(shù)開發(fā)。所需知識(shí)包括java程序設(shè)計(jì)語(yǔ)言、swing基本GUI組件、多線程編程、socket編程、集成開發(fā)環(huán)境使用eclipse。系統(tǒng)采用兩層C/S體系結(jié)構(gòu),C端負(fù)責(zé)通過GUI與客戶交互,實(shí)現(xiàn)注冊(cè)、登陸、收發(fā)信息、退出等功能; S端是聊天系統(tǒng)的服務(wù)器。
三、需求分析
開發(fā)一個(gè)類似QQ 的聊天室系統(tǒng),即WeChat聊天系統(tǒng)。該系統(tǒng)應(yīng)具有如下功能:
1、2、用戶注冊(cè)、登錄 群聊;
3、私聊;
4、服務(wù)器發(fā)送系統(tǒng)消息;
5、服務(wù)器踢人;
6、保存日志;
7、保存聊天信息;
四、系統(tǒng)設(shè)計(jì)
1、服務(wù)器結(jié)構(gòu)
啟動(dòng)服務(wù)器監(jiān)聽AppServer服務(wù)器控制監(jiān)聽窗體ServerFrameConnection處理所有用戶請(qǐng)求
服務(wù)器端結(jié)構(gòu)圖示
2、客戶端結(jié)構(gòu)
啟動(dòng)客戶端ChatClient用戶登錄窗體Login用戶聊天主窗體ChatRoom時(shí)鐘窗體ClockRegister用戶注冊(cè)窗體Windowclose用戶窗體監(jiān)聽器
客戶端結(jié)構(gòu)圖示
1、AppServer.java
為服務(wù)器端監(jiān)聽類,負(fù)責(zé)服務(wù)器的啟動(dòng),包括啟動(dòng)監(jiān)聽端口、服務(wù)器監(jiān)控界面。
2、ServerFrame.java 為服務(wù)器監(jiān)控窗體,負(fù)責(zé)監(jiān)控服務(wù)器運(yùn)行狀態(tài)。
3、Connection.java 為服務(wù)器連接處理的具體實(shí)現(xiàn)。
4、ChatClient.java 為客戶端程序啟動(dòng)類,負(fù)責(zé)客戶端的啟動(dòng)和退出。
5、Login.java 為客戶端程序登錄界面,負(fù)責(zé)用戶帳號(hào)信息的驗(yàn)證與反饋。
6、Register.java 為客戶端程序注冊(cè)界面,負(fù)責(zé)用戶帳號(hào)信息的注冊(cè)驗(yàn)證與反饋。
7、ChatRoom.java 為客戶端程序聊天室主界面,負(fù)責(zé)接收、發(fā)送聊天內(nèi)容與服務(wù)器的Connection合作。
8、Windowclose 為ChatRoom.java的內(nèi)部類,負(fù)責(zé)監(jiān)聽聊天室界面的操作,當(dāng)用戶退出時(shí)返回給服務(wù)器信息。
9、Clock.java 為客戶端程序的一個(gè)小程序,實(shí)現(xiàn)的一個(gè)石英鐘功能。(可選)
五、實(shí)現(xiàn)細(xì)節(jié)
概述:聊天室主要功能的實(shí)現(xiàn):從界面輸入登錄信息,然后與服務(wù)器建立Socket連接(連接時(shí)應(yīng)指定服務(wù)器的IP地址和端口號(hào),而客戶端socket的端口由本方操作系統(tǒng)從空閑端口中確定),服務(wù)器端的“傾聽Socket”收到連接請(qǐng)求后,一般會(huì)接受連接請(qǐng)求,并生成一個(gè)服務(wù)端socket,專門負(fù)責(zé)與此客戶端socket的通信。一旦連接請(qǐng)求成功,客戶端將信息及請(qǐng)求通過本方socket的輸出流發(fā)送給服務(wù)器端相應(yīng)的socket,服務(wù)端則通過服務(wù)器端Socket的輸入流接受客戶端傳輸過來(lái)的信息及請(qǐng)求,分析是何請(qǐng)求,然后根據(jù)請(qǐng)求類型,進(jìn)行相應(yīng)的處理(如登錄、轉(zhuǎn)發(fā)信息等)。服務(wù)方也可以根據(jù)需要,通過socket的輸出流發(fā)信息和請(qǐng)求給客戶端(公告)??蛻舴胶头?wù)方都可以通過關(guān)閉本方的socket而結(jié)束一次通訊過程。為了實(shí)現(xiàn)多客戶在線的請(qǐng)求,使用多線程機(jī)制來(lái)處理,對(duì)每一個(gè)客戶端連接通訊,服務(wù)器端都有一個(gè)線程專門負(fù)責(zé)處理。
一)客戶端細(xì)節(jié)
1、注冊(cè):
當(dāng)選擇注冊(cè)時(shí),Register界面等待用戶輸入注冊(cè)信息,并將信息封裝成Register_Customer類,然后通過建立在Socket的連接之上的對(duì)象輸出流將用戶注冊(cè)信息發(fā)送給服務(wù)器端,服務(wù)器端將請(qǐng)求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后將驗(yàn)證數(shù)據(jù)的完整性并在數(shù)據(jù)庫(kù)中查找該用戶名是否已經(jīng)注冊(cè),然后將注冊(cè)信息加入數(shù)據(jù)庫(kù),最后將注冊(cè)結(jié)果返回給客戶端。客戶端顯示注冊(cè)結(jié)果。
2、登錄:
當(dāng)選擇登錄時(shí),客戶端由Login 界面等待用戶輸入登錄信息后,封裝成Customer對(duì)象類然后通過建立在Socket的連接之上的對(duì)象輸出流將用戶登錄信息發(fā)送給服務(wù)器端,服務(wù)器端將請(qǐng)求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后將驗(yàn)證數(shù)據(jù)的完整性并在對(duì)象型數(shù)據(jù)庫(kù)中查找該用戶名是否已經(jīng)注冊(cè),然后將注冊(cè)用戶的信息與登錄請(qǐng)求信息進(jìn)行密碼驗(yàn)證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給客戶端。若登錄成功,客戶端將啟動(dòng)聊天室主界面。
3、聊天 a、發(fā)送聊天信息:私聊功能需在在線列表中選中私聊聊天對(duì)象,并勾選私聊選項(xiàng)。群聊功能取消對(duì)私聊功能的勾選即可。當(dāng)用戶點(diǎn)擊完發(fā)送按鈕后,程序開始將當(dāng)前用戶名、聊天對(duì)象、聊天內(nèi)容、表情和是否私聊進(jìn)行封裝,然后獲取Socket連接,再用對(duì)象輸出流包裝Socket的輸出流將聊天信息對(duì)象發(fā)送給服務(wù)器端。
b、接收聊天信息:用一個(gè)單獨(dú)的接收線程實(shí)現(xiàn),客戶端必須隨時(shí)接收服務(wù)器發(fā)來(lái)的消息,而讀取消息的方法采用的是阻塞式方法,若在事件處理程序中讀(占用的是事件處理線程)則會(huì)使程序在此后無(wú)法響應(yīng)用戶操作,所以需要生成一個(gè)單獨(dú)的線程專門用于讀取處理消息。而發(fā)送消息的方法則是將消息放入操作系統(tǒng)的發(fā)送緩沖區(qū)后就返回的,所以發(fā)送執(zhí)行的相當(dāng)快,可以在事件處理線程中直接調(diào)用。發(fā)送和接收可以同時(shí)進(jìn)行。二)服務(wù)器端細(xì)節(jié)
1、注冊(cè):創(chuàng)建一個(gè)File文件類,載入“user.txt”,再用對(duì)象輸入流ObjectInputStream包裝File文件類,將存儲(chǔ)在“user.txt”得向量對(duì)象Vector中載入內(nèi)存中,現(xiàn)在系統(tǒng)中的向量就是對(duì)象型數(shù)據(jù)庫(kù),存儲(chǔ)著每條用戶信息對(duì)象。判斷是否是第一個(gè)注冊(cè)用戶,判斷用戶名是否已經(jīng)存在,判斷用戶名是否為系統(tǒng)關(guān)鍵字,用戶名有效后 寫入數(shù)據(jù)庫(kù),并給客戶端返回信息,關(guān)閉Socket連接。
2、登錄:去數(shù)據(jù)庫(kù)讀用戶數(shù)據(jù),打開用戶數(shù)據(jù)庫(kù)文件“user.txt”,將用戶數(shù)據(jù)對(duì)象集載入內(nèi)存,以供下面的程序使用。驗(yàn)證用戶名是否存在,驗(yàn)證用戶密碼是否正確,驗(yàn)證用戶是否已經(jīng)登錄,驗(yàn)證是否已經(jīng)超過最大登錄人數(shù),如果以上驗(yàn)證全部正確,返回客戶端信息,關(guān)閉Socket連接。
3、退出:接收退出信息,當(dāng)用戶退出時(shí),客戶端將會(huì)用基于Socket的對(duì)象輸出流發(fā)給服務(wù)器退出對(duì)象,把用戶從在線列表中刪除,更新在線列表。
4、聊天:接收用戶聊天信息,當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會(huì)收到客戶端用Socket傳輸過來(lái)的聊天信息對(duì)象,然后將其轉(zhuǎn)換為Message對(duì)象,返回聊天信息,然后系統(tǒng)從Message中提出消息類型,再根據(jù)類型將消息強(qiáng)制轉(zhuǎn)化ChatMessage,調(diào)用ChatMeaage中方法,獲取目的客戶名稱列表,根據(jù)目的地用戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉(zhuǎn)發(fā)到相應(yīng)的用戶。
六、系統(tǒng)展示
1、注冊(cè)
客戶端注冊(cè)界面
2、登錄
客戶端登錄界面
3、聊天界面
聊天界面
4、服務(wù)器界面
服務(wù)器管理界面
服務(wù)器用戶信息管理界面
七、實(shí)驗(yàn)小結(jié)
本次實(shí)驗(yàn)是比較復(fù)雜的一個(gè)題目,采用C/S架構(gòu)設(shè)計(jì)的聊天室,使用增量迭代方式開發(fā),從初始的0.1版到最終的2.0正式版。通過本次實(shí)驗(yàn),對(duì)C/S架構(gòu)有了較深的認(rèn)識(shí),也對(duì)多線程編程、網(wǎng)絡(luò)編程、GUI的認(rèn)識(shí)更清晰。在項(xiàng)目中遇到很多問題,在解決問題的過程中,對(duì)Java也漸漸的熟悉,尤其是對(duì)各種異常的處理更是對(duì)自己的一種鍛煉。在此次實(shí)驗(yàn)中應(yīng)用了很多上課時(shí)未講到的知識(shí),自己查閱API,閱讀JDK源碼學(xué)習(xí)方法的使用讓自己收獲頗豐。由于這是一個(gè)人的項(xiàng)目,雖然在項(xiàng)目的實(shí)施上很自由,可到問題沒有人討論,耗費(fèi)了很多精力,不過這也是提高自己的好方法。
該Rain153 WeChat聊天室由于時(shí)間原因,很多功能實(shí)現(xiàn)的并不合理,也有些功能尚未實(shí)現(xiàn)。Rain153 WeChat并未與數(shù)據(jù)庫(kù)連接,只是簡(jiǎn)單的用文件保存用具信息及消息記錄。
第四篇:Java聊天室課程設(shè)計(jì)報(bào)告
UML課程設(shè)計(jì)
題 目
網(wǎng)絡(luò)聊天程序開發(fā)設(shè)計(jì)與實(shí)現(xiàn)
學(xué) 號(hào):201515614376 姓 名: 衛(wèi)國(guó)輝 指導(dǎo)教師:
完成時(shí)間:2017年 12月
0
目錄
1.摘要.............................................................................................................................2 2.緒論.............................................................................................................................0 2.開發(fā)環(huán)境.....................................................................................................................0 3.需求分析....................................................................................................................1
3.1程序簡(jiǎn)介...........................................................................................................1 3.2程序功能...........................................................................................................1 4.系統(tǒng)設(shè)計(jì).....................................................................................................................2
4.1概要設(shè)計(jì)...........................................................................................................2 4.2詳細(xì)設(shè)計(jì)............................................................................................................2 5.測(cè)試.............................................................................................................................7 6.結(jié)論.............................................................................................................................9 參考文獻(xiàn)......................................................................................................................10
摘要
本次訓(xùn)練主要是考查了對(duì)JAVA程序設(shè)計(jì)的綜合運(yùn)用,設(shè)計(jì)一個(gè)Socket通信的聊天程序,用戶可以通過程序進(jìn)行聊天通信,但不支持用戶自定義表情及圖片的發(fā)送。
本程序設(shè)計(jì)也用到了一些相關(guān)的標(biāo)準(zhǔn)Java的類,給程序設(shè)計(jì)帶來(lái)了許多的方便,但用那些要切記加相應(yīng)的類的包,還有一些構(gòu)造方法和個(gè)別接口方法。
本程序可以實(shí)現(xiàn)用戶之間的一些簡(jiǎn)單的交互,雖然功能較少,但是我想通過這次程序設(shè)計(jì)來(lái)熟悉并且學(xué)習(xí)更多關(guān)于JAVA編程的東西,來(lái)便于以后可以使用。
關(guān)鍵詞:java聊天
1.緒論
對(duì)于一個(gè)選擇網(wǎng)絡(luò)編程的人來(lái)說,必須要有足夠的細(xì)心和耐心,因?yàn)榫幊桃话銇?lái)說是很枯燥的乏味的,而且程序會(huì)越來(lái)越復(fù)雜,它所用到的符號(hào)、標(biāo)記很多,所以不能出點(diǎn)小錯(cuò)誤的。還有,我們不能只是看程序,要學(xué)會(huì)把自己學(xué)的自己拿去實(shí)踐,自己去編一些程序,培養(yǎng)自己的動(dòng)手能力,掌握一些編程技巧,熟練運(yùn)用自己學(xué)到的理論知識(shí),這樣在以后才能開發(fā)出屬于自己的東西。
如今,隨著科學(xué)技術(shù)的發(fā)展,計(jì)算機(jī)已成為了我們生活中必不可少的設(shè)備了,而掌握計(jì)算機(jī)知識(shí)和運(yùn)用,又成了我們每一個(gè)人的目標(biāo)了?,F(xiàn)在IT行業(yè)的飛速發(fā)展,無(wú)不應(yīng)正了以前、現(xiàn)在、將來(lái)計(jì)算機(jī)行業(yè)都是科學(xué)發(fā)展的主導(dǎo)行業(yè)。而這些基本上都建立在程序上的,所以程序員對(duì)計(jì)算機(jī)行業(yè)來(lái)說,可想而知有多么的重要了,他們所付出的每一滴汗水都將推動(dòng)這個(gè)行業(yè)的發(fā)展。
現(xiàn)在我就用JAVA語(yǔ)言編寫一個(gè)簡(jiǎn)單的程序——Java聊天程序。將所學(xué)的基本知識(shí)用到其中去,這里包括了構(gòu)造方法,創(chuàng)建圖形界面,引用類等等。這不僅能鍛煉我的實(shí)踐能力,同時(shí)也進(jìn)一步復(fù)習(xí)和鞏固了我所學(xué)的理論知識(shí)。對(duì)以前沒有學(xué)好的還有督促和促進(jìn)作用。而且,根據(jù)需要,還可以了解一些課外的知識(shí)。增加自己的知識(shí)面。
2.開發(fā)環(huán)境
在開發(fā)此聊天程序時(shí),該項(xiàng)目所使用的軟件開發(fā)環(huán)境如下:
操作系統(tǒng):Windows 7
開發(fā)工具:eclipse3.2及其VE插件
0
Eclipse簡(jiǎn)介
Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括 Java 開發(fā)工具。
Eclipse是著名的跨平臺(tái)的自由集成開發(fā)環(huán)境(IDE)。最初主要用來(lái)Java語(yǔ) 言開發(fā),但是目前亦有人通過插件使其作為其他計(jì)算機(jī)語(yǔ)言比如C++和Python的開發(fā)工具。Eclipse的本身只是一個(gè)框架平臺(tái),但是眾多插件的支持 使得Eclipse擁有其他功能相對(duì)固定的IDE軟件很難具有的靈活性。許多軟件開發(fā)商以Eclipse為框架開發(fā)自己的IDE。
Eclipse 最初由OTI和IBM兩家公司的IDE產(chǎn)品開發(fā)組創(chuàng)建,起始于1999年4月。IBM提供了最初的Eclipse代碼基礎(chǔ),包括Platform、JDT 和PDE。目前由IBM牽頭,圍繞著Eclipse項(xiàng)目已經(jīng)發(fā)展成為了一個(gè)龐大的Eclipse聯(lián)盟,有150多家軟件公司參與到Eclipse項(xiàng)目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一個(gè)開發(fā)源碼項(xiàng)目,它其實(shí)是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其開放源碼,任何人都可以免費(fèi)得到,并可以在此基礎(chǔ)上開發(fā)各自的插件,因此越來(lái)越受人們關(guān)注。近期還有包括Oracle在內(nèi)的許多 大公司也紛紛加入了該項(xiàng)目,并宣稱Eclipse將來(lái)能成為可進(jìn)行任何語(yǔ)言開發(fā)的IDE集大成者,使用者只需下載各種語(yǔ)言的插件即可。
3.需求分析
3.1程序簡(jiǎn)介
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,人們?cè)絹?lái)越多的依賴于網(wǎng)絡(luò),為了方便人們的生活,網(wǎng)絡(luò)聊天自然成為了熱點(diǎn),各種工具到處都是。此程序便是模仿其他聊天工具設(shè)計(jì)的,當(dāng)然只是實(shí)現(xiàn)了比較少的功能,可以進(jìn)行基本的聊天。
3.2 程序功能
該程序功能:該程序分為2個(gè)部分,一個(gè)是客戶端程序,一個(gè)是服務(wù)端程序,需要先開啟服務(wù)器,再開啟客戶端才能使用,客戶端程序提供了相互通信、清空聊天記錄的等功能,服務(wù)端則用于接受客戶端的請(qǐng)求,記錄客戶端的信息等。
4.系統(tǒng)設(shè)計(jì) 4.1概要設(shè)計(jì)
此聊天程序共有2個(gè)部分,客戶端和服務(wù)器??蛻舳酥邪?個(gè)Java文件,為主類client.java,;服務(wù)器端只有一個(gè)主類Server.java。
程序流程圖:
服務(wù)器程序結(jié)構(gòu)
客戶端程序結(jié)構(gòu)
4.2詳細(xì)設(shè)計(jì)
(1)服務(wù)器程序?qū)崿F(xiàn)
本程序采用的是Socket通信來(lái)設(shè)計(jì)的,建立一個(gè)主類Server.java,其中主類中還包括服務(wù)器線程 然后在其構(gòu)造方法加載程序所需的組件,構(gòu)造方法如下:
public ClientThread(Socket socket){
try {
this.socket = socket;
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
// 接收客戶端的基本用戶信息
String inf = reader.readLine();
StringTokenizer st = new StringTokenizer(inf, “@”);
user = new User(st.nextToken(), st.nextToken());
// 反饋連接成功信息
writer.println(user.getName()+ user.getIp()+ “與服務(wù)器連接成功!”);
writer.flush();
// 反饋當(dāng)前在線用戶信息
if(clients.size()> 0){
String temp = “";
for(int i = clients.size()1;i >= 0;i--){
clients.get(i).getWriter().println(”ADD@“ + user.getName()+ user.getIp());
clients.get(i).getWriter().flush();
}
} catch(IOException e){
e.printStackTrace();
}
}
@SuppressWarnings(”deprecation“)
public void run(){// 不斷接收客戶端的消息,進(jìn)行處理。
String message = null;
while(true){
try {
message = reader.readLine();// 接收客戶端消息
if(message.equals(”CLOSE“))// 下線命令
{
contentArea.append(this.getUser().getName()
+ this.getUser().getIp()+ ”下線!rn“);
// 斷開連接釋放資源
reader.close();
writer.close();
socket.close();
// 向所有在線用戶發(fā)送該用戶的下線命令
for(int i = clients.size()1;i >= 0;i--){
if(clients.get(i).getUser()== user){
ClientThread temp = clients.get(i);
clients.remove(i);// 刪除此用戶的服務(wù)線程
temp.stop();// 停止這條服務(wù)線程
return;
}
}
} else {
dispatcherMessage(message);// 轉(zhuǎn)發(fā)消息
}
} catch(IOException e){
e.printStackTrace();
}
}
} 其運(yùn)行截圖如下圖所示:
(2)、客戶端主程序
本程序使用了默認(rèn)的卡片布局方式,對(duì)窗口的大小進(jìn)行設(shè)置,讓聊天窗口能
夠居中顯示,以及登錄主窗口類。
實(shí)現(xiàn)窗口布局功能和類的調(diào)用功能的主要代碼如下:
* 連接服務(wù)器
*
* @param port
* @param hostIp
* @param name
*/ public boolean connectServer(int port, String hostIp, String name){
// 連接服務(wù)器
try {
socket = new Socket(hostIp, port);// 根據(jù)端口號(hào)和服務(wù)器ip建立連接
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
// 發(fā)送客戶端用戶基本信息(用戶名和ip地址)
sendMessage(name + ”@“ + socket.getLocalAddress().toString());
// 開啟接收消息的線程
messageThread = new MessageThread(reader, textArea);
messageThread.start();
isConnected = true;// 已經(jīng)連接上了
return true;
} catch(Exception e){
textArea.append(”與端口號(hào)為:“ + port + ” IP地址為:“ + hostIp
+ ” 的服務(wù)器連接失敗!“ + ”rn“);
isConnected = false;// 未連接上
return false;
} }
(5)、聊天窗口程序設(shè)計(jì)
程序提供了發(fā)送文字和關(guān)閉聊天的的簡(jiǎn)單功能。以下是實(shí)現(xiàn)程序的主要方
法:
* 發(fā)送消息
*
* @param message
*/ public void sendMessage(String message){
writer.println(message);
writer.flush();}
/**
* 客戶端主動(dòng)關(guān)閉連接
*/ @SuppressWarnings(”deprecation“)public synchronized boolean closeConnection(){
try {
sendMessage(”CLOSE");// 發(fā)送斷開連接命令給服務(wù)器
messageThread.stop();// 停止接受消息線程
// 釋放資源
if(reader!= null){
reader.close();
}
if(writer!= null){
writer.close();
}
if(socket!= null){
socket.close();
}
isConnected = false;
return true;
} catch(IOException e1){
e1.printStackTrace();
isConnected = true;
return false;
} } 其運(yùn)行截圖如下圖所示:
5.測(cè)試
程序在編碼過程中,出現(xiàn)了許多的問題,有的是因?yàn)槌绦虻耐晟菩圆粔蚝枚斐傻?,有的是因?yàn)榧夹g(shù)不夠而無(wú)法解決。通過不停的調(diào)試,修改,多數(shù)已發(fā)現(xiàn)的問題都已完善,但依然存在少數(shù)的問題無(wú)法解決。例如,在用戶注冊(cè)這個(gè)功能中,當(dāng)用戶的用戶名重復(fù)時(shí),服務(wù)器會(huì)出現(xiàn)用戶名重復(fù)的異常,服務(wù)器就不會(huì)響應(yīng)。
6.結(jié)論
通過這次程序的實(shí)訓(xùn),我知道了自己在許多地方的不足,雖然書上的程序基本能看懂,但是自己的編程實(shí)踐能力實(shí)在是欠缺,而且我知道了,Java語(yǔ)言最重要的不僅僅是學(xué)好語(yǔ)法,而Java中最重要的還是要理解它的面向?qū)ο缶幊痰乃枷?,理解它的面向?qū)ο蟮奶卣?。因?yàn)閷W(xué)習(xí)任何一門語(yǔ)言最重要的就是理解它的思想,要做到知其然,并且知其所以然。要學(xué)會(huì)真正的編寫程序,而不僅僅是把語(yǔ)法背的滾瓜爛熟。還要經(jīng)常寫代碼,做到一邊寫一邊理解,這樣才能真正的實(shí)現(xiàn)學(xué)習(xí)Java語(yǔ)言的目的。
這次實(shí)訓(xùn)也告訴了我,光有書上的知識(shí)對(duì)我們來(lái)說是遠(yuǎn)遠(yuǎn)不夠的,如果我們要想讓自己在編程上有所突破的話,我們必須拓展自己的知識(shí)面,此次程序設(shè)計(jì)就給我增加了不少的知識(shí),讓我在編程方面學(xué)到了許多編程所需要的東西,還有也鍛煉我的耐性,磨礪了我的意志,在錯(cuò)誤面前反復(fù)修改但是從不氣餒。
所以,這次實(shí)訓(xùn)讓我受益匪淺,不管是在知識(shí)方面還是做事方面,都交會(huì)了我許多。同時(shí)還鞏固了以前所學(xué)的知識(shí),學(xué)到了不少書本上沒有的知識(shí);學(xué)到了很多java編程知識(shí),并學(xué)會(huì)了簡(jiǎn)單的使用Eclipse來(lái)開發(fā)Java程序的一些使用技巧這次課程設(shè)計(jì)是對(duì)我本學(xué)期所學(xué)的知識(shí)的檢驗(yàn),由此我發(fā)現(xiàn)了不少的問題。可以說它給了我一次自我評(píng)估的機(jī)會(huì)。通過設(shè)計(jì)讓我知道了那些方面我還是有欠缺的,促使我花時(shí)間彌補(bǔ)。
臨近考試,時(shí)間太緊迫,致使程序?qū)崿F(xiàn)的功能在方法上也許不是很完美,但我以后會(huì)多向老師請(qǐng)教,自己也要加強(qiáng)對(duì)Java 的學(xué)習(xí)。努力進(jìn)一步提高自己的編程水平。
參考文獻(xiàn)
[1]耿祥義.Java課程設(shè)計(jì):清華大學(xué)出版社第二版,2008年11月.[2]馬皓.Java語(yǔ)言程序設(shè)計(jì):機(jī)械工業(yè)出版社,2007年3月 [3]孫衛(wèi)琴.java 面向?qū)ο缶幊?電子工業(yè)出版社.2007 [4]劉海軍.Java程序設(shè)計(jì).中國(guó)鐵道出版社,2006 [5]鄭阿奇,姜乃松,殷紅先.Java實(shí)用教程.電子工業(yè)出版社,2005 [6]張廣彬、王小寧、高靜, Java課程設(shè)計(jì)案例精編(第二版)清華大學(xué)出版社,2011年
第五篇:java聊天室課程設(shè)計(jì)報(bào)告
課程設(shè)計(jì)報(bào)告
2011 ~ 2012 學(xué)年 第 一 學(xué)期
學(xué) 號(hào) 20104053020 姓 名 胡勇昌 院 系 信息工程與技術(shù) 專 業(yè) 計(jì)算機(jī)工程系 課 程 名 稱 JAVA程序設(shè)計(jì) 課程設(shè)計(jì)名稱 局域網(wǎng)內(nèi)的多功能聊天室
學(xué) 時(shí) 學(xué) 分 1 指 導(dǎo) 教 師 許爍娜
2011年 12 月 25 日
目錄
課程設(shè)計(jì)報(bào)告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相關(guān)技術(shù).......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 術(shù)語(yǔ)...............................................................................................................................................4 第2章 需求分析與系統(tǒng)設(shè)計(jì)................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系統(tǒng)設(shè)計(jì).......................................................................................................................................6 2.2.1多用戶在線方案.....................................................................................................................6 2.2.2 系統(tǒng)功能................................................................................................................................6 第3章 系統(tǒng)實(shí)施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客戶端窗口...........................................................................................................................8 3.3 內(nèi)嵌“私聊”窗口.......................................................................................................................9 3.4客服端類繼承客戶端窗口類,并內(nèi)嵌私聊程序......................................................................10 第4章 測(cè)試..........................................................................................................................................15 4.1 測(cè)試環(huán)境與使用方法.................................................................................................................15 4.2 功能測(cè)試.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客戶端窗口..........................................................................................................................16
4.2.3 內(nèi)嵌“私聊”窗口..........................................................................................................................16
參考文獻(xiàn)................................................................................................................................................16
第1章 引言
1.1 背景
網(wǎng)絡(luò)聊天室通常直稱聊天室,是一種人們可以在線交談的網(wǎng)絡(luò)論壇,在同一聊天室的人們通過廣播消息進(jìn)行實(shí)時(shí)交談。聊天室可以建立在即時(shí)通訊軟件(如MSN Messenger、QQ)、P2P軟件、萬(wàn)維網(wǎng)(如 Halapo,Meebo)等基礎(chǔ)上,萬(wàn)維網(wǎng)方式更為普通和種類繁多,交談的手段不局限于文本,更包括語(yǔ)音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網(wǎng)人可以實(shí)時(shí)地廣播和閱讀公開消息。一般情況下,與其它網(wǎng)絡(luò)論壇、即時(shí)通訊不同的是,聊天室不保存聊天記錄。
1.2 相關(guān)技術(shù) 1.2.1 JAVA概述
Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言和java平臺(tái)(即JavaSE, JavaEE, JavaME)的總稱。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢(shì)和廣闊前景。
1.2.2 Socket Socket是java中需一要編寫較低層次的網(wǎng)絡(luò)通信程序(例如Cljent/server應(yīng)用程序)時(shí)提供的一種通訊機(jī)制。Socket是兩個(gè)程序進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通信的端點(diǎn),一般 由一個(gè)地址加上一個(gè)端口號(hào)來(lái)標(biāo)一識(shí)。每個(gè)服務(wù)程序都在一個(gè)眾所周知的端口上提供服 務(wù),而想使用服務(wù)的客戶端程序則需要連接該端口。通過Socket的數(shù)據(jù)是原始字節(jié)流信 息,通信雙方必須根據(jù)約定的協(xié)議對(duì)數(shù)據(jù)進(jìn)行處理與解釋。
Socket通信機(jī)制提供了兩種通信.方式:有連接方式(TCP)和無(wú)連接方式(UDP數(shù)
據(jù)報(bào))。有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。無(wú)連接力一式中,通信雙方不存在一個(gè)連 接過程,一次網(wǎng)絡(luò)I/O以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而每次網(wǎng)絡(luò)I /O可以和不同.主機(jī)的不 同進(jìn)程進(jìn)行。無(wú)連接方式開銷小于有連接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)不可靠,不 能保證數(shù)據(jù)報(bào)一定到達(dá)目的地”」·。
JAVA的有連接通信采用流式I/O模式。Socket是兩個(gè)進(jìn)程間通信鏈的端點(diǎn),每個(gè) Sockct有兩個(gè)流:一個(gè)輸入流和一個(gè)輸出流。只要向Sockct的輸出流寫,一個(gè)進(jìn)程就可 以通過網(wǎng)絡(luò)連接向其他進(jìn)程發(fā)送數(shù)據(jù);同樣,通過讀Sockt的輸入流,就可以讀取傳輸 來(lái)的數(shù)據(jù)。
有連接通信一般要經(jīng)歷以下四個(gè)基本步驟ii
(1)創(chuàng)建Sockct,建立連接;
(2)打開連接到Sockct的輸入/輸出流;
(3)按照一定的一腳議對(duì)Socket進(jìn)行讀/寫操作;
(4)關(guān)閉Socket。
第(3)步是程序員用來(lái)調(diào)用Socket和實(shí)現(xiàn)程序功能的關(guān)鍵步驟,其他三步在各種 程序中基本相同。
1.2.3 TCP 三次握手
TCP協(xié)議通過三個(gè)報(bào)文段完成連接的建立,這個(gè)過程稱為三次握手(three-way handshake),過程如下圖所示。
1.3 術(shù)語(yǔ)
暫無(wú)
第2章 需求分析與系統(tǒng)設(shè)計(jì)
2.1 需求分析
從技術(shù)發(fā)面來(lái)看,Java語(yǔ)言的優(yōu)點(diǎn)一要表現(xiàn)在:簡(jiǎn).單、面向?qū)ο蟆⒍嗑€程、安全性 等方面。1.簡(jiǎn)單性
Java與C++語(yǔ)言灰常相近,但Java比C++簡(jiǎn)單,它拋棄了C++中的一些不是絕對(duì) 必要的功能,如頭文件、頂處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動(dòng)強(qiáng)迫同型。Java實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡(jiǎn)化了內(nèi)存管理的一作。這使程序一設(shè)計(jì)更加簡(jiǎn)便,同時(shí)減少了出錯(cuò)的可能。2.面向?qū)ο?/p>
Java提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對(duì)象的原型,通過繼承和重載機(jī)制,子類可以使用或重新定義父類或超類所提供的一方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動(dòng)態(tài)的解決方案。
Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)一言,它除了數(shù)組、布爾和字符二個(gè)基本數(shù)據(jù)類型外的其它類都是對(duì)象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無(wú)法創(chuàng)建程序,Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例,然后才能提交運(yùn)行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的 單重繼承,即每個(gè)類只能從一個(gè)類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)界面,利用界面可以得到多重繼承的許多優(yōu)點(diǎn)而又沒有多重繼承的問題。3.多線程
多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會(huì)由于一處等待影響其他部分,這樣容.易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。
Java程序可以有多個(gè)執(zhí)行線程,如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算,而讓另一個(gè)線 程與用戶進(jìn)行交互,這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。4.安全性
Java不支持指針,一切對(duì)內(nèi)存的訪問都必須通過對(duì)象的實(shí)例變量來(lái)實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。2.2 系統(tǒng)設(shè)計(jì) 2.2.1多用戶在線方案 2.2.2 系統(tǒng)功能
聊天室程序通常需要完成以下一些基本功能:
(I)登錄聊天室;
(2)啟動(dòng)服務(wù)器;
(3)關(guān)閉服務(wù)器;
(4)用戶之間的聊天;
(5)退出聊天室。
本系統(tǒng)其體功能需求如下:
(1)聊天室管理員經(jīng)登錄界面登錄到管理界而,即系統(tǒng)的服務(wù)器端。用戶經(jīng)登錄界而 都進(jìn)入聊天大廳。
(2)不論是管理員還是用戶都需一要在登錄界面輸入正確的用戶名和密碼后才可以登錄 到各自的界面中去。
(3)系統(tǒng)的兩個(gè)主要界面都是為方便管理員和用戶操作的。首先,管理員進(jìn)入到管理 界而后可以方便的啟動(dòng)/停止服務(wù)器,看到在線用戶的信息和聊人信息、。用戶進(jìn)入到聊天 大廳中可以聊天,查看服務(wù)器狀態(tài)。
(4)一個(gè)用戶退出聊天室對(duì)其他用戶不能產(chǎn)生影響,而服務(wù)器斷開與客戶端的連接則所有的用戶都失去與服務(wù)器的連接。
(5)用戶的聊天信息錄入,重寫,發(fā)送,接收方便,快捷。
(6)服務(wù)器狀態(tài),聊天信息和在線用戶人數(shù)及時(shí)刷新。
(7)聊天室系統(tǒng)運(yùn)行穩(wěn)定、安全性高、性能可靠。
第3章 系統(tǒng)實(shí)施
3.1聊天室窗口
建立服務(wù)端窗口類:窗口程序如下 import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.List;import java.awt.TextArea;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class chatroomW { JFrame f=new JFrame(“局域網(wǎng)聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“發(fā)送”);Button button1=new Button(“啟動(dòng)服務(wù)”);Button button2=new Button(“發(fā)送”);Button button3=new Button(“刷新用戶列表”);JTextField text1=new JTextField(5);JTextField text2=new JTextField(25);TextArea area1=new TextArea(26,84);List userList=new List(27);JScrollPane scro1,scro2;public chatroomW(){
chat();} public void chat(){
area1.setBackground(new Color(204,255,255));
area1.setForeground(Color.black);
userList.setBackground(Color.gray);
userList.setForeground(Color.white);
f.setLayout(new FlowLayout());f.add(area1);f.add(userList);f.add(label1);f.add(text1);f.add(button1);f.add(text2);f.add(button2);f.add(button3);
f.setBounds(300,200,750,485);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
area1.setEditable(false);text1.setText(“10000”);
myEvent();
} public static void main(String args[]){
new chatroomW();} public void myEvent(){} }
3.2 建立客戶端窗口
import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;
import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class ClientW {
JFrame f=new JFrame(“聊天室”);JScrollPane js;TextArea area=new TextArea(19,67);JTextField text1=new JTextField(12);JTextField text2=new JTextField(5);JTextField text3=new JTextField(5);JTextField text4=new JTextField(20);JButton button1=new JButton(“連接”);JButton button2=new JButton(“發(fā)送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服務(wù)器地址”);JLabel label2=new JLabel(“服務(wù)器端口”);JLabel label3=new JLabel(“昵稱”);public ClientW(){ } public void chat(){
area.setBackground(new Color(204,255,255));area.setForeground(Color.black);f.setLayout(new FlowLayout());f.setBounds(300,200,500,410);f.add(label1);f.add(text1);f.add(label2);chat();//
}
} f.add(text2);f.add(button1);f.add(area);f.add(label3);f.add(text3);f.add(text4);f.add(button2);f.add(button3);f.setVisible(true);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setResizable(false);area.setEditable(false);text2.setText(“10000”);text4.setText(null);myEvent();public void myEvent(){} public static void main(String args[]){ } new ClientW();
3.3 內(nèi)嵌“私聊”窗口
class netchat{ JFrame f=new JFrame(“私聊”);JLabel label1,label2,label3;Button button1,button2;JTextField text1,text2,text3,text4;TextArea textarea;
f.setLayout(new FlowLayout());f.setBounds(300,200,400,310);//設(shè)置窗口大小和位置; label1=new JLabel(“對(duì)方主機(jī)”);label2=new JLabel(“本地端口”);label3=new JLabel(“對(duì)方端口”);button1=new Button(“連接”);button2=new Button(“發(fā)送”);text1=new JTextField(7);text2=new JTextField(3);text3=new JTextField(3);public netchat(){ f.setResizable(false);//讓窗口大小固定;
// 閉;
} text4=new JTextField(20);textarea=new TextArea(13,53);textarea.setEditable(false);textarea.setBackground(new Color(204,250,255));f.add(label1);f.add(text1);f.add(label2);f.add(text2);f.add(label3);f.add(text3);f.add(button1);f.add(textarea);f.add(text4);f.add(button2);f.setVisible(true);f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關(guān)閉窗口程序同時(shí)關(guān)myEvent();
3.4客服端類繼承客戶端窗口類,并內(nèi)嵌私聊程序
import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;
public class Client extends ClientW{ Socket s=null;public Client(){} public void myEvent(){
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
s=new Socket(text1.getText().toString(),Integer.parseInt(text2.getText()));
new Thread(new LinkC()).start();
area.append(“[系統(tǒng)消息]:連接成功n”);
}catch(Exception ex){area.append(“[系統(tǒng)消息]:連接失敗n”);}
}
});
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new SentC();
}
});
button3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new netchat();
}
});} public static void main(String args[]){
new Client();}
class LinkC implements Runnable{
public void run(){
try{
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg=null;
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(text3.getText());
while(true){
try{
while((msg=bufIn.readLine())!=null){
area.append(msg+“n”);
}
}catch(Exception ex){break;}
}
}catch(Exception e){}
}
}
class SentC {
public SentC(){
try{
PrintStream ps=new PrintStream(s.getOutputStream());
if(!text4.getText().equals(“")){
ps.println(text4.getText());//
area.append(text4.getText());//服務(wù)器自動(dòng)會(huì)返回
text4.setText(”“);
}
}catch(Exception e){}
}
} //私聊類
class netchat{
JFrame f=new JFrame(”私聊“);
JLabel label1,label2,label3;
Button button1,button2;
JTextField text1,text2,text3,text4;
TextArea textarea;
public netchat(){
f.setLayout(new FlowLayout());
f.setBounds(300,200,400,310);
//設(shè)置窗口大小和位置;
f.setResizable(false);
//讓窗口大小固定;
label1=new JLabel(”對(duì)方主機(jī)“);
label2=new JLabel(”本地端口“);
label3=new JLabel(”對(duì)方端口“);
button1=new Button(”連接“);
button2=new Button(”發(fā)送“);
text1=new JTextField(7);
text2=new JTextField(3);
text3=new JTextField(3);
text4=new JTextField(20);
textarea=new TextArea(13,53);
textarea.setEditable(false);
textarea.setBackground(new Color(204,250,255));
text2.setText(”10000“);
text3.setText(”10000“);
f.add(label1);
f.add(text1);
f.add(label2);
f.add(text2);
f.add(label3);
f.add(text3);
f.add(button1);
f.add(textarea);
f.add(text4);
f.add(button2);
f.setVisible(true);//
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關(guān)閉窗口程序同時(shí)關(guān)閉;
myEvent();
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
try{
DatagramSocket ds=new DatagramSocket();
byte[] buf=”對(duì)方已下線“.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
ds.send(dp);
ds.close();
}catch(Exception ex){}
}
});
button2.addActionListener(new ActionListener()//事件源是button2
{
public void actionPerformed(ActionEvent e)
{
if(!text4.getText().equals(”“))
new Thread(new Send()).start();
}
});
button1.addActionListener(new ActionListener()//事件源是button1
{
public void actionPerformed(ActionEvent e)
{
new Thread(new Rece()).start();
}
});
}
class Send implements Runnable{
public void run(){ try{UdpSend();}catch(Exception e){textarea.append(”[系統(tǒng)消息]:發(fā)送失敗n“);}}
public void UdpSend()throws Exception{
DatagramSocket ds=new DatagramSocket();
byte[] buf=text4.getText().getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
textarea.append(”[我]: “+text4.getText()+”n“);
text4.setText(”“);
ds.send(dp);
ds.close();
}
}
class Rece implements Runnable{
int index=0;
public void run(){
try{
UdpRece();
}catch(Exception e){
textarea.append(”[系統(tǒng)消息]:連接失敗n“);
}
}
public void UdpRece()throws Exception{
while(true){
DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));
if(index==0){textarea.append(”[系統(tǒng)消息]:連接成功n“);}
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String data=new String(dp.getData(),0,dp.getLength());
textarea.append(dp.getAddress()+” “+data+”n");
index++;
ds.close();
}
}
}
} } 第4章 測(cè)試
4.1 測(cè)試環(huán)境與使用方法
測(cè)試環(huán)境:測(cè)試環(huán)境:電腦安裝Java JDK 服務(wù)器端使用方法:打開服務(wù)啟動(dòng),點(diǎn)擊“啟動(dòng)服務(wù)”,提示“啟動(dòng)服務(wù)成功”表示正常啟動(dòng)。否則,先關(guān)閉服務(wù)端,再重新打開,啟動(dòng)服務(wù)??蛻舳耸褂梅椒ǎ捍蜷_客戶端,輸入“服務(wù)器地址”,點(diǎn)擊“連接”,如成功連接系統(tǒng)提示“成功連接”,并收到服務(wù)端返回的“歡迎”信息,否則關(guān)閉并重新啟動(dòng)。
私聊功能使用方法:點(diǎn)擊面板上的“私聊”按鈕,輸入對(duì)方的IP地址,點(diǎn)擊連接,如連接成功系統(tǒng)會(huì)提示“連接成功”。當(dāng)對(duì)方斷開時(shí)會(huì)收到“對(duì)方已下線”提示。如果要同時(shí)跟多人私聊,則要改變本地端口值,并告知對(duì)方。
4.2 功能測(cè)試 4.2.1聊天室窗口
4.2.2 客戶端窗口
4.2.3 內(nèi)嵌“私聊”窗口
參考文獻(xiàn)
用JAVA程序?qū)崿F(xiàn)參考文獻(xiàn)的錄入與生成 劉瑋瑋 2009 《福建電腦》
基于Java移動(dòng)Agent系統(tǒng)的安全參考模型 周屹 2007 《黑龍江工程學(xué)院學(xué)報(bào)》
嵌入式Java虛擬機(jī)的性能優(yōu)化技術(shù) 李允 2004 《計(jì)算機(jī)工程》