計(jì)算機(jī)網(wǎng)絡(luò)課程大作業(yè)聊天系統(tǒng)_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程大作業(yè)聊天系統(tǒng)_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程大作業(yè)聊天系統(tǒng)_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程大作業(yè)聊天系統(tǒng)_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程大作業(yè)聊天系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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)介

1、武漢理工大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程論文題目基于C/S模式的簡(jiǎn)單聊天程序作者學(xué)院信息工程學(xué)院專業(yè)電子信息工程學(xué)號(hào)指導(dǎo)教師李方敏二一六年四月十三日武漢理工大學(xué)信息工程學(xué)院課程論文誠(chéng)信聲明本人聲明:所呈交的課程論文,是本人在指導(dǎo)老師的指導(dǎo)下,獨(dú)立開(kāi)展工作所取得的成果,成果不存在知識(shí)產(chǎn)權(quán)爭(zhēng)議,除文中已經(jīng)注明引用的內(nèi)容外,本課程論文不含任何其他個(gè)人或集體已經(jīng)發(fā)表或創(chuàng)作過(guò)的作品成果。對(duì)本文工作做出重要貢獻(xiàn)的個(gè)人和集體均已在文中以明確方式標(biāo)明。本人完全意識(shí)到本聲明的法律結(jié)果由本人承擔(dān)。本科課程論文作者簽名:二一六年四月十三日課程論文成績(jī)?cè)u(píng)定表質(zhì)量評(píng)價(jià)指標(biāo)(在相應(yīng)欄目打)評(píng) 價(jià) 項(xiàng) 目論文與設(shè)計(jì)評(píng)價(jià)質(zhì)量按對(duì)應(yīng)項(xiàng)目打分

2、工作量和態(tài)度(10分)分析問(wèn)題能力(10分)解決問(wèn)題能力(10分)內(nèi)容完整層次分明(10分)設(shè)計(jì)、實(shí)驗(yàn)正確性(10分)書(shū)寫(xiě)規(guī)范(10分)流程圖或拓?fù)鋱D(10分)論證充分(10分)測(cè)試結(jié)果情況(10分)總體評(píng)價(jià)(10分)評(píng)定成績(jī)(100分制)指導(dǎo)教師簽名年 月 日目錄一、選題背景1二、方案論證(或設(shè)計(jì)理念)12.1設(shè)計(jì)理念12.2程序流程圖32.3系統(tǒng)結(jié)構(gòu)圖4三、過(guò)程論述5四、結(jié)果分析54.1服務(wù)端界面54.2客戶端界面64.2.1賬號(hào)、密碼登錄核實(shí)64.2.2群聊74.2.3私聊74.3結(jié)果分析7五、結(jié)論(或總結(jié))8六、 參考文獻(xiàn)9附件一:程序源代碼10一、選題背景使用Socket實(shí)現(xiàn)網(wǎng)上聊天

3、功能。用戶可以通過(guò)客戶端連接到服務(wù)器端并進(jìn)行網(wǎng)上聊天。聊天時(shí)可以啟動(dòng)多個(gè)客戶端。服務(wù)器端啟動(dòng)后,接收客戶端發(fā)來(lái)的用戶名和密碼驗(yàn)證信息。驗(yàn)證通過(guò)則以當(dāng)前的聊天客戶列表信息進(jìn)行響應(yīng);此后接收客戶端發(fā)來(lái)的聊天信息,轉(zhuǎn)發(fā)給客戶端指定的聊天客戶(即私聊)或所有其他客戶端;在客戶斷開(kāi)連接后公告其退出聊天系統(tǒng)的信息??蛻舳藛?dòng)后在GUI界面接收用戶輸入的服務(wù)器端信息、賬號(hào)和密碼等驗(yàn)證客戶的身份。驗(yàn)證通過(guò)則顯示當(dāng)前系統(tǒng)在線客戶列表。客戶可以與指定對(duì)象進(jìn)行私聊,也可以向系統(tǒng)中所有在線客戶發(fā)送信息。實(shí)現(xiàn)本程序需要了解網(wǎng)絡(luò)基礎(chǔ)知識(shí),掌握C/S結(jié)構(gòu)的工作特點(diǎn),掌握數(shù)據(jù)結(jié)構(gòu)、高級(jí)語(yǔ)言及網(wǎng)絡(luò)編程知識(shí),可以選擇Visual

