基于UDP協(xié)議的聊天程序設(shè)計報告_第1頁
基于UDP協(xié)議的聊天程序設(shè)計報告_第2頁
基于UDP協(xié)議的聊天程序設(shè)計報告_第3頁
基于UDP協(xié)議的聊天程序設(shè)計報告_第4頁
基于UDP協(xié)議的聊天程序設(shè)計報告_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

編號:計算機網(wǎng)絡(luò)課程設(shè)計題目:基于UDP的聊天程序系別:計算機科學(xué)與工程學(xué)院摘要隨著網(wǎng)絡(luò)技術(shù)的發(fā)展及人們生活的需求,網(wǎng)絡(luò)聊天已越來越受到人們的青睞。網(wǎng)絡(luò)聊天已經(jīng)成為人們工作生活中傳遞信息、交流感情的重要工具,給人們帶來了很大的方便。本課題是開發(fā)一個基于UDP的局域網(wǎng)聊天系統(tǒng),運用軟件工程的設(shè)計流程,綜合運用數(shù)據(jù)庫編程技術(shù)、Windows程序設(shè)計技術(shù)、網(wǎng)絡(luò)通訊技術(shù),此網(wǎng)絡(luò)聊天工具采用客戶端/服務(wù)器(C/S)模式,客戶端采用UDP與服務(wù)器連接,客戶端與客戶端之間通過UDP互相通訊。服務(wù)器端具有服務(wù)器端口設(shè)置,此聊天工具能實現(xiàn)多人聊天功能,適用于局域網(wǎng)使用的網(wǎng)絡(luò)聊天工具,其操作簡單,靈活性好,運行也比較穩(wěn)定。關(guān)鍵詞:網(wǎng)絡(luò)通訊;客戶端/服務(wù)器模型;用戶數(shù)據(jù)報協(xié)議;套接字1-基本設(shè)備往往就成為降低UDP過大通信量的有效工具。數(shù)據(jù)報擁塞控制協(xié)議(DCCP)設(shè)計成通過在諸如流媒體類型的高速率UDP流中增加主機擁塞控制來減小這個潛在的問題。從以上特點可知,UDP提供的是無連接的、不可靠的數(shù)據(jù)傳送方式,是一種盡力而為的數(shù)據(jù)交付服務(wù)。四.基于C/S的多客服端相互通信原理分析:在C/S模式中,它是在分散式,集中式,以及分布式基礎(chǔ)上發(fā)展起來的一種新模型,目前大多數(shù)網(wǎng)絡(luò)通信以及應(yīng)用都屬于這種模型,C/S模式將一個網(wǎng)絡(luò)事務(wù)分為兩部分,一部分是客戶端(Client),他為用戶提供網(wǎng)絡(luò)請求服務(wù)的接口,另一部分是服務(wù)端(Server),它負(fù)責(zé)接受用戶對服務(wù)的請求,并將這些服務(wù)透明的提供給用戶,既適用于實際應(yīng)用的程序,又實用于真正的計算裝置,舉例來說,我們到飯店吃飯時,要首先提出請求吃什么,屬于客戶端,飯店服務(wù)員根據(jù)請求提供相應(yīng)的服務(wù),屬于服務(wù)端,至于相應(yīng)的飯菜是由哪一個廚師來做,則由飯店的服務(wù)員去聯(lián)系,而客戶端只需要和服務(wù)器打交道就行了,從程序?qū)崿F(xiàn)上來說,客戶端和服務(wù)器打交道實際上是兩個進程打交道,服務(wù)端啟動server進程,并等待客戶端與其聯(lián)系,而客戶端則啟動客戶進程和服務(wù)器打交道。當(dāng)服務(wù)器進程處理完一個客服進程請求的信息之后,由接著等待其他客戶的請求。套接字編程原理分析:圖1.1套接字編程原理圖注釋:socket(),使用前創(chuàng)建一個新的套接字;bind(),將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來;send()與recv(),數(shù)據(jù)的發(fā)送與接收;closesocket(),關(guān)閉套接字。六、概要設(shè)計服務(wù)器服務(wù)器客戶機甲客戶機乙客戶機丙圖2.1整體框架設(shè)計圖服務(wù)器端主要實現(xiàn)的功能是啟動一個監(jiān)聽的進程,開放自己的端口號為7777,不斷的監(jiān)聽是否有新的客服端進程向自己發(fā)送連接請求,為每一個主動連接自己的客戶端設(shè)置一個ID號設(shè)置一個threads的容器用來管理客戶端的線程。與客戶端建立連接,實現(xiàn)socket通信,對于服務(wù)器端是先接受數(shù)據(jù)流然后再發(fā)送數(shù)據(jù)流,客服端發(fā)送過來的信息經(jīng)服務(wù)器端然后轉(zhuǎn)發(fā)到其他所有的客戶端,服務(wù)器端相當(dāng)于中間的橋梁??蛻舳艘笾饕獙崿F(xiàn)的功能是建立一個圖形的界面,用于顯示聊天信息等,并且建立與服務(wù)器端的通信,主動的向服務(wù)器端發(fā)送連接請求,然后對輸入文本框注冊事件監(jiān)聽并且發(fā)送給客服端,不斷的監(jiān)聽服務(wù)器端發(fā)來的信息,然后顯示出來。七、詳細(xì)設(shè)計服務(wù)器端:創(chuàng)建服務(wù)端接口創(chuàng)建服務(wù)端接口建立一個seversocket的類svsocket創(chuàng)建一個容器用來管理客戶端進程開始監(jiān)聽,監(jiān)聽是否有客戶端連接,有的話與其建立連接分配ID監(jiān)聽線程監(jiān)聽端口是否有消息傳入如果有的話接收信息再將信息發(fā)送到其他的所有的客服端當(dāng)某客戶離開,結(jié)束他與其他人的通信為客戶端連接創(chuàng)建線程從容器vector中刪除該線程表示該線程已經(jīng)離開聊天室,結(jié)束兩者之間連接圖7.1服務(wù)器端整體設(shè)計流程圖客戶端建立一個seversocket的類,并且創(chuàng)建一個vector用來管理客戶端的線程,然后就開始檢測,如果有客戶端請求與服務(wù)器連接就與其建立socket連接,創(chuàng)建進程設(shè)置ID,告訴其他的客戶端有新的客戶端接入,然后開始監(jiān)聽所有的客戶端線程如果有信息通過端口進入就接受然后再發(fā)送給其他客戶端,如果有客戶端退出,就會告訴其他的客戶端并且關(guān)閉與該客戶端的socket連接,然后在vector里面刪除相應(yīng)的線程。主界面服務(wù)器界面,當(dāng)運行服務(wù)器端則出現(xiàn)運行客服端登錄心得體會:經(jīng)過兩個星期的學(xué)習(xí)和實踐,我也算是順利的完成了計算機網(wǎng)絡(luò)課程設(shè)計,同時對計算機網(wǎng)絡(luò)有一個大致的了解,在實踐過程中遇到了很多的困難,感覺自己很難將理論與實踐相結(jié)合,覺得我們學(xué)習(xí)的那些知識也派不上用場,通過這次課設(shè),我深刻的認(rèn)識到實踐與理論必須要想結(jié)合才能使所學(xué)的知識變成可用的,通過自己的努力和老師同學(xué)們的幫助,多了一種看待問題的角度;我也發(fā)現(xiàn)了我所學(xué)知識不扎實,只是走馬觀花的應(yīng)付考試,在以后的學(xué)習(xí)中需要時刻的告誡自己,踏踏實實做好每一步。本次課程設(shè)計是利用java語言編寫的,雖說自己以前接觸過這種語言,但是經(jīng)過這兩周的學(xué)習(xí),我受益匪淺。首先,我進一步弄懂了JAVA語言的編程方法和原則,并學(xué)會了編寫java程序。其次,使我更深層次的理解到JAVA語言是一種面向?qū)ο蟮恼Z言,具有可視化編程的特點且代碼具有可移植等特點。本次課程設(shè)計是實現(xiàn)一個UDP即時通訊程序。經(jīng)過編寫程序和運行,調(diào)試程序,我對java語言有了更深的了解。另外,使我對UDP協(xié)議的特點和工作過程有了更深的了解。UDP協(xié)議提供無連接的、不可靠的服務(wù)。它工作于傳輸層,是傳輸層的重要協(xié)議之一。最后,UDP協(xié)議是利用客戶端和服務(wù)器端模型來實現(xiàn)傳輸?shù)?。本次課程設(shè)計使我明白了知識的重要性,同時也更加懂得實踐更不可少。我們要經(jīng)常把所學(xué)的知識運用到實踐,這樣,才能充分的融會貫通。同時,也使我認(rèn)識到自己動手能力太差,為我以后的學(xué)習(xí)和發(fā)展提供了一個警鐘!本次課程設(shè)計的過程中,雖然遇到了不少問題,但最后還是成功的完成了。這次課設(shè)對于我而言是有很大的收獲,懂得獨立尋找資料學(xué)習(xí),這是最大的收獲,在以后的工作中肯定會面臨不懂得問題,有了這次課設(shè)的經(jīng)驗,就能夠去獨立學(xué)習(xí)并解決困難。主要代碼packageserver;importjava.awt.Container;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;import.ServerSocket;import.Socket;importjava.util.ArrayList;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JScrollBar;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassserverextendsJFrame{privateJTextAreaallmsg;privateJTextFieldcurrnum,totalnum,copyright,chatmsg;privateJButtonsend;privateJScrollPanejs;intnum1,num2,port;/*--num1:當(dāng)前在線人數(shù)num2:總上線人數(shù)port:服務(wù)端口號--*/privateServerSocketss;ArrayListlists;//存放所有在線用戶publicserver(){super("聊天室服務(wù)器端");this.setSize(310,660);this.setLocation(200,50);lists=newArrayList();num1=num2=0;port=7777;currnum=newJTextField("當(dāng)前在線人數(shù):"+num1);currnum.setEnabled(false);totalnum=newJTextField("上線總?cè)藬?shù):"+num2);totalnum.setEnabled(false);allmsg=newJTextArea();allmsg.append("系統(tǒng)消息\n");allmsg.setEditable(false);allmsg.setLineWrap(true);//允許自動換行js=newJScrollPane(allmsg);//為JTextArea添加滾動條chatmsg=newJTextField("在此輸入系統(tǒng)信息");chatmsg.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){Stringstr=chatmsg.getText().trim();if(!"".equals(str)){sendmsg((newDate()).toLocaleString()+"--系統(tǒng)消息:"+str);chatmsg.setText("");}elseJOptionPane.showMessageDialog(null,"消息不能為空","錯誤",JOptionPane.OK_OPTION);chatmsg.setText("");/*--發(fā)送信息后,將輸入欄中的信息清空--*/}});send=newJButton("發(fā)送");send.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){Stringstr=chatmsg.getText().trim();if(!"".equals(str)){sendmsg((newDate()).toLocaleString()+"--系統(tǒng)消息:"+str);chatmsg.setText("");}elseJOptionPane.showMessageDialog(null,"消息不能為空","錯誤",JOptionPane.OK_OPTION);chatmsg.setText("");/*--發(fā)送信息后,將輸入欄中的信息清空--*/}});addcomponettocontainer();this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){sendmsg("SYSTEM_CLOSED");/*--向客戶端發(fā)送服務(wù)器關(guān)閉信息--*/destory();}});start();/*--啟動連接服務(wù)--*/}publicvoidaddcomponettocontainer(){Containerc=this.getContentPane();c.setLayout(null);currnum.setBounds(20,15,130,20);totalnum.setBounds(155,15,125,20);js.setBounds(10,50,280,500);chatmsg.setBounds(10,560,180,30);send.setBounds(220,560,70,30);copyright.setBounds(10,600,280,20);c.add(currnum);c.add(totalnum);c.add(js);c.add(chatmsg);c.add(send);c.add(copyright);this.setVisible(true);this.setResizable(false);}publicvoidstart(){booleanisStarted=false;/*--用于標(biāo)記服務(wù)器是否已經(jīng)正常啟動--*/try{this.ss=newServerSocket(port);isStarted=true;this.allmsg.append((newDate()).toLocaleString()+"服務(wù)器啟動@端口:"+port+"\n");while(isStarted){Socketclient=this.ss.accept();/*--監(jiān)聽客戶端的連接--*/DataInputStreamin=newDataInputStream(client.getInputStream());Stringname=in.readUTF();useru=newuser();=name;u.socket=client;lists.add(u);//將該用戶加到列表中去num1++;num2++;currnum.setText("當(dāng)前在線人數(shù):"+num1);totalnum.setText("上線總?cè)藬?shù):"+num2);this.allmsg.append((newDate()).toLocaleString()+":"++"登錄\n");newThread(newClientThread(u)).start();/*--為該用戶啟動一個通信線程--*/}}catch(IOExceptione){System.out.println("服務(wù)器已經(jīng)啟動");System.exit(0);}}classClientThreadimplementsRunnable{useruser=null;booleanisConnected=true;DataInputStreamdis=null;DataOutputStreamdos=null;publicClientThread(useru){this.user=u;try{this.dis=newDataInputStream(this.user.socket.getInputStream());this.dos=newDataOutputStream(this.user.socket.getOutputStream());}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicvoidrun(){readmsg();}/*--讀取客戶的聊天信息--*/publicvoidreadmsg(){while(isConnected){try{Stringmsg=dis.readUTF();if("quit&logout".equals(msg))//當(dāng)用戶關(guān)閉客戶端窗口時,發(fā)送quit字符串表示用戶已經(jīng)退出{num1--;try{this.dis.close();this.dos.close();this.user.socket.close();this.isConnected=false;}catch(IOExceptionioe){ioe.printStackTrace();}finally{this.isConnected=false;if(dis!=null)this.dis.close();if(dos!=null)this.dos.close();if(this.user.socket!=null)this.user.socket.close();}lists.remove(this.user);//從列表中刪除該用戶currnum.setText("當(dāng)前在線人數(shù):"+num1);allmsg.append((newDate()).toLocaleString()+":"++"退出\n");}elsesendmsg(msg);}catch(IOExceptione){e.printStackTrace();}}}}/*--將信息進行轉(zhuǎn)發(fā)--*/publicvoidsendmsg(Stringmsg){userus=newuser();DataOutputStreamos=null;if(lists.size()>0){for(inti=0;i<lists.size();i++){us=(user)lists.get(i);try{os=newDataOutputStream(us.socket.getOutputStream());os.writeUTF(msg);}catch(IOExceptione){e.printStackTrace();}}}elseJOptionPane.showMessageDialog(null,"當(dāng)前無用戶在線。發(fā)送消息失敗","失敗",JOptionPane.OK_OPTION);}publicvoiddestory(){try{this.ss.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace(); }this.dispose();} publicstaticvoidmain(String[]args) {newserver(); }}packageclient;importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;importjava.io.*;import.*;publicclassclientextendsJFrame{privateJTextFieldname;privateJTextFieldip;privateJButtonok,cancle;publicSocketsocket;publicclient(){super("登錄框");this.setSize(400,80);this.setLocation(100,100);name=newJTextField("昵稱");ip=newJTextField("");ok=newJButton("登錄");cancle=newJButton("取消");ok.addActionListener(newlistenEvent());cancle.addActionListener(newlistenEvent());addcomponettocontainer();this.setDefaultCloseOperation(EXIT_ON_CLOSE);}publicvoidaddcomponettocontainer(){Containerc=this.getContentPane();c.setLayout(null);name.setBounds(10,10,100,30);ip.setBounds(120,10,100,30);ok.setBounds(230,10,70,30);cancle.setBounds(310,10,70,30);c.add(name);c.add(ip);c.add(ok);c.add(cancle);this.setVisible(true);this.setResizable(false);}publicclasslistenEventimplementsActionListener{publicvoidactionPerformed(ActionEventevent){//TODOAuto-generatedmethodstubif(event.getSource()==ok){Stringn=name.getText().trim();Stringi=ip.getText().trim();if("".equals(n)||"".equals(i)){JOptionPane.showMessageDialog(null,"昵稱、IP不能夠為空!","錯誤",JOptionPane.OK_OPTION);}else{login(n,i);}}if(event.getSource()==cancle){name.setText("");ip.setText("");}}}publicvoidlogin(Stringname,Stringip){try{socket=newSocket(ip,7777);DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.writeUTF(name);out.flush();//強制輸出緩存中的內(nèi)容//out.close();newClientFrame(name,socket);destroywindow();}catch(UnknownHostExceptione){JOptionPane.showMessageDialog(null,"找不到主機地址(IP錯誤/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);}catch(IOExceptione){}}publicvoiddestroywindow(){this.dispose();}publicstaticvoidmain(String[]args){newclient();}}packageserver;import.*;publicclassuser{Stringname;Socketsocket;}packageclient;importjava.awt.Color;importjava.awt.Container;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;import.Socket;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JOptionPane;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassClientFrameextendsJFrame{privateJTextAreaallmsg;privateJTextFieldwelcome,copyright,chatmsg;privateJButtonsend;privateJScrollPanejs;privatebooleanisConnected=true;publicDataOutputStreamout;publicDataInputStreamin;publicSockets=null;Stringnic;/*--保存用戶昵稱--*//***初始化客戶端資源*1.獲取從LoginFrame傳遞過來的參數(shù)*2.初始化界面元素*3.初始化通信所需要的資源EG:輸入/輸出流(DataInputStream/DataOutputStream)**/publicClientFrame(Stringname,Socketsocket){this.setSize(310,660);this.setLocation(290,50);this.setTitle("聊天室客戶端<"+name+">");/*--指定窗口的標(biāo)題--*/this.s=socket;/*--接收從LoginFrame中傳遞過來的Socket--*/this.nic=name+"說:";welcome=newJTextField("<"+name+">歡迎您來到聊天室",100);welcome.setBackground(Color.blue);welcome.setEnabled(false);copyright=newJTextField("allcopyright@TOP-king");copyright.setEnabled(false);allmsg=newJTextArea();allmsg.setEditable(false);allmsg.append("系統(tǒng)消息:歡迎登錄在線聊天室\n");js=newJScrollPane(allmsg);//為JTextArea添加滾動條chatmsg=newJTextField("在此輸入聊天信息");chatmsg.addActionListener(newlisten());send=newJButton("發(fā)送");send.addActionListener(newlisten());/*--添加事件監(jiān)聽器--*/try{out=newDataOutputStream(s.getOutputStream());in=newDataInputStream(s.getInputStream());}catch(IOExceptione){JOptionPane.showMessageDialog(null,"系統(tǒng)異常","錯誤",JOptionPane.OK_CANCEL_OPTION);}addcomponettocontainer();/*--當(dāng)用戶關(guān)閉窗口時進行相關(guān)的處理eg:SocketData(Input/Output)Stream的關(guān)閉--*/this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){sendmsg("quit&logout");/*--向服務(wù)器端發(fā)送關(guān)閉信息--*/isConnected=false;destory();/*--銷毀窗口資源--*/}});newThread(newlinread()).start();/*--啟動讀取信息線程--*/}publicvoidaddcomponettocontainer(){Containerc=this.getContentPane();c.setLayout(null);welcome.setBounds(75,10,150,20);js.setBounds(10,50,280,500);chatmsg.setBounds(10,560,180,30);send.setBounds(220,560,70,30);copyright.setBounds(10,600,280,20);c.add(welcome);c.add(js);c.add(chatmsg);c.add(send);c.add(copyright);this.setVisible(true);this.setResizable(false);}classlistenimplementsActionListener{publicvoidactionPerformed(ActionEvente){//TO

溫馨提示

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

最新文檔

評論

0/150

提交評論