聊天室課程設(shè)計報告_第1頁
聊天室課程設(shè)計報告_第2頁
聊天室課程設(shè)計報告_第3頁
聊天室課程設(shè)計報告_第4頁
聊天室課程設(shè)計報告_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上西安郵電學(xué)院網(wǎng)絡(luò)課程設(shè)計 設(shè)計報告題 目:基于TCP SOCKET的JAVA聊天室院系名稱: 計算機(jī)學(xué)院 專業(yè)名稱: 網(wǎng)絡(luò)工程班 級: 學(xué)生姓名: 學(xué)號(8位): 指導(dǎo)教師: 設(shè)計起止時間:2011年6月20日2011年7月1日第一章 功能分析1.1 需求分析人們?nèi)粘I钪性絹碓蕉嗟厥褂昧奶焓疫@項應(yīng)用來為自己的工作和學(xué)習(xí)服務(wù)。一個操作簡單,界面友好、運行穩(wěn)定的聊天室對于小型局域網(wǎng)的用戶可以起到很好的交流作用。所謂聊天室就是一個可以讓許多用戶同時互相通信的網(wǎng)上園地,個人用戶可以通過聊天室將自己融入整個主流社會中。根據(jù)目前使用聊天室的用戶需求顯示,用戶對于聊天室主要有以下

2、幾點要求:(1). 與聊天室成員一起聊天。(2). 可以與聊天室成員私聊。(3). 可以改變聊天內(nèi)容風(fēng)格。(4). 用戶注冊(含頭像)、登錄。(5). 服務(wù)器監(jiān)控聊天內(nèi)容。(6). 服務(wù)器過濾非法內(nèi)容。(7). 服務(wù)器發(fā)送通知。(8). 服務(wù)器踢人。(9). 保存服務(wù)器日志。(10).保存用戶聊天信息。該簡易聊天室是為許多喜愛聊天的用戶開發(fā)設(shè)計的,和許多大型的網(wǎng)絡(luò)聊天室相比該小聊天室功能比較簡單,但能實現(xiàn)基本的聊天功能,點對多、點對點聊天和基本的用戶功能,登錄、查看在線用戶等。1.2 軟件功能描述(1)、戶設(shè)置:用戶自定義自己的登錄名,成功設(shè)置后,服務(wù)端能接收到新設(shè)置的用戶名。(2)、登錄功能

3、:在服務(wù)端開啟的情況下,用戶可以以自己自定義或者默認(rèn)的登錄名和登錄地址端口登錄到客戶端,并能在服務(wù)器端顯示登錄狀態(tài)。(3)、公聊:用戶可以與“所有人”聊天,在線用戶可正常接收并正確顯示公聊消。(4)、私聊:用在線用戶和其他用戶聊天。記錄對于聊天室的其他用戶是不可見的。(5)、聊天心情:用戶在聊天的過程中可以選擇相應(yīng)的心情來表達(dá)自己的情感。(6)、系統(tǒng)消息:服務(wù)端運行,為每一個用戶都能接收服務(wù)器端發(fā)送的信息提示信息。(7)、用戶的狀態(tài).每一個客戶端用戶都可以實時看到目前其他在線用戶的狀態(tài)。(8)、用戶剔除:用戶可以被系統(tǒng)剔除,并重新登記登錄名和地址。(9)、用戶退出:用戶可以在正常情況下退出聊天

4、室。(10)、服務(wù)端控制:服務(wù)端開啟的情況下,用戶才能登陸成功和聊天;用戶設(shè)置的地址端口也必須與服務(wù)端的偵聽端口一致,否則不能登錄。第二章 主要模塊描述及流程圖2. 1 模塊介紹 本聊天室分為聊天室服務(wù)端和聊天室客戶端,服務(wù)端與客戶端之間通過套接口Socket(TCP)連接。在java中使用套接口相當(dāng)簡單,Java API為處理套接口的通信提供了一個類.Socket,服務(wù)器采用多線程以滿足多用戶的請求,并通過創(chuàng)建一個AppSocket來監(jiān)聽來自客戶的連接請求,默認(rèn)IP地址為:127.0.0.1默認(rèn)端口為8888。2.1.1服務(wù)端模塊圖聊天室服務(wù)端端口服務(wù)退出服務(wù)器發(fā)送系統(tǒng)消息停止服務(wù)啟動服務(wù)消