4、 C+、C或Java等語(yǔ)言實(shí)現(xiàn)。二、方案論證(或設(shè)計(jì)理念)2.1設(shè)計(jì)理念基于C/S的簡(jiǎn)單聊天室可以實(shí)現(xiàn)用戶與服務(wù)器間,服務(wù)器與多個(gè)用戶間的通信。聊天室程序通常需要完成以下一些基本功能:     (1)登錄聊天室;     (2)啟動(dòng)服務(wù)器;     (3)關(guān)閉服務(wù)器;     (4)用戶之間的聊天;    (5)退出聊天室。   

5、;   本系統(tǒng)其體功能需求如下: (1)聊天室管理員登錄到管理界而,即系統(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ù)器斷開(kāi)與客戶端的連接則所有的用戶都失去與服務(wù)器的連接。 (5)

6、用戶的聊天信息錄入,重寫(xiě),發(fā)送,接收方便,快捷。  (6)服務(wù)器狀態(tài),聊天信息和在線用戶人數(shù)及時(shí)刷新。   (7)聊天室系統(tǒng)運(yùn)行穩(wěn)定、安全性高。2.2程序流程圖聊天界面登錄界面更新消息和在線用戶信息登錄信息正確聊天服務(wù)器用戶登錄用戶退出聊天消息來(lái)自客戶端的消息 N Y登錄界面顯示錯(cuò)誤對(duì)話框登錄面向用戶顯示聊天界面將登錄失敗信息發(fā)送給登錄界面將登錄成功信息發(fā)送給登錄界面服務(wù)器驗(yàn)證登錄信息將登陸信息發(fā)給服務(wù)站登錄界面 N Y2.3系統(tǒng)結(jié)構(gòu)圖客戶端消息收集CCCCC消息分發(fā)活躍客戶端三、過(guò)程論述(1)構(gòu)建聊天室管理員界面,即系統(tǒng)的服務(wù)器端,開(kāi)啟并管理

7、服務(wù)器。(2)構(gòu)建用戶登陸界面和聊天大廳界面,登陸以及接發(fā)信息。(3)構(gòu)建登陸機(jī)制,用戶端需要在登陸界面中輸入正確的用戶名及其密碼后才可以與服務(wù)器之間收發(fā)信息。(4)代碼實(shí)現(xiàn)管理員進(jìn)行管理界面后可以方便的啟動(dòng)/停止服務(wù)器,以及知曉用戶的在線/下線情況。(5)代碼實(shí)現(xiàn)客戶端進(jìn)行群發(fā)/私聊機(jī)制,并將對(duì)應(yīng)的數(shù)據(jù)發(fā)給服務(wù)器端。(6)完善代碼,提升聊天室系統(tǒng)的穩(wěn)定性,完全性。(7)測(cè)試系統(tǒng)。四、結(jié)果分析4.1服務(wù)端界面4.2客戶端界面4.2.1賬號(hào)、密碼登錄核實(shí)4.2.2群聊4.2.3私聊4.3結(jié)果分析此次基于C/S模式的聊天室設(shè)計(jì)可以實(shí)現(xiàn)服務(wù)端的開(kāi)啟關(guān)閉、客戶登陸、以及信息的群發(fā)或者私聊功能,并且還有

8、每條信息的接發(fā)所對(duì)應(yīng)的時(shí)間,方便核實(shí)數(shù)據(jù),而且界面操作簡(jiǎn)單,便于使用者使用。本設(shè)計(jì)采用環(huán)回IP127.0.0.1進(jìn)行測(cè)試,效果基本達(dá)到要求,因此,此次設(shè)計(jì)還是十分成功的。五、結(jié)論(或總結(jié))兩周的課程設(shè)計(jì)結(jié)束了,我的收獲很大。通過(guò)課程設(shè)計(jì)的編程和對(duì)編程過(guò)程中遇到的問(wèn)題的思考,有效的提高了我對(duì)數(shù)據(jù)結(jié)構(gòu)的認(rèn)識(shí)和理解,切實(shí)的提高了我的編程能力,補(bǔ)全了我的不足。通過(guò)這次課程設(shè)計(jì),我鞏固所了學(xué)過(guò)的知識(shí),能用JAVA熟練地運(yùn)用其中的一些,進(jìn)一步掌握了各個(gè)指令的功能是轉(zhuǎn)向。課程設(shè)計(jì)是對(duì)我們所學(xué)的這些東西一個(gè)綜合的運(yùn)用。在整個(gè)程序的編寫(xiě)中,調(diào)試占了很大部分的時(shí)間。要想寫(xiě)好程序,必須認(rèn)真對(duì)待代碼的每一個(gè)細(xì)節(jié),還必

