Socket與多線程編程聊天程序?qū)崿F(xiàn)_第1頁
Socket與多線程編程聊天程序?qū)崿F(xiàn)_第2頁
Socket與多線程編程聊天程序?qū)崿F(xiàn)_第3頁
Socket與多線程編程聊天程序?qū)崿F(xiàn)_第4頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

一、 課題內(nèi)容和要求1.課題內(nèi)容基于Socket和多線程編程的聊天程序?qū)崿F(xiàn)2.課題要求網(wǎng)絡(luò)聊天程序設(shè)計(jì)非常復(fù)雜,允許多個人同時聊天更加需要多線程技術(shù)的支持,請實(shí)現(xiàn)一個簡單的多線程網(wǎng)絡(luò)聊天程序模擬。二、 設(shè)計(jì)思路分析在網(wǎng)絡(luò)越來越發(fā)達(dá)的今天,人們對網(wǎng)絡(luò)的依賴越來越強(qiáng),網(wǎng)絡(luò)聊天已經(jīng)成了許多人生活中必不可少的一部分, 基于這樣的需求,出現(xiàn)了許多網(wǎng)絡(luò)聊天通信工具, 像QQ,MSN等等,但是人們已經(jīng)不再滿足于單一的兩個人之間的聊天, 而是對多人同時聊天產(chǎn)生了興趣, 于是出現(xiàn)了網(wǎng)絡(luò)聊天室,不同地方的人可以在那個虛擬的聊天室里面熱烈聊天。 基于這樣的想法,我們用 JAVA設(shè)計(jì)一個多人同時聊天的小程序,用 Socket編程實(shí)現(xiàn)網(wǎng)絡(luò)通訊,面向連接的,采用多線程的實(shí)現(xiàn)技術(shù)。2. 在程序中,可以設(shè)置加入連接的最大數(shù)目,通過更改 IP地址和端口號,成為不同的客戶端,與服務(wù)器端連接,進(jìn)行多用戶聊天。為方便用戶交互,我們采用圖形化的用戶界面。實(shí)現(xiàn)了好友添加,消息收發(fā)、顯示等基本功能。三、概要設(shè)計(jì)該網(wǎng)絡(luò)聊天程序大致分為三個主要部分: 客戶端、服務(wù)器端和用戶圖形界面。 各個部分的初步設(shè)計(jì)思想、流程及存儲結(jié)構(gòu)如下:程序整體框架:主程序監(jiān)聽一端口,等待客戶接入;同時構(gòu)造一個線程類,準(zhǔn)備接管會話。當(dāng)一個Socket會話產(chǎn)生后,將這個會話交給線程處理,然后主程序繼續(xù)監(jiān)聽。打開Socket命名監(jiān)聽端口建立連接收發(fā)消息關(guān)閉連接打開Socket連接服務(wù)器收發(fā)消息關(guān)閉連接1/11服務(wù)器端程序客戶端程序客戶端(Client)客戶端,使用Socket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時的、動態(tài)的分配一個端口。3.服務(wù)器端(Server)服務(wù)器端,使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接。4.用戶圖形界面用戶圖形界面方便程序與用戶的交互,多個用戶參加,完成會話功能,具體的設(shè)計(jì)要方便用戶的使用,直觀清晰,簡潔明了,友好美觀。5.存儲結(jié)構(gòu)下面列出主要存儲結(jié)構(gòu)或變量:存儲結(jié)構(gòu)、變量、對象類型說明postInetAddress標(biāo)識IP地址Portint標(biāo)識端口Server[]ServerThread服務(wù)器端連接數(shù)Client[]Socket客戶端連接數(shù)Client(Stringip,intp,Facechat)publicClient類成員函數(shù)Publicvoidrun()VoidClient、Server類成員函數(shù)Server(intport,Facechat)publicServer類成員函數(shù)Face()PublicFace類成員函數(shù)四、 詳細(xì)設(shè)計(jì)代碼分服務(wù)器端、客戶端、和用戶圖形界面三部分,分別如下:1.服務(wù)器端服務(wù)器端主要是使用 ServerSocket類,相當(dāng)于服務(wù)器 Socket,用來監(jiān)聽試圖進(jìn)入的連接,當(dāng)新的連接建立后,該類為他們實(shí)例化一個Socket對象,同時得到輸入輸出流,調(diào)用相應(yīng)方法完成會話。具體代碼如下:。。。。publicclassServerextendsThread{ServerSocketskt。 // ServerSocket類監(jiān)聽進(jìn)入的連接,為每個新的連接產(chǎn)生一個 Socket對象SocketClient[]=newSocket[10]。2/11SocketClient1=i=0。TextAport,k=0,l=0。PrintStreamtheOutputStream。Facechat。publicServer(intport,Facechat){try{this.port=port。skt=newServerSocket(port)。this.chat=chat。}catch(IOExceptione){。}}publicvoidrun(){等待連線......")。while(true){try{Client[k]=skt.accept()。當(dāng)有客戶端連接時就新建一個子線程if(i<2){ServerThreadserver[]=newServerThread[10]。server[k]=newServerThread(Client[k],this.chat,i) 。l=server.length。server[k].start()。 客戶“端“+Client[k].getInetAddress()+"已連線\n")。//for(intj=0。j<server.length。j++)theOutputStream=newPrintStream(server[k].getClient().getOutputStream()) 。i=server[k].getI()。k++。}else{//theOutputStream=newPrintStream(null) 。}}catch(SocketExceptione){}catch(IOExceptione){。}}}publicvoiddataout(Stringdata){//for(intj=0。j<l。j++)theOutputStream.println(data) 。3/11}}classServerThreadextendsThread{ServerSocketskt。SocketClient。TextAport,i。BufferedReadertheInputStream。PrintStreamtheOutputStream。Stringreadin。Facechat。服務(wù)端子線程publicServerThread(Sockets,Facechat,inti){this.i=++i。Client=s。this.chat=chat。}publicintgetI(){returnthis.i。}publicSocketgetClient(){returnthis.Client。}publicvoidrun(){try{theInputStream=newBufferedReader(newInputStreamReader(Client.getInputStream()))。theOutputStream=newPrintStream(Client.getOutputStream()) 。while(true){readin=theInputStream.readLine()。 。}}catch(SocketExceptione){連線中斷!\n")。設(shè)置組件可用性。。。。try{i--。skt.close()。Client.close()。}catch(IOExceptionerr){4/11。}}catch(IOExceptione){。}}publicvoiddataout(Stringdata){theOutputStream.println(data) 。}}2.客戶端客戶端主要是使用Socket類,該類是JAVA實(shí)現(xiàn)網(wǎng)絡(luò)編程重要的基礎(chǔ)類,實(shí)現(xiàn)程序間雙向的面向連接的通信。調(diào)用publicSocket(Stringhost,intport)方法設(shè)定IP和端口。建好連接后,用戶通過得到 Socket的輸入輸出流對象后,利用流的方法實(shí)現(xiàn)數(shù)據(jù)的傳輸。調(diào)用 publicInputStreamgetInputStream()和publicOutputStreamgetOutputStream()方法,分別得到Socket對象的輸入輸出流。具體實(shí)現(xiàn)代碼如下:。。。。publicclassClientextendsThread{Socketskt。 // 用于客戶端的連接InetAddresshost。 // 主機(jī)地址intport。 // 端口號BufferedReadertheInputStream。PrintStreamtheOutputStream。Stringreadin。Facechat。publicClient(Stringip,intp,Facechat){try{host=InetAddress.getByName(ip)。 // 獲取IP地址port=p。 // 獲取端口號this.chat=chat。}catch(IOExceptione){。}}publicvoidrun(){try{準(zhǔn)備連線,稍后! ")。skt=newSocket(host,port)。 // 新建Socket對象成功\n")。 // 緩沖區(qū)末尾添加字符串theInputStream=newBufferedReader(newInputStreamReader(skt.getInputStream())) 。5/11theOutputStream=newPrintStream(skt.getOutputStream()) 。while(true){readin=theInputStream.readLine()。 。}未連上!\n")。。。。。try{skt.close()。。}}catch(IOExceptione){。}}publicvoiddataout(Stringdata){theOutputStream.println(data) 。}}3.用戶圖形界面該部分主要是完成界面的初始化,合理布局組件,方便用戶交互。主要是 JAVA按鈕,文本域,標(biāo)簽,布局管理器的使用。主要處理了鍵盤 Enter消息接受,下面是實(shí)現(xiàn)代碼:。。。publicclassFaceextendsFrame{privatestaticfinallongserialVersionUID=1L。ButtonclientBtn,serverBtn。TextAreata。TextFieldtfaddress,tfport,tftype。Labellbl1,lbl2,port。Clientclient。Serverserver。booleaniamserver。staticFacefrm。publicFace(){// 實(shí)例化組件6/11clientBtn=newButton("客戶端")。serverBtn=newButton("服務(wù)器")。ta=newTextArea("",10,50,TextArea.SCROLLBARS_BOTH)。lbl1=newLabel("IP地址:")。。lbl2=newLabel("端口:")。tfport=newTextField("8080")。lbl3=newLabel("發(fā)送內(nèi)容:")。tftype=newTextField(40)。tftype.addKeyListener(newTFListener())。ta.setEditable(false)。向容器中加入以上組件setLayout(new FlowLayout())。add(lbl1)。add(tfaddress)。add(lbl2)。add(tfport)。add(clientBtn)。add(serverBtn)。add(ta)。add(lbl3)。add(tftype)。//設(shè)置格式setLocation(400,250)。 //窗口顯示再屏幕的位置坐標(biāo)setSize(400,300)。 //設(shè)置窗體大小setTitle("基于Socket和多線程編程的聊天程序 ")。this.setVisible(true)。 //設(shè)置窗體可見//事件響應(yīng)clientBtn.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){port=Integer.parseInt(tfport.getText()) 。client=newClient(tfaddress.getText(),port,frm) 。client.start()。tfaddress.setEnabled(false)。tfport.setEnabled(false)。serverBtn.setEnabled(false)。clientBtn.setEnabled(false)。}})。serverBtn.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){port=Integer.parseInt(tfport.getText()) 。server=newServer(port,frm)。server.start()。7/11iamserver=true。tfaddress.setText("成為服務(wù)器")。tfaddress.setEnabled(false)。tfport.setEnabled(false)。serverBtn.setEnabled(false)。clientBtn.setEnabled(false)。}})。addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0)。}})。}publicstaticvoidmain(String[]args){ //主方法TODOAuto-generatedmethodstubfrm=newFace()。}privateclassTFListenerimplementsKeyListener{publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_ENTER){//按Enter輸出顯示聊天內(nèi)容ta.append(">"+tftype.getText()+"\n")。if(iamserver)server.dataout(tftype.getText())。elseclient.dataout(tftype.getText()) 。tftype.setText("")。}}publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}}}8/111.程序運(yùn)行初始化界面如下:2.輸入發(fā)送的聊天內(nèi)容后的測試效果:通過以上測試分析可知,程序很好地完成了課題的要求,運(yùn)行結(jié)果正確,利用 JAVA語言的異常處理機(jī)制很好地處理了各種異常,使得程序的性能變得相對穩(wěn)定,界面舒適易用,可以滿足基本聊天需要!一、 調(diào)試過程中的問題程序的調(diào)試相對程序的編碼復(fù)雜多了,需要很大的精力才能做好。9/111.問題的描述JAVA語言的基本知識已具備,但是Socket網(wǎng)絡(luò)方面還不是很了解,花了不少工夫。Socket(套接字),用于描述IP地址和端口,通信鏈的句柄。應(yīng)用程序通常通過它向網(wǎng)絡(luò)發(fā)出或應(yīng)答請求。有 Socket和ServerSocket兩個類,ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個 Socket實(shí)例,操作這個實(shí)例,完成會話。關(guān)于IP地址的獲取,剛開始不知道通過什么方法解決,后來查書知道JAVA的InetAddress類,可以得到主機(jī)地址。但是我想通過程序自動獲取加進(jìn)來的IP地址,可以調(diào)用publicbyte[]getAddress()方法,但是沒能成功,相互的連接也不是很順暢,留待下次解決。2.程

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論