5、息顯示 聊天室服務(wù)端模塊圖 3-1-1端口服務(wù):輸入要偵聽的端口,默認(rèn)為8888。啟動服務(wù):啟動服務(wù)器,并開始在設(shè)置的端口中偵聽,客戶端用戶可以登錄并聊天。停止服務(wù):關(guān)閉服務(wù)器,偵聽結(jié)束。客戶端用戶不能再聊天。發(fā)送系統(tǒng)消息:服務(wù)器端給所有人或者個別用戶發(fā)送消息。消息顯示:可以顯示所有用戶的聊天記錄,和上線、下線信息。退出服務(wù)器:退出程序,并停止服務(wù)。聊天室客戶端2.1.2客戶端模塊圖發(fā)送/接收聊天消息連接設(shè)置用戶登錄用戶設(shè)置退出用戶設(shè)置:用戶可以設(shè)置自己的用戶名進(jìn)行聊天。連接設(shè)置:用戶可以設(shè)置自己的服務(wù)器的IP,端口號,默認(rèn)地址為:127.0.0.1:8888。用戶登錄:在聊天室服務(wù)端已開啟的

6、情況下,用戶才能登錄,之后才能開始聊天。用戶注銷:退出聊天,可以繼續(xù)修改用戶設(shè)置和連接設(shè)置。發(fā)送和接收聊天信息:用戶可以用戶發(fā)送信息,并能看送給自己或所有人的消息。退出:關(guān)閉所有聊天并退出客戶端。2. 2 流程圖 聊天室服務(wù)器啟動服務(wù)端口服務(wù) 設(shè)置偵聽端口 默認(rèn)端口:8888聊天登錄用戶設(shè)置聊天室客戶端 連接設(shè)置 設(shè)置用戶名退出 默認(rèn)連接地址或用戶名 設(shè)置IP地址和端口2. 3 服務(wù)器客戶端關(guān)系圖(ActionListenerChatServer-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-user

7、LinkList:UserLinkList-showStatus:JTextField+ ChatServer():public+init():public void +startService():public void+stopService():public void +sendStopToAll():public void+sendMsgToAll(String):public void+ sendSystemMessage():public voidJFrameThreadServerListen- server: ServerSocket- userLinkList :UserLi

8、nkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)1). 聊天室服務(wù)器端設(shè)計: 2.3.1聊天室服務(wù)器端設(shè)計聊天室服務(wù)端主要包括4個文件,

9、它們的功能如下:(1)AppServer .java 服務(wù)器端進(jìn)行監(jiān)聽客戶端進(jìn)行服務(wù)器的啟動,以及端客戶進(jìn)行處理用戶退出。(2)ServerFrame 為服務(wù)器端管理界面,負(fù)責(zé)用戶帳號信息保存和用戶在線的狀態(tài)和相關(guān)服務(wù)器端口的信息以及訪問的方式。(3)serverChat.java 負(fù)責(zé)對用戶信息的處理包括公聊和私聊的信息的發(fā)送以及將聊天信息的序列化對象填加到保存聊天信息的記事本中。2.3.2聊天室客戶端設(shè)計ActionListenerChatClient-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea

10、-userLinkList:UserLinkList-showStatus:JTextField+ ChatClient():public+init():public void +Connect():public void+DisConnect():public void +SendMessage():public voidJFrameThreadClientReceive- socket: Socket-output:ObjectOutputStream-input:ObjectInputStream +ClientReceive(Socket,ObjectOutputStream,Obje

11、ctInputStream,JComboBox,JTextArea,JTextField )聊天室客戶端主要包括6個文件,其主要功能如下:(1).ChatClient.java 為客戶端程序啟動類,負(fù)責(zé)客戶端的啟動和退出。(2).Login.java 為客戶端程序登錄界面,負(fù)責(zé)用戶帳號信息的驗證與反饋。(3).Register.java 為客戶端程序注冊界面,負(fù)責(zé)用戶帳號信息的注冊驗證與反饋。(4).ChatRoom.java 為客戶端程序聊天室主界面,負(fù)責(zé)接收、發(fā)送聊天內(nèi)容與服務(wù)器端的Connection.java 親密合作。(5).Windowclose 為ChatRoom.java的內(nèi)部

12、類,負(fù)責(zé)監(jiān)聽聊天室界面的操作,當(dāng)用戶退出時返回給服務(wù)器信息。(6).Clock.java 為客戶端程序的一個小程序,實現(xiàn)的一個石英鐘功能。第三章 主要程序代碼和界面展示3.1 服務(wù)器端啟動代碼和界面 3.1.1 服務(wù)器啟動代碼public class AppServer extends Thread private ServerSocket serverSocket;private ServerFrame sFrame;private static Vector userOnline = new Vector(1, 1);private static Vector v = new Vector