9、須熟練的掌握各種命令,這對(duì)程序的調(diào)試是非常重要的。通過(guò)這次實(shí)際動(dòng)手能力的培養(yǎng),我進(jìn)一步熟悉了使用方法,基本達(dá)到了能獨(dú)立閱讀、編制和調(diào)試一定規(guī)模的水平。課程設(shè)計(jì)是對(duì)自己所學(xué)知識(shí)掌握程度最好的檢驗(yàn),特別是對(duì)于一些細(xì)節(jié)問(wèn)題??荚囘€并不能完全的說(shuō)明什么,因?yàn)榭碱}都是一些單個(gè)的問(wèn)題,大多只是知識(shí)的某一方面。而課程設(shè)計(jì)不同,我們要用到很多的單個(gè)知識(shí)點(diǎn),把他們綜合起來(lái)運(yùn)用到自己的課題當(dāng)中。學(xué)了一個(gè)學(xué)期的數(shù)據(jù)結(jié)構(gòu),現(xiàn)在終于迎來(lái)了課程設(shè)計(jì),當(dāng)然是一個(gè)很好的鍛煉自己的機(jī)會(huì)。   在本次的課程設(shè)計(jì)也發(fā)現(xiàn)了自己很多的缺點(diǎn)不足之處,對(duì)于一些細(xì)節(jié)性的問(wèn)題老犯錯(cuò),特別是一個(gè)標(biāo)點(diǎn)的錯(cuò)誤,很急人。

10、對(duì)于有些知識(shí)掌握的不行,有的是模模糊糊的不牢靠,雖然有的東西考試考過(guò),但當(dāng)它用到實(shí)際問(wèn)題的時(shí)候,往往不知道用哪,放哪。實(shí)踐出真知。課程設(shè)計(jì)是個(gè)實(shí)踐,雖然實(shí)際不長(zhǎng),但給我們對(duì)知識(shí)的運(yùn)用,利用都有了很好的發(fā)揮。人多力量大這句話是真理啊,不懂得地方問(wèn)同學(xué),不會(huì)的地方也問(wèn)同學(xué),自己努力的同時(shí)跟別人共同進(jìn)步,這就是合作,學(xué)會(huì)合作是我們以后必備的重要的一項(xiàng)人際技能。一個(gè)程序的完成需要不斷地修改才能夠得到完善,人生正如那程序一樣,只有不斷地努力、奮斗、勇往直前,才能夠完善自己,做最好的自己。 6、 參考文獻(xiàn)1.謝希仁等. 計(jì)算機(jī)網(wǎng)絡(luò)(第六版) M. 北京:人民郵電工業(yè)出版社,2015.;2.Jav

11、a2實(shí)用教程(第三版 ) 編著者 耿祥義 張躍平 清華大學(xué)出版社 2006 3.Java編程設(shè)計(jì)    編著者  劉海杰 中國(guó)鐵道出版社 2006  4.Java網(wǎng)絡(luò)編程精解  編著者 孫衛(wèi)琴    電子工業(yè)出版社 :3032.附件一:程序源代碼客戶端代碼:package client;import java.awt.*;import java.a

12、wt.event.*;import java.io.*;import .*;import java.util.*;import javax.swing.*;public class Client extends JFrame Socket clientsocket = null; DataInputStream in = null; DataOutputStream out = null; JTextArea inputText; int flag; String SerAddress = "127.0.0.1" int SendPort = 8888; JTextFiel