13、(1, 1);/ 創(chuàng)建服務(wù)器 啟動服務(wù)監(jiān)聽8888端口 public AppServer() sFrame = new ServerFrame();try serverSocket = new ServerSocket(8888);/ 獲取服務(wù)器的主機(jī)名和IP地址InetAddress address = InetAddress.getLocalHost();sFrame.txtServerName.setText(address.getHostName();sFrame.txtIP.setText(address.getHostAddress();sFrame.txtPort.setText

14、("8888"); catch (IOException e) fail(e, "不能啟動服務(wù)!");sFrame.txtStatus.setText("已啟動.");this.start(); / 啟動線程/ 退出服務(wù)器,退出消息public static void fail(Exception e, String str) System.out.println(str + " 。" + e);/監(jiān)聽客戶的請求,當(dāng)有用戶請求時創(chuàng)建 Connection線程public void run() try while (

15、true) / 監(jiān)聽并接受客戶的請求Socket client = serverSocket.accept();new Connection(sFrame, client, userOnline, v); / 支持多線程/ System.out.println("userLength:"+userLength);atch (IOException e) fail(e, "不能監(jiān)聽!");/服務(wù)器public static void main(String args) new AppServer();3.1.2 服務(wù)器啟動界面服務(wù)器登錄界面圖 4-1-23

16、. 2 注冊主要代碼及界面3.2.1 注冊主要代碼public class Register extends JFrame implements ActionListenerprivate JComboBox comboBox;private static final long serialVersionUID = L;JPanel pnlRegister;JLabel lblUserName,lblGender,lblAge;JLabel lblPassword,lblConfirmPass,lblEmail,logoPosition;JTextField txtUserName,txtAg

17、e,txtEmail;JPasswordField pwdUserPassword,pwdConfirmPass;JRadioButton rbtnMale,rbtnFemale;ButtonGroup btngGender; JButton btnOk,btnCancel,btnClear;String strServerIp;final JLabel headLabel = new JLabel(); /用于將窗口用于定位Dimension scrnsize; Toolkit toolkit=Toolkit.getDefaultToolkit(); /構(gòu)造方法public Register

18、(String ip)super("HappyChat聊天室注冊窗口");strServerIp=ip;pnlRegister=new JPanel();this.getContentPane().add(pnlRegister);lblUserName=new JLabel("用 戶 名:");lblGender=new JLabel("性 別:");lblAge=new JLabel("年 齡:");lblPassword=new JLabel("密 碼:");lblConfirmPass=

19、new JLabel("確認(rèn)密碼:");lblEmail=new JLabel("電子郵件:");txtUserName=new JTextField(30);txtEmail=new JTextField(30);txtAge=new JTextField(10);pwdUserPassword=new JPasswordField(30);pwdConfirmPass=new JPasswordField(30);rbtnMale=new JRadioButton("男",true);rbtnFemale=new JRadioBu

20、tton("女"); btngGender=new ButtonGroup(); btnOk=new JButton("確定(O)"); btnOk.setMnemonic('O'); btnOk.setToolTipText("保存注冊信息");btnCancel=new JButton("返回(B)");btnCancel.setMnemonic('B');btnCancel.setToolTipText("返回登錄窗口");btnClear=new JBut

21、ton("清空(L)");btnClear.setMnemonic('L');btnClear.setToolTipText("清空注冊信息");/按鈕注冊監(jiān)聽btnOk .addActionListener(this);btnCancel.addActionListener(this);btnClear .addActionListener(this);final JLabel label = new JLabel();label.setText("頭 像:");label.setBounds(30, 120, 60

22、, 15);pnlRegister.add(label);comboBox = new JComboBox();comboBox.setAutoscrolls(true);comboBox.setModel(new DefaultComboBoxModel(new String "1", "2",);comboBox.setBounds(110, 116, 47, 23);comboBox.addItemListener(new ItemListener() public void itemStateChanged(ItemEvent arg0) Ico

23、n logo = new ImageIcon("face"+comboBox.getSelectedItem().toString()+".jpg");/ TODO 自動生成方法存根headLabel.setIcon(logo););pnlRegister.add(comboBox);headLabel.setHorizontalAlignment(SwingConstants.CENTER);/.setIcon(SwingResourceManager.getIcon(Register.class, "face/1.jpg");he

24、adLabel.setIcon(new ImageIcon("face/1.JPG");headLabel.setBounds(247, 88, 74, 72);pnlRegister.add(headLabel); /構(gòu)造方法結(jié)束/按鈕監(jiān)聽響應(yīng)public void actionPerformed(ActionEvent ae)Object source=new Object(); source=ae.getSource(); if (source.equals(btnOk) /"確定"按鈕 register(); if (source.equals(

25、btnCancel) /"返回"按鈕 new Login();this.dispose(); if (source.equals(btnClear) /"清空"按鈕 txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText(""); /actionPerformed()結(jié)束/&q

26、uot;確定"按鈕事件響應(yīng)/SuppressWarnings( "deprecation", "static-access" )public void register()/接受客戶的詳細(xì)資料 Register_Customer data=new Register_Customer(); data.custName = txtUserName.getText();data.custPassword = pwdUserPassword.getText();data.age = txtAge.getText();data.sex = rbtnMal

27、e.isSelected()?"男":"女"data.email = txtEmail.getText();/chenmindata.head = comboBox.getSelectedItem().toString();/驗證用戶名是否為空if(data.custName.length()=0) JOptionPane.showMessageDialog(null,"用戶名不能為空"); return;/驗證密碼是否為空if(data.custPassword.length()=0) JOptionPane.showMessage

28、Dialog(null,"密碼不能為空"); return/驗證密碼的一致性if(!data.custPassword.equals(pwdConfirmPass.getText() JOptionPane.showMessageDialog(null,"密碼兩次輸入不一致,請重新輸入"); return;/驗證年齡是否為空if(data.age.length()=0) JOptionPane.showMessageDialog(null,"年齡不能為空"); return;/驗證年齡的合法性int age=Integer.parse

29、Int(txtAge.getText();if (age<=0|age>100)JOptionPane.showMessageDialog(null,"年齡輸入不合法");return;/驗證Email的正確性int Found_flag=0; /判斷標(biāo)志for (int i=0;i<data.email.length();i+) if(data.email.charAt(i)='') Found_flag+;if(Found_flag!=1)JOptionPane.showMessageDialog(null,"電子郵箱格式不正

30、確,請重新輸入"); return;try /連接到服務(wù)器Socket toServer; toServer = new Socket(strServerIp,8888); ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream(); /寫客戶詳細(xì)資料到服務(wù)器socket streamToServer.writeObject(Register_Customer)data); /讀來自服務(wù)器socket的登陸狀態(tài) BufferedReader fromServer=new Bu

31、fferedReader(new InputStreamReader(toServer.getInputStream(); String status=fromServer.readLine();/顯示成功消息 JOptionPane op=new JOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+"注冊成功") txtUserName.setText(""); pwdUserPassword.setText(""); pw

32、dConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText(""); /關(guān)閉流對象 streamToServer.close(); fromServer.close(); catch(InvalidClassException e1) JOptionPane.showMessageDialog(null,"類錯誤!"); catch(NotSerializableException e2)JOptionPane.showMessageDialog(n

33、ull,"對象未序列化!"); catch(IOException e3) JOptionPane.showMessageDialog(null,"不能寫入到指定服務(wù)器!"); /方法register()結(jié)束public static void main(String args)new Register("127.0.0.1"); /class Register 結(jié)束3.2.2 注冊界面3. 3 登錄主要代碼和界面3.3.1 登錄代碼public class Login extends JFrame implements Action

34、Listener private static final long serialVersionUID = -L;private JPanel pnlLogin;private JButton btnLogin, btnRegister, btnExit;private JLabel lblServer, lblUserName, lblPassword, lblLogo;private JTextField txtUserName, txtServer;private JPasswordField pwdPassword;private String strServerIp;/ 用于將窗口定

35、位private Dimension scrnsize;private Toolkit toolkit = Toolkit.getDefaultToolkit();public Login() super("登錄HappyChat聊天室");pnlLogin = new JPanel();this.getContentPane().add(pnlLogin);lblServer = new JLabel("服務(wù)器(S):");lblUserName = new JLabel("用戶名(U):");lblPassword = new J

36、Label("密 碼(P):");txtServer = new JTextField(20);txtServer.setText("127.0.0.1");txtUserName = new JTextField(20);pwdPassword = new JPasswordField(20);btnLogin = new JButton("登錄(L)");btnLogin.setToolTipText("登錄到服務(wù)器");btnLogin.setMnemonic('L');btnRegister

37、 = new JButton("注冊(R)");btnRegister.setToolTipText("注冊新用戶");btnRegister.setMnemonic('R');btnExit = new JButton("退出(X)");btnExit.setToolTipText("退出系統(tǒng)");btnExit.setMnemonic('X');3.3.2 登錄界面登錄界面圖4-1-33. 4 聊天主要代碼和界面3.4.1 主要代碼public class ChatRoom ex

38、tends Thread implements ActionListener private JComboBox daXiaoComboBox;private JComboBox yangShiComboBox;private JComboBox zitiComboBox;private JComboBox emote;static JFrame frmChat;JPanel pnlChat;JButton btnCls, btnExit, btnSend, btnClear, btnSave, btnTimer;JLabel lblUserList, lblUserMessage, lblS

39、endMessage, lblChatUser;JLabel lblUserTotal, lblCount, lblBack;JTextField txtMessage;java.awt.List lstUserList;TextArea taUserMessage;JComboBox cmbUser;JCheckBox chPrivateChat;String strServerIp, strLoginName;Thread thread;final JLabel headLabel = new JLabel();/ 用于將窗口用于定位Dimension scrnsize;Toolkit t

40、oolkit = Toolkit.getDefaultToolkit();Message messobj = null;String serverMessage = ""final JSlider blueSlider = new JSlider();final JSlider redSlider = new JSlider();final JSlider greenSlider = new JSlider();final JLabel hanziLabel = new JLabel();/ 構(gòu)造方法public ChatRoom(String name, String i

41、p) / Dialog d = new FontDialog();strServerIp = ip;strLoginName = name;frmChat = new JFrame("聊天室" + "用戶:" + name + "");pnlChat = new JPanel();frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frmChat.getContentPane().add(pnlChat);Font fntDisp1 = new Font("宋體&qu

42、ot;, Font.PLAIN, 12);String list = "所有人" ;btnCls = new JButton("清屏(C)");btnExit = new JButton("退出(X)");btnSend = new JButton("發(fā)送(N)");btnSave = new JButton("保存(S)");btnTimer = new JButton("時鐘(T)");lblUserList = new JLabel("【在線用戶列表】&quo

43、t;);lblUserMessage = new JLabel("【聊天信息】");lblSendMessage = new JLabel("聊天內(nèi)容:");lblChatUser = new JLabel("你對:");lblUserTotal = new JLabel("在線人數(shù):");lblCount = new JLabel("0");lstUserList = new java.awt.List();txtMessage = new JTextField(170);cmbUser =

44、new JComboBox(list);/ chenmincmbUser.addItemListener(new ItemListener() public void itemStateChanged(ItemEvent arg0) freshHead(););chPrivateChat = new JCheckBox("私聊");taUserMessage = new TextArea("", 300, 200,TextArea.SCROLLBARS_VERTICAL_ONLY);/ 只能向下滾動/ taUserMessage.setText(&quo

45、t;aaaaaa漢字aaaa");taUserMessage.setForeground(new Color(0, 0, 0);taUserMessage.setEditable(false); / 不可寫入/ /監(jiān)聽按鈕響應(yīng)public void actionPerformed(ActionEvent ae) Object source = (Object) ae.getSource();if (source.equals(btnTimer) new Clock();if (source.equals(btnCls) clearMessage();if (source.equals

46、(btnExit) exit();if (source.equals(btnSend) sendMessage();if (source.equals(btnSave) saveMessage();if (source.equals(lstUserList) / 雙擊列表框 changeUser(); / actionPerformed()結(jié)束, 監(jiān)聽窗口關(guān)閉響應(yīng)class Windowclose extends WindowAdapter public void windowClosing(WindowEvent e) exit();/ "清屏"按鈕public void

47、 clearMessage() taUserMessage.setText("");/ "退出"按鈕public void exit() Exit exit = new Exit();exit.exitname = strLoginName;/ 發(fā)送退出信息try Socket toServer = new Socket(strServerIp, 8888);/ 向服務(wù)器發(fā)送信息ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream();outObj.writ

48、eObject(exit);outObj.close();toServer.close();frmChat.dispose();/ this.destroy(); catch (Exception e) / exit()結(jié)束 ,"發(fā)送"按鈕public void sendMessage() Chat chatobj = new Chat();chatobj.chatUser = strLoginName;chatobj.chatMessage = txtMessage.getText();chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem();chatobj.whisper = chPrivateChat.isSelected() ? true : false;chatobj.emote = emote.getSelectedItem().toString();/ 向服務(wù)器發(fā)送信息try Socket toServer = new Socket(strServerIp, 8888);ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream();outObj.writeO

溫馨提示

  • 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

提交評論