13、d NickName; JTextField Password; JTextField man; JTextArea textShow; JButton button, setbutton; Vector id=new Vector(6); Vector passwd = new Vector(6); public Client() / 構(gòu)造函數(shù),創(chuàng)建一個(gè)布局并初始化 setuser(); init(); setVisible(true); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setBounds(480, 160, 340

14、, 500); setTitle("電信1303王潔茹的聊天室"); setResizable(false); void setuser() id.add("王潔茹"); id.add("孫秀丹"); id.add("陳思賢"); id.add("趙亦駿"); id.add("唐靜如"); passwd.add("wjr"); passwd.add("sxd"); passwd.add("csx"); passwd.

15、add("zyj"); passwd.add("tjr"); void init() / 初始化函數(shù),設(shè)置布局并且設(shè)置監(jiān)視器 inputText = new JTextArea(5, 29); button = new JButton(" 發(fā)送 "); JLabel label = new JLabel("賬號(hào)"); setbutton = new JButton(" 登錄 "); JLabel label1 = new JLabel("密碼"); JLabel label2

16、 = new JLabel("私聊對(duì)象"); textShow = new JTextArea(15, 29); textShow.setEditable(false); NickName = new JTextField(7); Password = new JTextField(7); man = new JTextField(10); inputText.setBackground(new Color(255, 255, 255); setLayout(new FlowLayout(); getContentPane().setBackground(new Color

17、(255, 204, 204); add(new JScrollPane(textShow); textShow.setBackground(new Color(255, 255, 255); setbutton.setBackground(new Color(255, 153, 163); button.setBackground(new Color(255, 153, 163); NickName.setBackground(new Color(255, 255, 255); Password.setBackground(new Color(255, 255, 255); label.se

18、tForeground(new Color(255,102,102); label1.setForeground(new Color(255,102,102); label2.setForeground(new Color(255,102,102); add(label); add(NickName); add(label1); add(Password); add(setbutton); add(label2); add(man); add(new JScrollPane(inputText); add(button); setbutton.addActionListener(new Act

19、ionListener() /添加監(jiān)視器 public void actionPerformed(ActionEvent e) for(int i = 0;i < id.size();i+) if(id.get(i).equals(NickName.getText()&passwd.get(i).equals(Password.getText() flag=1; if(flag=1) Thread readData; Read read = null; try clientsocket = new Socket(); read = new Read(); readData = n

20、ew Thread(read); if (clientsocket.isConnected() else InetAddress address = InetAddress.getByName(SerAddress); InetSocketAddress socketAddress = new InetSocketAddress( address, SendPort); clientsocket.connect(socketAddress); textShow.append(new java.text.SimpleDateFormat( "yy-MM-dd HH:mm:ss"

21、;).format(new Date() + "n與服務(wù)器連接成功n已登錄聊天室n"); in = new DataInputStream(clientsocket.getInputStream(); out = new DataOutputStream(clientsocket .getOutputStream(); read.setDataInputStream(in); readData.start(); catch (Exception e1) textShow.append(new java.text.SimpleDateFormat( "yy-MM-d

22、d HH:mm:ss").format(new Date() + "n服務(wù)器連接失敗n"); else textShow.append(new java.text.SimpleDateFormat( "yy-MM-dd HH:mm:ss").format(new Date() + "n賬號(hào)或密碼錯(cuò)誤,請(qǐng)重新輸入n"); ); button.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) Send send =

23、new Send(); Thread sendData = new Thread(send); send.setDataOutputStream(out); sendData.start(); ); addWindowListener(new WindowAdapter() /響應(yīng)關(guān)閉按鈕的功能 public void windowClosing(WindowEvent e) int option = JOptionPane .showConfirmDialog(null, "親愛(ài)的你真的要離開(kāi)聊天室么?", " 電信1303王潔茹", JOptionP

24、ane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (option = JOptionPane.YES_OPTION) System.exit(0); ); / init結(jié)束 class Read implements Runnable /讀取輸入流的線程 DataInputStream in; public void setDataInputStream(DataInputStream in) this.in = in; public void run() String result; while (true) try result =

25、in.readUTF(); textShow.append(new java.text.SimpleDateFormat( "yy-MM-dd HH:mm:ss").format(new Date() + "n" + result); catch (IOException e) textShow.append(new java.text.SimpleDateFormat( "yy-MM-dd HH:mm:ss").format(new Date() + "n與服務(wù)器斷開(kāi)連接n"); break; class Sen

26、d implements Runnable / 發(fā)送消息的輸出流線程 DataOutputStream out; public void setDataOutputStream(DataOutputStream out) this.out = out; public void run() String message = null; message = NickName.getText() + ":" + inputText.getText() + "n" if(man.getText().isEmpty()/群發(fā) try out.writeUTF(me

27、ssage); inputText.setText(""); catch (Exception e2) textShow.append("發(fā)送失?。何催B接到服務(wù)器n"); else try message = man.getText()+":"+NickName.getText() + ":" + inputText.getText() + "n" out.writeUTF(message); textShow.append(new java.text.SimpleDateFormat( &qu

28、ot;yy-MM-dd HH:mm:ss").format(new Date() + "n" +"私聊to:"+message); inputText.setText(""); catch (Exception e2) textShow.append("發(fā)送失?。何催B接到服務(wù)器n"); public static void main(String args) Client client = new Client(); 服務(wù)端代碼:package Server;import java.awt.*;impor

29、t java.io.*;import .*;import java.util.*;import java.awt.event.*;import javax.swing.*;public class Server extends JFrame JTextArea textShow; JButton start; Vector socketsss = new Vector();/這里用到了變長(zhǎng)對(duì)象數(shù)組,用來(lái)存儲(chǔ)來(lái)自客戶端的socket對(duì)象 ServerSocket server = null; Socket clients; public Server() / 服務(wù)器的構(gòu)造函數(shù),并且初始化 ini

30、t(); setVisible(true); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setBounds(450, 150, 340, 455); setTitle("電信1303王潔茹的聊天室服務(wù)器"); setResizable(false); void init() / 設(shè)置布局和事件監(jiān)視器 setLayout(new FlowLayout(); getContentPane().setBackground(new Color(255, 204, 204); textShow = new JTextA

31、rea(21, 29); textShow.setBackground(new Color(255, 255, 255); start = new JButton(" 啟動(dòng)服務(wù)器 "); start.setBackground(new Color(255, 153, 163); add(start); add(new JScrollPane(textShow); textShow.setEditable(false); start.addActionListener(new ActionListener() public void actionPerformed(Actio

32、nEvent e) /在這里啟動(dòng)監(jiān)聽(tīng)的線程 Listen listen = new Listen(); Thread go = new Thread(listen); go.start(); ); addWindowListener(new WindowAdapter() / 響應(yīng)關(guān)閉按鈕功能 public void windowClosing(WindowEvent e) int option = JOptionPane .showConfirmDialog(null, "確定退出聊天室?", " 電信1303王潔茹", JOptionPane.YES

33、_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (option = JOptionPane.YES_OPTION) System.exit(0); ); / init()結(jié)束 class ServerThread extends Thread / 服務(wù)器消息處理的線程 Socket socket; DataOutputStream out = null; DataInputStream in = null; int num; String s = null; Vector sockets = new Vector(); int j = 0; Serv

34、erThread(Socket t, Vector socketss) socket = t; sockets = socketss; try in = new DataInputStream(socket.getInputStream(); catch (IOException e) public void run() while (true) try String r = in.readUTF();/ 堵塞狀態(tài),除非讀取到信息 num=r.charAt(0)-'0' if(r.substring(0, 2).equals("0:")|r.substrin

35、g(0, 2).equals("1:")|r.substring(0, 2).equals("2:")|r.substring(0, 2).equals("3:")|r.substring(0, 2).equals("4:")|r.substring(0, 2).equals("5:") if(sockets.size()>=num) try out = new DataOutputStream( (Socket) sockets.get(num).getOutputStream(); /

36、 對(duì)于每個(gè)數(shù)組內(nèi)的socket對(duì)象都建立輸出流 out.writeUTF("私聊from:"+r); catch (IOException e) textShow.append("系統(tǒng)出現(xiàn)錯(cuò)誤n"); else try for (int j = 0; j < sockets.size(); j+) out = new DataOutputStream( (Socket) sockets.get(j).getOutputStream(); / 對(duì)于每個(gè)數(shù)組內(nèi)的socket對(duì)象都建立輸出流 out.writeUTF(r.charAt(0)-'0')+"號(hào)用戶不在線"); catch (IOException e) textShow.append("系統(tǒng)出現(xiàn)錯(cuò)誤n"); else for (int j = 0; j < sockets.size(); j+) out = new DataOutputStream(

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論