第一篇:JAVA課程設計之簡單聊天室
課程設計報告
課程名稱 課程代碼 題
目 年級/專業/班 學生姓名 學
號 指導老師 開題時間 完成時間 Java程序設計
簡單聊天室
孟青 09308910203
I
: : : : : : : : :
目
錄
摘要..............................................................................................................................................................I 1 引言...........................................................................................................................................................1 2 設計任務與目的.......................................................................................................................................1 3 需求分析...................................................................................................................................................1 3.1 系統用例圖............................................................................................................................1 3.2 主要用例分析........................................................................................................................2 4 系統設計.................................................................................................................................................3 4.1 總體設計........................................................................................................................................3 4.1.1 系統類圖.............................................................................................................................3 4.1.2 主要時序圖.........................................................................................................................6 4.2 詳細設計........................................................................................................................................8 4.2.1 ChatServer類......................................................................................................................9 4.2.2 ServerListen類..................................................................................................................10 4.2.3 ServerReceive類...............................................................................................................10 4.2.4 PortConf類.......................................................................................................................11 4.2.5 Help類..............................................................................................................................11 4.2.6 UserLinkList類.................................................................................................................11 4.2.7 Node類.............................................................................................................................12 4.2.8 ChatClient類.....................................................................................................................13 4.2.9 ConnectConf類.................................................................................................................15 4.2.10 UserConf類....................................................................................................................15 4.2.11 Help類............................................................................................................................16 4.2.12 ClientReceive類.............................................................................................................16 5 系統實現.................................................................................................................................................16 5.1 系統主要用例的實現..................................................................................................................16 5.1.1 聊天室服務端用例運行效果...........................................................................................17 5.1.2 聊天室客戶端用例運行效果...........................................................................................18 5.2 系統發布與運行..........................................................................................................................18 5.2.1 系統打包...........................................................................................................................18 5.2.2 系統發布與運行...............................................................................................................18 6 結束語.....................................................................................................................................................19 參考文獻.......................................................................................................................................................19 致謝...............................................................................................................................................................19 附錄A:系統源程序...................................................................................................................................20
1、ChatServer類..........................................................................................................................20
2、ServerListen類.......................................................................................................................31
3、ServerReceive類.....................................................................................................................32
4、UserLinkList類.......................................................................................................................36
5、Node類...................................................................................................................................39
I
6、PortConf類.............................................................................................................................40
7、Help類....................................................................................................................................42
8、ChatClient類...........................................................................................................................44
9、ClientReceive類.....................................................................................................................56
10、ConnectConf類.....................................................................................................................58
11、UserConf類...........................................................................................................................61
12、Help類..................................................................................................................................63 附錄B:編碼規范.......................................................................................................................................66
II
摘要
本課程設計我們通過聊天室的代碼實現,體會到將理論知識與具體實現相結合,鞏固Java相關方法。聊天室共分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發來的消息,客戶端需登陸到服務器才可以實現正常的聊天功能。本聊天系統以聊天交流為主,為廣大用戶提供一個借助網絡進行人際交往的平臺,也是網絡與現實最貼近的實用型網站。
關鍵詞:(3-5個,每個之間用分號隔開)聊天室;多線程;C/S模式
Abstract
The course design our chat room through the code, understand the theoretical knowledge and practical realization of the combination, the consolidation of java-related methods.Chat client and the server is divided into two parts, the client, server-side program is mainly responsible for listening client sent the news to be landing the client to the server will be realized only if the normal chat.The chat system to exchange-based chat, in order to provide customers with a network platform for interpersonal communication, but also network with the reality of the practical is the closest site.Key words: Chat rooms, multi-threaded, C / S mode I
簡單聊天室 引言
隨著互聯網逐步普及,人們的生活和工作也越來越離不開信息網絡的支持,而聊天室是人們最常見,最直接的網上交流的方式。本聊天系統以聊天交流為主,為廣大用戶提供一個借助網絡進行人際交往的平臺,也是網絡與現實最貼近的實用型網站。本文所介紹的網絡聊天系統是基于開放的JAVA應用程序開發設計的,其主要特性是能動態、實時的完成信息的傳遞,且具有高效的交互性,更有效的處理客戶請求,且具有脫離數據庫技術方法,易于維護和更新的特點。設計任務與目的
本聊天室程序基于C/S模式,聊天室共分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發來的消息,客戶端需登陸到服務器才可以實現正常的聊天功能。
通過本項目的設計實踐,力求熟練掌握GUI程序設計、多線程技術、基于TCP的Socket通信編程。需求分析
本系統所要實現的主要功能是為廣大用戶提供一個借助網絡進行人際交往的平臺。因為服務端采用多線程,所以性能有很大提升。因為服務端和客戶端之間采用TCP協議進行網絡通信,建立的是可靠的、端到端的網絡連接,所以可靠性和安全性都很好。
3.1 系統用例圖
圖3-1 系統用例圖
3.2 主要用例分析 服務器端的主要功能如下:
1,在特定端口上進行偵聽,等待客戶端連接
2,用戶可以配置服務端的偵聽端口,默認端口為8888.3,向已經連接到服務端的用戶發送系統消息。4,統計在線人數
5,當停止服務時,斷開所有的用戶連接??蛻舳说闹饕δ苋缦拢?/p>
1,連接到已經開啟的聊天服務的服務端。
2,用戶可以配置要連接服務器端的IP地址和端口號。3,用戶可以配置連接后顯示的用戶名。
4,當服務器端開啟的時候,用戶可以隨時登錄和注銷。5,用戶可以向所有人或者某一個人發送消息。
系統設計 4.1 總體設計
4.1.1 系統類圖
圖4-1-1 服務端系統類圖
圖4-1-2 客戶端系統類圖
4.1.2 主要時序圖
圖4-2-1 服務端主要時序類圖
圖4-2-2 客戶端主要時序類圖
4.2 詳細設計
聊天室服務器端的設計
聊天室服務端主要包括7個類,放在server包中:
4.2.1 ChatServer類
圖4-3 ChatServer類圖
ChatServer.java 包含名為ChatServer的public類,其主要功能為定義服務器端的界面,添加時間
監聽與時間處理。調用ServerListen類來實現服務端用戶上線與下線的監聽,調用ServerListen來實現服務器端的消息收發。
4.2.2 ServerListen類
圖4-4 ServerListen類圖
ServerListen.java 該類實現服務器用戶上線與下線的監聽。該類對用戶上線下線的監聽是通過調用用戶鏈表類(UserLinkList)來實現的。當用戶上線與下線情況發生變化時,該類會對主類的界面進行相應的修改。
4.2.3 ServerReceive類
圖4-5 ServerReceive類圖
ServerReceive.java 該類是實現服務器消息收發的類,該類分別定義了向某用戶及所有人發送消息的方法,發送的消息會顯示在主界面類的街面上。
4.2.4 PortConf類
圖4-6 PortConf類圖
PortConf.java
該類繼承自Jdialog,是用戶對服務器端監聽端口進行修改配置的類。
4.2.5 Help類
圖4-7 Help類圖
Help.java
服務端程序幫助類。
4.2.6 UserLinkList類
圖4-8 UserLinkList類圖
UserLinkList.java
用戶鏈表節點的具體實現類。該類通過構造函數構造用戶鏈表,定義了添加用戶、刪除用戶、返回用戶數、根據用戶名查找用戶、根據索引查找用戶這5個方法。
4.2.7 Node類
圖4-9 Node類圖
Node.java 用戶鏈表的節點類,定義了鏈表中的用戶。該類與前面所講的鏈表節點Node類的功能相當。聊天室客戶端設計
聊天室客戶端主要包括5個類,放在client包中:
4.2.8 ChatClient類
圖4-10 ChatClient類圖
ChatClient.java 包含名為ChatClient的public類,其主要功能為定義客戶端的界面,添加時間監聽與事件處理。該類定義了Connect()與DisConnect()方法實現與客戶端的連接與斷開連接。當登陸到指定的服務器時,調用ClientReceive類實現消息收發,同時該類還定義了SendMessaga()方法來其他用戶發送帶有表情的消息或悄悄話。
4.2.9 ConnectConf類
圖4-11 ConnectConf類圖
ConnectConf.java 該類繼承自Jdialog,是用戶對所有要連接的服務器IP及監聽端口進行修改配置的類。
4.2.10 UserConf類
圖4-12 UserConf類圖
UserConf.java
該類繼承自Jdialog,是用戶對鏈接到服務器時所顯示的用戶名進行修改配置的類。
4.2.11 Help類
圖4-13 Help類圖
Help.java 客戶端程序的幫助類。
4.2.12 ClientReceive類
圖4-14 ClientReceive類圖
ClientReceive.java 該類是實現服務器端與客戶端消息收發的類。系統實現
5.1 系統主要用例的實現
5.1.1 聊天室服務端用例運行效果
圖5-1 聊天室服務端用例運行效果圖
5.1.2 聊天室客戶端用例運行效果
圖5-2 聊天室客戶端用例運行效果圖
5.2 系統發布與運行
5.2.1 系統打包
使用MyEclipse自帶的打包工具分別將server包和client包中的.class文件打成兩個Jar包:ChatServer.jar和CharClient.jar。
5.2.2 系統發布與運行
將server包和client包中的.class文件打成兩個Jar包,就可以發布系統了。直接分別雙擊兩個Jar包(ChatServer.jar和CharClient.jar),就可以運行服務端和客戶端了。
結束語
Java面向對象程序設計是一門應用廣泛并且實用性極強的高級程序設計語言。通過本次課程設計,我們對面向對象的基本思想有了進一步的理解,對項目的各個階段的任務也有了一定的了解。設計開始階段必須明確設計的目的與需求分析,總體設計要全面分析聊天室系統的架構。通過這次設計,使我們認識到體系的架構是最重要的,只有準確的系統設計、很好的定義各個模塊及模塊之間的關系,才能在編碼階段更輕松的的實現。
通過這次課程設計,對我們的邏輯思維能力是一個很大的鍛煉,它不僅加強了我們的系統思考問題的能力,而且還改變了我們以前不好的編程習慣,雖然花費了不少的時間,但是我們學到了豐富的知識。
另外,此次課程設計也提高了我們的團對合作精神,讓我們明白不是不能一個人能單獨完成,而是要集思廣益,結合更多的人的創意思維。讓我們大家深刻的體會到理論與實際相結合的重要性與微妙之處。對于不同的想法我們都會集中討論并對好的意見加以借鑒,在這個討論的過程中,還更正了不少我們各自自身對于某個知識點的誤區。
這次程序設計也是一個毅力的考驗過程。有時候往往只是一個小小的錯誤,卻要花出幾小時甚至是一兩天的時間才可能發現它。所以在這個過程不能過于急躁,要很有耐心將程序反復調試,參考文獻
[1] 張廣彬,孟紅蕊,張永寶.Java課程設計案例精編[M].北京:清華大學出版社,2007,1.[2] 黃曉東.Java課程設計案例精編[M].北京:中國水利水電出版社,2004,5.[3] 求是科技.Java信息管理系統開發實例導航[M].北京:人民郵電出版社,2005,4.[4] 求是科技.Java數據庫系統開發實例導航[M].北京:人民郵電出版社,2004,9.[5]廖衛東Java程序設計實用指南[M].北京:機械工業出版社,2002.1[3] [6]李衛華,傅曉東.Java語言基礎及其應用[M]北京:中國水利水電出版社,1996[5]
致謝
本次課程由上海杰普公司三為指導老師以及我們任課老師郭老師精心輔導,讓我們大家深刻的體會到理論與實際相結合的重要性與微妙之處。使我們對java有了更深刻的認識,產生濃厚的學習興趣。我們由衷對他們表示感謝。
附錄A:系統源程序
1、ChatServer類
功能:為定義服務器端的界面,添加時間監聽與時間處理。調用ServerListen類來實現服務端用戶上線與下線的監聽,調用ServerListen來實現服務器端的消息收發。代碼:
package server;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.net.*;/* * 聊天服務端的主框架類 */ public class ChatServer extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;
public static int port = 8888;//服務端的偵聽端口
ServerSocket serverSocket;//服務端Socket JComboBox combobox;//選擇發送消息的接受者
JTextArea messageShow;//服務端的信息顯示
JScrollPane messageScrollPane;//信息顯示的滾動條
JTextField showStatus;//顯示用戶連接狀態
JLabel sendToLabel,messageLabel;JTextField sysMessage;//服務端消息的發送
JButton sysMessageButton;//服務端消息的發送按鈕
UserLinkList userLinkList;//用戶鏈表
//建立菜單欄
JMenuBar jMenuBar = new JMenuBar();//建立菜單組
JMenu serviceMenu = new JMenu(“服務(V)”);//建立菜單項
JMenuItem portItem = new JMenuItem(“端口設置(P)”);JMenuItem startItem = new JMenuItem(“啟動服務(S)”);
JMenuItem stopItem=new JMenuItem(“停止服務(T)”);JMenuItem exitItem=new JMenuItem(“退出(X)”);
JMenu helpMenu=new JMenu(“幫助(H)”);JMenuItem helpItem=new JMenuItem(“幫助(H)”);//建立工具欄
JToolBar toolBar = new JToolBar();//建立工具欄中的按鈕組件
JButton portSet;//啟動服務端偵聽 JButton startServer;//啟動服務端偵聽 JButton stopServer;//關閉服務端偵聽 JButton exitButton;//退出按鈕
//框架的大小
Dimension faceSize = new Dimension(400, 600);
ServerListen listenThread;JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;/** * 服務端構造函數 */ public ChatServer(){ init();//初始化程序
//添加框架的關閉事件處理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//設置框架的大小
this.setSize(faceSize);//設置運行時窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(“聊天室服務端”);//設置標題
setVisible(true);
//為服務菜單欄設置熱鍵'V'
serviceMenu.setMnemonic('V');
//為端口設置快捷鍵為ctrl+p
portItem.setMnemonic('P');
portItem.setAccelerator(KeyEvent.VK_P,InputEvent.CTRL_MASK));
//為啟動服務快捷鍵為ctrl+s
startItem.setMnemonic('S');
startItem.setAccelerator(KeyEvent.VK_S,InputEvent.CTRL_MASK));
//為端口設置快捷鍵為ctrl+T
stopItem.setMnemonic('T');
stopItem.setAccelerator(KeyEvent.VK_T,InputEvent.CTRL_MASK));
//為退出設置快捷鍵為ctrl+x
exitItem.setMnemonic('X');
exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));
//為幫助菜單欄設置熱鍵'H'
helpMenu.setMnemonic('H');
//為幫助設置快捷鍵為ctrl+p
helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyEvent.VK_H,InputEvent.CTRL_MASK));
}
/** * 程序初始化函數
*/ public void init(){
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
//添加菜單欄
serviceMenu.add(portItem);serviceMenu.add(startItem);serviceMenu.add(stopItem);serviceMenu.add(exitItem);jMenuBar.add(serviceMenu);helpMenu.add(helpItem);jMenuBar.add(helpMenu);setJMenuBar(jMenuBar);//初始化按鈕
portSet = new JButton(“端口設置”);startServer = new JButton(“啟動服務”);stopServer = new JButton(“停止服務”);exitButton = new JButton(“退出”);//將按鈕添加到工具欄 toolBar.add(portSet);toolBar.addSeparator();//添加分隔欄 toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();//添加分隔欄 toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);//初始時,令停止服務按鈕不可用 stopServer.setEnabled(false);stopItem.setEnabled(false);//為菜單欄添加事件監聽
portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);
//添加按鈕的事件偵聽
portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);
combobox = new JComboBox();combobox.insertItemAt(“所有人”,0);combobox.setSelectedIndex(0);23
messageShow = new JTextArea();messageShow.setEditable(false);//添加滾動條
messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400));messageScrollPane.revalidate();
showStatus = new JTextField(35);showStatus.setEditable(false);
sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setText(“發送”);//添加系統消息的事件偵聽
sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(“發送至:”);messageLabel = new JLabel(“發送消息:”);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel(“ ”);girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;24
girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.gridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);
//關閉程序時的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
stopService();25
}
System.exit(0);
} });/** * 事件處理 */ public void actionPerformed(ActionEvent e){ Object obj = e.getSource();if(obj == startServer || obj == startItem){ //啟動服務端
startService();} else if(obj == stopServer || obj == stopItem){ //停止服務端
int j=JOptionPane.showConfirmDialog(this,“真的停止服務嗎?”,“停止服務”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
} } else if(obj == portSet || obj == portItem){ //端口設置
//調出端口設置的對話框
PortConf portConf = new PortConf(this);
portConf.setVisible(true);} else if(obj == exitButton || obj == exitItem){ //退出程序
int j=JOptionPane.showConfirmDialog(this,“真的要退出嗎?”,“退出”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
System.exit(0);
} } else if(obj == helpItem){ //菜單欄中的幫助
//調出幫助對話框
Help helpDialog = new Help(this);
helpDialog.setVisible(true);} else if(obj == sysMessage || obj == sysMessageButton){ //發送系統消息
sendSystemMessage();} } /** * 啟動服務端 */ public void startService(){ try{
serverSocket = new ServerSocket(port,10);
messageShow.append(“服務端已經啟動,在”+port+“端口偵聽...n”);
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer.setEnabled(true);
stopItem.setEnabled(true);
sysMessage.setEnabled(true);} catch(Exception e){
//System.out.println(e);} userLinkList = new UserLinkList();
listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();} /** * 關閉服務端 */ public void stopService(){ try{
//向所有人發送服務器關閉的消息
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();
int count = userLinkList.getCount();
int i =0;27
while(i < count){ Node node = userLinkList.findUser(i);
node.input.close();node.output.close();node.socket.close();
i ++;} stopServer.setEnabled(false);stopItem.setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append(“服務端已經關閉n”);
combobox.removeAllItems();
combobox.addItem(“所有人”);} catch(Exception e){
//System.out.println(e);} } /** * 向所有人發送服務器關閉的消息 */ public void sendStopToAll(){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“服務關閉”);28
node.output.flush();
}
catch(Exception e){
//System.out.println(“$$$”+e);
}
i++;} } /** * 向所有人發送消息 */ public void sendMsgToAll(String msg){ int count = userLinkList.getCount();//用戶總數
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“系統信息”);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(“@@@”+e);
}
i++;} sysMessage.setText(“");} /** * 向客戶端用戶發送消息 */ public void sendSystemMessage(){ 29
} String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText()+ ”n“;
messageShow.append(message);
//向所有人發送消息
if(toSomebody.equalsIgnoreCase(”所有人“)){ sendMsgToAll(message);} else{ //向某個用戶發送消息
Node node = userLinkList.findUser(toSomebody);
try{
node.output.writeObject(”系統信息“);
node.output.flush();
node.output.writeObject(message);
node.output.flush();} catch(Exception e){
//System.out.println(”!!“+e);} sysMessage.setText(”“);//將發送消息欄的消息清空 } public static void main(String[] args){ try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch(ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(InstantiationException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(IllegalAccessException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(UnsupportedLookAndFeelException e){
// TODO Auto-generated catch block
e.printStackTrace();} new ChatServer();} 30
}
2、ServerListen類
功能:實現服務器用戶上線與下線的監聽。該類對用戶上線下線的監聽是通過調用用戶鏈表類(UserLinkList)來實現的。當用戶上線與下線情況發生變化時,該類會對主類的界面進行相應的修改。
代碼:
package server;
import javax.swing.*;import java.io.*;import java.net.*;/* * 服務端的偵聽類 */ public class ServerListen extends Thread { ServerSocket server;
JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;//用戶鏈表
Node client;ServerReceive recvThread;
public boolean isStop;
/* * 聊天服務端的用戶上線于下線偵聽類
*/ public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textfield,UserLinkList userLinkList){
this.server = server;
this.combobox = combobox;
this.textarea = textarea;
this.textfield = textfield;
this.userLinkList = userLinkList;
isStop = false;}
public void run(){
while(!isStop &&!server.isClosed()){
try{
client = new Node();
client.socket = server.accept();
client.output = new ObjectOutputStream(client.socket.getOutputStream());
client.output.flush();
client.input = new ObjectInputStream(client.socket.getInputStream());
client.username =(String)client.input.readObject();
//顯示提示信息
combobox.addItem(client.username);
userLinkList.addUser(client);
textarea.append(”用戶 “ + client.username + ” 上線“ + ”n“);
textfield.setText(”在線用戶“ + userLinkList.getCount()+ ”人n“);
recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);
recvThread.start();
}
catch(Exception e){
}
} } }
3、ServerReceive類
功能:實現服務器消息收發的類,該類分別定義了向某用戶及所有人發送消息的方法,發送的消息會顯示在主界面類的街面上。
代碼:
package server;
import javax.swing.*;/* * 服務器收發消息的類 */ public class ServerReceive extends Thread { JTextArea textarea;JTextField textfield;JComboBox combobox;
Node client;UserLinkList userLinkList;//用戶鏈表
public boolean isStop;
public ServerReceive(JTextArea textarea,JTextField textfield, JComboBox combobox,Node client,UserLinkList userLinkList){ this.textarea = textarea;this.textfield = textfield;this.client = client;this.userLinkList = userLinkList;this.combobox = combobox;
isStop = false;}
public void run(){ //向所有人發送用戶的列表
sendUserList();
while(!isStop &&!client.socket.isClosed()){
try{
String type =(String)client.input.readObject();
if(type.equalsIgnoreCase(”聊天信息“)){
String toSomebody =(String)client.input.readObject();
String status =(String)client.input.readObject();
String action =(String)client.input.readObject();
String message =(String)client.input.readObject();
String msg = client.username
+” “+ action
+ ”對 “
+ toSomebody
+ ” 說 : “
+ message
+ ”n“;
if(status.equalsIgnoreCase(”悄悄話“)){
msg = ” [悄悄話] “ + msg;
}
textarea.append(msg);
if(toSomebody.equalsIgnoreCase(”所有人“)){ 33
sendToAll(msg);//向所有人發送消息
} else{
try{
client.output.writeObject(”聊天信息“);
client.output.flush();
client.output.writeObject(msg);
client.output.flush();
}
catch(Exception e){
//System.out.println(”###“+e);
}
Node node = userLinkList.findUser(toSomebody);
if(node!= null){
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
} } } else if(type.equalsIgnoreCase(”用戶下線“)){ Node node = userLinkList.findUser(client.username);userLinkList.delUser(node);
String msg = ”用戶 “ + client.username + ” 下線n“;int count = userLinkList.getCount();
combobox.removeAllItems();combobox.addItem(”所有人“);int i = 0;while(i < count){ node = userLinkList.findUser(i);if(node == null){
i ++;
continue;} combobox.addItem(node.username);i++;} combobox.setSelectedIndex(0);34
textarea.append(msg);
textfield.setText(”在線用戶“ + userLinkList.getCount()+ ”人n“);
sendToAll(msg);//向所有人發送消息
sendUserList();//重新發送用戶列表,刷新
break;
}
}
catch(Exception e){
//System.out.println(e);
} } } /* * 向所有人發送消息 */ public void sendToAll(String msg){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(e);
}
i++;} }
} /* * 向所有人發送用戶的列表 */ public void sendUserList(){ String userlist = ”“;int count = userLinkList.getCount();
} int i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
userlist += node.username;userlist += 'n';i++;}
i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
try{
node.output.writeObject(”用戶列表“);
node.output.flush();
node.output.writeObject(userlist);
node.output.flush();} catch(Exception e){
//System.out.println(e);} i++;}
4、UserLinkList類
功能:用戶鏈表節點的具體實現類。該類通過構造函數構造用戶鏈表,定義了添加
用戶、刪除用戶、返回用戶數、根據用戶名查找用戶、根據索引查找用戶這5個方法。
代碼:
package server;/** * 用戶鏈表 */ public class UserLinkList { Node root;Node pointer;int count;
/** * 構造用戶鏈表
*/ public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;}
/** * 添加用戶
*/ public void addUser(Node n){
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
}
pointer.next = n;
n.next = null;
count++;
}
/** * 刪除用戶
*/ public void delUser(Node n){
pointer = root;
while(pointer.next!= null){
if(pointer.next == n){
pointer.next = n.next;
count--;
break;
}
pointer = pointer.next;} } /** * 返回用戶數 */ public int getCount(){ return count;} /** * 根據用戶名查找用戶 */ public Node findUser(String username){ if(count == 0)return null;
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
if(pointer.username.equalsIgnoreCase(username)){
return pointer;
} }
return null;} /** * 根據索引查找用戶 */ public Node findUser(int index){ if(count == 0){
return null;38
}
} }
if(index < 0){ return null;}
pointer = root;
int i = 0;while(i < index + 1){ if(pointer.next!= null){
pointer = pointer.next;} else{
return null;}
i++;}
return pointer;
5、Node類
功能:用戶鏈表的節點類,定義了鏈表中的用戶。該類與前面所講的鏈表節點Node類的功能相當。
代碼:
package server;
import java.net.*;import java.io.*;/** * 用戶鏈表的結點類 */ public class Node { String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;
Node next = null;39
}
6、PortConf類
功能:該類繼承自Jdialog,是用戶對服務器端監聽端口進行修改配置的類。代碼:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * 生成端口設置對話框的類 */ public class PortConf extends JDialog { /** * */ private static final long serialVersionUID = 1L;JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGINFO=new JLabel(” 默認端口號為:8888“);
JPanel panelSave = new JPanel();JLabel message = new JLabel();
public static JTextField portNumber;
public PortConf(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//設置運行位置,使對話框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width600)/ 2 + 150);
this.setResizable(false);40
}
private void jbInit()throws Exception {
this.setSize(new Dimension(300, 120));
this.setTitle(”端口設置“);
message.setText(”請輸入偵聽的端口號:“);
portNumber = new JTextField(10);
portNumber.setText(”“+ChatServer.port);
save.setText(”保存“);
cancel.setText(”取消“);
panelPort.setLayout(new FlowLayout());
panelPort.add(message);
panelPort.add(portNumber);
panelSave.add(new Label(” “));
panelSave.add(save);
panelSave.add(cancel);
panelSave.add(new Label(” “));
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(panelPort, BorderLayout.NORTH);
contentPane.add(DLGINFO, BorderLayout.CENTER);
contentPane.add(panelSave, BorderLayout.SOUTH);
//保存按鈕的事件處理
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent a){
int savePort;
try{
savePort=Integer.parseInt(PortConf.portNumber.getText());
if(savePort<1 || savePort>65535){
PortConf.DLGINFO.setText(” 偵聽端口必須是0-65535之間的整數!“);
PortConf.portNumber.setText(”“);
return;
}
ChatServer.port = savePort;
dispose();
} 41
catch(NumberFormatException e){
PortConf.DLGINFO.setText(” 錯誤的端口號,端口號請填寫整數!“);
PortConf.portNumber.setText(”“);
return;
}
}
});
//關閉對話框時的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
DLGINFO.setText(”
為:8888“);
}
});
//取消按鈕的事件處理
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
DLGINFO.setText(”
為:8888“);
dispose();
}
});} }
7、Help類
功能:服務端程序幫助類。代碼:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** 42
默認端口號默認端口號
* 生成設置對話框的類 */ public class Help extends JDialog {
/** * */ private static final long serialVersionUID = 1L;JPanel titlePanel = new JPanel();JPanel contentPanel = new JPanel();JPanel closePanel = new JPanel();
JButton close = new JButton();JLabel title = new JLabel(”聊天室服務端幫助“);JTextArea help = new JTextArea();
Color bg = new Color(255,255,255);
public Help(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//設置運行位置,使對話框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width320)/ 2);
this.setResizable(false);}
private void jbInit()throws Exception {
this.setSize(new Dimension(400, 200));
this.setTitle(”幫助“);
titlePanel.setBackground(bg);;
contentPanel.setBackground(bg);
closePanel.setBackground(bg);
help.setText(”
1、設置服務端的偵聽端口(默認端口為8888)。n“+
”
2、點擊 啟動服務 按鈕便可在指定的端口啟動服務。n“+
”
3、選擇需要接受消息的用戶,在消息欄中寫入消息,之后便可發送消息。n“+ 43
}
} ”
4、信息狀態欄中顯示服務器當前的啟動與停止狀態、“+ ”用戶發送的消息和n 服務器端發送的系統消息。“);help.setEditable(false);titlePanel.add(new Label(” “));titlePanel.add(title);titlePanel.add(new Label(” “));contentPanel.add(help);closePanel.add(new Label(” “));closePanel.add(close);closePanel.add(new Label(” “));Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout());contentPane.add(titlePanel, BorderLayout.NORTH);contentPane.add(contentPanel, BorderLayout.CENTER);contentPane.add(closePanel, BorderLayout.SOUTH);close.setText(”關閉“);//事件處理
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
} });
8、ChatClient類
功能:定義客戶端的界面,添加時間監聽與事件處理。該類定義了Connect()與DisConnect()方法實現與客戶端的連接與斷開連接。當登陸到指定的服務器時,調用ClientReceive類實現消息收發,同時該類還定義了SendMessaga()方法來其他用戶發送帶有表情的消息或悄悄話。
代碼:
package client;
import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.io.*;import java.net.*;/* * 聊天客戶端的主框架類 */ public class ChatClient extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;String ip = ”127.0.0.1“;//連接到服務端的ip地址
int port = 8888;//連接到服務端的端口號
String userName = ”匆匆過客“;//用戶名
int type = 0;//0表示未連接,1表示已連接
JComboBox combobox;//選擇發送消息的接受者
JTextArea messageShow;//客戶端的信息顯示
JScrollPane messageScrollPane;//信息顯示的滾動條
JLabel express,sendToLabel,messageLabel;
JTextField clientMessage;//客戶端消息的發送
JCheckBox checkbox;//悄悄話
JComboBox actionlist;//表情選擇
JButton clientMessageButton;//發送消息
JTextField showStatus;//顯示用戶連接狀態
Socket socket;ObjectOutputStream output;//網絡套接字輸出流
ObjectInputStream input;//網絡套接字輸入流
ClientReceive recvThread;
//建立菜單欄
JMenuBar jMenuBar = new JMenuBar();//建立菜單組
JMenu operateMenu = new JMenu(”操作(O)“);//建立菜單項
JMenuItem loginItem = new JMenuItem(”用戶登錄(I)“);JMenuItem logoffItem = new JMenuItem(”用戶注銷(L)“);JMenuItem exitItem=new JMenuItem(”退出(X)“);
JMenu conMenu=new JMenu(”設置(C)“);JMenuItem userItem=new JMenuItem(”用戶設置(U)“);JMenuItem connectItem=new JMenuItem(”連接設置(C)“);
JMenu helpMenu=new JMenu(”幫助(H)“);JMenuItem helpItem=new JMenuItem(”幫助(H)“);//建立工具欄
JToolBar toolBar = new JToolBar();//建立工具欄中的按鈕組件
JButton loginButton;//用戶登錄 JButton logoffButton;//用戶注銷 JButton userButton;//用戶信息的設置 JButton connectButton;//連接設置 JButton exitButton;//退出按鈕
//框架的大小
Dimension faceSize = new Dimension(400, 600);JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;
public ChatClient(){ init();//初始化程序
//添加框架的關閉事件處理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//設置框架的大小
this.setSize(faceSize);//設置運行時窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(”聊天室客戶端");//設置標題 setVisible(true);//為操作菜單欄設置熱鍵'V' operateMenu.setMnemonic('O');46
第二篇:Java聊天室課程設計報告
UML課程設計
題 目
網絡聊天程序開發設計與實現
學 號:201515614376 姓 名: 衛國輝 指導教師:
完成時間:2017年 12月
0
目錄
1.摘要.............................................................................................................................2 2.緒論.............................................................................................................................0 2.開發環境.....................................................................................................................0 3.需求分析....................................................................................................................1
3.1程序簡介...........................................................................................................1 3.2程序功能...........................................................................................................1 4.系統設計.....................................................................................................................2
4.1概要設計...........................................................................................................2 4.2詳細設計............................................................................................................2 5.測試.............................................................................................................................7 6.結論.............................................................................................................................9 參考文獻......................................................................................................................10
摘要
本次訓練主要是考查了對JAVA程序設計的綜合運用,設計一個Socket通信的聊天程序,用戶可以通過程序進行聊天通信,但不支持用戶自定義表情及圖片的發送。
本程序設計也用到了一些相關的標準Java的類,給程序設計帶來了許多的方便,但用那些要切記加相應的類的包,還有一些構造方法和個別接口方法。
本程序可以實現用戶之間的一些簡單的交互,雖然功能較少,但是我想通過這次程序設計來熟悉并且學習更多關于JAVA編程的東西,來便于以后可以使用。
關鍵詞:java聊天
1.緒論
對于一個選擇網絡編程的人來說,必須要有足夠的細心和耐心,因為編程一般來說是很枯燥的乏味的,而且程序會越來越復雜,它所用到的符號、標記很多,所以不能出點小錯誤的。還有,我們不能只是看程序,要學會把自己學的自己拿去實踐,自己去編一些程序,培養自己的動手能力,掌握一些編程技巧,熟練運用自己學到的理論知識,這樣在以后才能開發出屬于自己的東西。
如今,隨著科學技術的發展,計算機已成為了我們生活中必不可少的設備了,而掌握計算機知識和運用,又成了我們每一個人的目標了?,F在IT行業的飛速發展,無不應正了以前、現在、將來計算機行業都是科學發展的主導行業。而這些基本上都建立在程序上的,所以程序員對計算機行業來說,可想而知有多么的重要了,他們所付出的每一滴汗水都將推動這個行業的發展。
現在我就用JAVA語言編寫一個簡單的程序——Java聊天程序。將所學的基本知識用到其中去,這里包括了構造方法,創建圖形界面,引用類等等。這不僅能鍛煉我的實踐能力,同時也進一步復習和鞏固了我所學的理論知識。對以前沒有學好的還有督促和促進作用。而且,根據需要,還可以了解一些課外的知識。增加自己的知識面。
2.開發環境
在開發此聊天程序時,該項目所使用的軟件開發環境如下:
操作系統:Windows 7
開發工具:eclipse3.2及其VE插件
0
Eclipse簡介
Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構建開發環境。幸運的是,Eclipse 附帶了一個標準的插件集,包括 Java 開發工具。
Eclipse是著名的跨平臺的自由集成開發環境(IDE)。最初主要用來Java語 言開發,但是目前亦有人通過插件使其作為其他計算機語言比如C++和Python的開發工具。Eclipse的本身只是一個框架平臺,但是眾多插件的支持 使得Eclipse擁有其他功能相對固定的IDE軟件很難具有的靈活性。許多軟件開發商以Eclipse為框架開發自己的IDE。
Eclipse 最初由OTI和IBM兩家公司的IDE產品開發組創建,起始于1999年4月。IBM提供了最初的Eclipse代碼基礎,包括Platform、JDT 和PDE。目前由IBM牽頭,圍繞著Eclipse項目已經發展成為了一個龐大的Eclipse聯盟,有150多家軟件公司參與到Eclipse項目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一個開發源碼項目,它其實是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其開放源碼,任何人都可以免費得到,并可以在此基礎上開發各自的插件,因此越來越受人們關注。近期還有包括Oracle在內的許多 大公司也紛紛加入了該項目,并宣稱Eclipse將來能成為可進行任何語言開發的IDE集大成者,使用者只需下載各種語言的插件即可。
3.需求分析
3.1程序簡介
隨著網絡技術的發展,人們越來越多的依賴于網絡,為了方便人們的生活,網絡聊天自然成為了熱點,各種工具到處都是。此程序便是模仿其他聊天工具設計的,當然只是實現了比較少的功能,可以進行基本的聊天。
3.2 程序功能
該程序功能:該程序分為2個部分,一個是客戶端程序,一個是服務端程序,需要先開啟服務器,再開啟客戶端才能使用,客戶端程序提供了相互通信、清空聊天記錄的等功能,服務端則用于接受客戶端的請求,記錄客戶端的信息等。
4.系統設計 4.1概要設計
此聊天程序共有2個部分,客戶端和服務器??蛻舳酥邪?個Java文件,為主類client.java,;服務器端只有一個主類Server.java。
程序流程圖:
服務器程序結構
客戶端程序結構
4.2詳細設計
(1)服務器程序實現
本程序采用的是Socket通信來設計的,建立一個主類Server.java,其中主類中還包括服務器線程 然后在其構造方法加載程序所需的組件,構造方法如下:
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()+ “與服務器連接成功!”);
writer.flush();
// 反饋當前在線用戶信息
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(){// 不斷接收客戶端的消息,進行處理。
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();
// 向所有在線用戶發送該用戶的下線命令
for(int i = clients.size()1;i >= 0;i--){
if(clients.get(i).getUser()== user){
ClientThread temp = clients.get(i);
clients.remove(i);// 刪除此用戶的服務線程
temp.stop();// 停止這條服務線程
return;
}
}
} else {
dispatcherMessage(message);// 轉發消息
}
} catch(IOException e){
e.printStackTrace();
}
}
} 其運行截圖如下圖所示:
(2)、客戶端主程序
本程序使用了默認的卡片布局方式,對窗口的大小進行設置,讓聊天窗口能
夠居中顯示,以及登錄主窗口類。
實現窗口布局功能和類的調用功能的主要代碼如下:
* 連接服務器
*
* @param port
* @param hostIp
* @param name
*/ public boolean connectServer(int port, String hostIp, String name){
// 連接服務器
try {
socket = new Socket(hostIp, port);// 根據端口號和服務器ip建立連接
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
// 發送客戶端用戶基本信息(用戶名和ip地址)
sendMessage(name + ”@“ + socket.getLocalAddress().toString());
// 開啟接收消息的線程
messageThread = new MessageThread(reader, textArea);
messageThread.start();
isConnected = true;// 已經連接上了
return true;
} catch(Exception e){
textArea.append(”與端口號為:“ + port + ” IP地址為:“ + hostIp
+ ” 的服務器連接失敗!“ + ”rn“);
isConnected = false;// 未連接上
return false;
} }
(5)、聊天窗口程序設計
程序提供了發送文字和關閉聊天的的簡單功能。以下是實現程序的主要方
法:
* 發送消息
*
* @param message
*/ public void sendMessage(String message){
writer.println(message);
writer.flush();}
/**
* 客戶端主動關閉連接
*/ @SuppressWarnings(”deprecation“)public synchronized boolean closeConnection(){
try {
sendMessage(”CLOSE");// 發送斷開連接命令給服務器
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;
} } 其運行截圖如下圖所示:
5.測試
程序在編碼過程中,出現了許多的問題,有的是因為程序的完善性不夠好而造成的,有的是因為技術不夠而無法解決。通過不停的調試,修改,多數已發現的問題都已完善,但依然存在少數的問題無法解決。例如,在用戶注冊這個功能中,當用戶的用戶名重復時,服務器會出現用戶名重復的異常,服務器就不會響應。
6.結論
通過這次程序的實訓,我知道了自己在許多地方的不足,雖然書上的程序基本能看懂,但是自己的編程實踐能力實在是欠缺,而且我知道了,Java語言最重要的不僅僅是學好語法,而Java中最重要的還是要理解它的面向對象編程的思想,理解它的面向對象的特征。因為學習任何一門語言最重要的就是理解它的思想,要做到知其然,并且知其所以然。要學會真正的編寫程序,而不僅僅是把語法背的滾瓜爛熟。還要經常寫代碼,做到一邊寫一邊理解,這樣才能真正的實現學習Java語言的目的。
這次實訓也告訴了我,光有書上的知識對我們來說是遠遠不夠的,如果我們要想讓自己在編程上有所突破的話,我們必須拓展自己的知識面,此次程序設計就給我增加了不少的知識,讓我在編程方面學到了許多編程所需要的東西,還有也鍛煉我的耐性,磨礪了我的意志,在錯誤面前反復修改但是從不氣餒。
所以,這次實訓讓我受益匪淺,不管是在知識方面還是做事方面,都交會了我許多。同時還鞏固了以前所學的知識,學到了不少書本上沒有的知識;學到了很多java編程知識,并學會了簡單的使用Eclipse來開發Java程序的一些使用技巧這次課程設計是對我本學期所學的知識的檢驗,由此我發現了不少的問題??梢哉f它給了我一次自我評估的機會。通過設計讓我知道了那些方面我還是有欠缺的,促使我花時間彌補。
臨近考試,時間太緊迫,致使程序實現的功能在方法上也許不是很完美,但我以后會多向老師請教,自己也要加強對Java 的學習。努力進一步提高自己的編程水平。
參考文獻
[1]耿祥義.Java課程設計:清華大學出版社第二版,2008年11月.[2]馬皓.Java語言程序設計:機械工業出版社,2007年3月 [3]孫衛琴.java 面向對象編程.電子工業出版社.2007 [4]劉海軍.Java程序設計.中國鐵道出版社,2006 [5]鄭阿奇,姜乃松,殷紅先.Java實用教程.電子工業出版社,2005 [6]張廣彬、王小寧、高靜, Java課程設計案例精編(第二版)清華大學出版社,2011年
第三篇:java聊天室課程設計報告
課程設計報告
2011 ~ 2012 學年 第 一 學期
學 號 20104053020 姓 名 胡勇昌 院 系 信息工程與技術 專 業 計算機工程系 課 程 名 稱 JAVA程序設計 課程設計名稱 局域網內的多功能聊天室
學 時 學 分 1 指 導 教 師 許爍娜
2011年 12 月 25 日
目錄
課程設計報告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相關技術.......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 術語...............................................................................................................................................4 第2章 需求分析與系統設計................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系統設計.......................................................................................................................................6 2.2.1多用戶在線方案.....................................................................................................................6 2.2.2 系統功能................................................................................................................................6 第3章 系統實施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客戶端窗口...........................................................................................................................8 3.3 內嵌“私聊”窗口.......................................................................................................................9 3.4客服端類繼承客戶端窗口類,并內嵌私聊程序......................................................................10 第4章 測試..........................................................................................................................................15 4.1 測試環境與使用方法.................................................................................................................15 4.2 功能測試.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客戶端窗口..........................................................................................................................16
4.2.3 內嵌“私聊”窗口..........................................................................................................................16
參考文獻................................................................................................................................................16
第1章 引言
1.1 背景
網絡聊天室通常直稱聊天室,是一種人們可以在線交談的網絡論壇,在同一聊天室的人們通過廣播消息進行實時交談。聊天室可以建立在即時通訊軟件(如MSN Messenger、QQ)、P2P軟件、萬維網(如 Halapo,Meebo)等基礎上,萬維網方式更為普通和種類繁多,交談的手段不局限于文本,更包括語音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網人可以實時地廣播和閱讀公開消息。一般情況下,與其它網絡論壇、即時通訊不同的是,聊天室不保存聊天記錄。
1.2 相關技術 1.2.1 JAVA概述
Java是一種可以撰寫跨平臺應用軟件的面向對象的程序設計語言,是由Sun Microsystems公司于1995年5月推出的Java程序設計語言和java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于個人PC、數據中心、游戲控制臺、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發者專業社群。在全球云計算和移動互聯網的產業環境下,Java更具備了顯著優勢和廣闊前景。
1.2.2 Socket Socket是java中需一要編寫較低層次的網絡通信程序(例如Cljent/server應用程序)時提供的一種通訊機制。Socket是兩個程序進行雙向數據傳輸的網絡通信的端點,一般 由一個地址加上一個端口號來標一識。每個服務程序都在一個眾所周知的端口上提供服 務,而想使用服務的客戶端程序則需要連接該端口。通過Socket的數據是原始字節流信 息,通信雙方必須根據約定的協議對數據進行處理與解釋。
Socket通信機制提供了兩種通信.方式:有連接方式(TCP)和無連接方式(UDP數
據報)。有連接方式中,通信雙方在開始時必須進行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的,全雙工的字節流服務。無連接力一式中,通信雙方不存在一個連 接過程,一次網絡I/O以一個數據報形式進行,而每次網絡I /O可以和不同.主機的不 同進程進行。無連接方式開銷小于有連接方式,但是所提供的數據傳輸服務不可靠,不 能保證數據報一定到達目的地”」·。
JAVA的有連接通信采用流式I/O模式。Socket是兩個進程間通信鏈的端點,每個 Sockct有兩個流:一個輸入流和一個輸出流。只要向Sockct的輸出流寫,一個進程就可 以通過網絡連接向其他進程發送數據;同樣,通過讀Sockt的輸入流,就可以讀取傳輸 來的數據。
有連接通信一般要經歷以下四個基本步驟ii
(1)創建Sockct,建立連接;
(2)打開連接到Sockct的輸入/輸出流;
(3)按照一定的一腳議對Socket進行讀/寫操作;
(4)關閉Socket。
第(3)步是程序員用來調用Socket和實現程序功能的關鍵步驟,其他三步在各種 程序中基本相同。
1.2.3 TCP 三次握手
TCP協議通過三個報文段完成連接的建立,這個過程稱為三次握手(three-way handshake),過程如下圖所示。
1.3 術語
暫無
第2章 需求分析與系統設計
2.1 需求分析
從技術發面來看,Java語言的優點一要表現在:簡.單、面向對象、多線程、安全性 等方面。1.簡單性
Java與C++語言灰常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對 必要的功能,如頭文件、頂處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。Java實現了自動的垃圾收集,簡化了內存管理的一作。這使程序一設計更加簡便,同時減少了出錯的可能。2.面向對象
Java提供了簡單的類機制和動態的構架模型。對象中封裝了它的狀態變量和方法,很好地實現了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的一方法,從而既實現了代碼的復用,又提供了一種動態的解決方案。
Java是一種完全面向對象的程序設計語一言,它除了數組、布爾和字符二個基本數據類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創建新類就無法創建程序,Java程序在運行時必須先創建一個類的實例,然后才能提交運行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的 單重繼承,即每個類只能從一個類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實現,一個類可以實現多個界面,利用界面可以得到多重繼承的許多優點而又沒有多重繼承的問題。3.多線程
多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容.易實現網絡上的實時交互操作。
Java程序可以有多個執行線程,如可以讓一個線程進行復雜的計算,而讓另一個線 程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統進行交互。多線程保證了較高的執行效率。4.安全性
Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現,這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。2.2 系統設計 2.2.1多用戶在線方案 2.2.2 系統功能
聊天室程序通常需要完成以下一些基本功能:
(I)登錄聊天室;
(2)啟動服務器;
(3)關閉服務器;
(4)用戶之間的聊天;
(5)退出聊天室。
本系統其體功能需求如下:
(1)聊天室管理員經登錄界面登錄到管理界而,即系統的服務器端。用戶經登錄界而 都進入聊天大廳。
(2)不論是管理員還是用戶都需一要在登錄界面輸入正確的用戶名和密碼后才可以登錄 到各自的界面中去。
(3)系統的兩個主要界面都是為方便管理員和用戶操作的。首先,管理員進入到管理 界而后可以方便的啟動/停止服務器,看到在線用戶的信息和聊人信息、。用戶進入到聊天 大廳中可以聊天,查看服務器狀態。
(4)一個用戶退出聊天室對其他用戶不能產生影響,而服務器斷開與客戶端的連接則所有的用戶都失去與服務器的連接。
(5)用戶的聊天信息錄入,重寫,發送,接收方便,快捷。
(6)服務器狀態,聊天信息和在線用戶人數及時刷新。
(7)聊天室系統運行穩定、安全性高、性能可靠。
第3章 系統實施
3.1聊天室窗口
建立服務端窗口類:窗口程序如下 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(“局域網聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“發送”);Button button1=new Button(“啟動服務”);Button button2=new Button(“發送”);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(“發送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服務器地址”);JLabel label2=new JLabel(“服務器端口”);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 內嵌“私聊”窗口
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);//設置窗口大小和位置; label1=new JLabel(“對方主機”);label2=new JLabel(“本地端口”);label3=new JLabel(“對方端口”);button1=new Button(“連接”);button2=new Button(“發送”);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);//關閉窗口程序同時關myEvent();
3.4客服端類繼承客戶端窗口類,并內嵌私聊程序
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(“[系統消息]:連接成功n”);
}catch(Exception ex){area.append(“[系統消息]:連接失敗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());//服務器自動會返回
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);
//設置窗口大小和位置;
f.setResizable(false);
//讓窗口大小固定;
label1=new JLabel(”對方主機“);
label2=new JLabel(”本地端口“);
label3=new JLabel(”對方端口“);
button1=new Button(”連接“);
button2=new Button(”發送“);
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);//關閉窗口程序同時關閉;
myEvent();
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
try{
DatagramSocket ds=new DatagramSocket();
byte[] buf=”對方已下線“.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(”[系統消息]:發送失敗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(”[系統消息]:連接失敗n“);
}
}
public void UdpRece()throws Exception{
while(true){
DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));
if(index==0){textarea.append(”[系統消息]:連接成功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章 測試
4.1 測試環境與使用方法
測試環境:測試環境:電腦安裝Java JDK 服務器端使用方法:打開服務啟動,點擊“啟動服務”,提示“啟動服務成功”表示正常啟動。否則,先關閉服務端,再重新打開,啟動服務??蛻舳耸褂梅椒ǎ捍蜷_客戶端,輸入“服務器地址”,點擊“連接”,如成功連接系統提示“成功連接”,并收到服務端返回的“歡迎”信息,否則關閉并重新啟動。
私聊功能使用方法:點擊面板上的“私聊”按鈕,輸入對方的IP地址,點擊連接,如連接成功系統會提示“連接成功”。當對方斷開時會收到“對方已下線”提示。如果要同時跟多人私聊,則要改變本地端口值,并告知對方。
4.2 功能測試 4.2.1聊天室窗口
4.2.2 客戶端窗口
4.2.3 內嵌“私聊”窗口
參考文獻
用JAVA程序實現參考文獻的錄入與生成 劉瑋瑋 2009 《福建電腦》
基于Java移動Agent系統的安全參考模型 周屹 2007 《黑龍江工程學院學報》
嵌入式Java虛擬機的性能優化技術 李允 2004 《計算機工程》
第四篇:JAVA聊天室實驗報告
Java聊天室實驗報告
班 級:學 號:姓 名:
****** ******** ***
目錄:
一、實驗目的.......................................................3
二、所需技術.......................................................3
三、需求分析.......................................................3
四、系統設計.......................................................4
1、服務器結構..................................................4
2、客戶端結構..................................................4
五、實現細節.......................................................5
1、客戶端細節...................................................5
2、服務器細節...................................................6
六、系統展示.......................................................7
七、實驗小結.......................................................9
Rain153 WeChat 聊天室系統一、實驗目的:
1、使用Java技術完成聊天室系統,深入學習使用Java語言。
2、使用Java 的多線程機制,深入理解Java多線程技術的應用。
3、使用GUI,對JFrame的深入學習。
4、使用網絡編程,掌握基于TCP協議的Socket編程,了解Socket編程的協議約定,掌握簡單應用協議的開發。
5、使用C/S架構,對網絡編程有一定的了解。
二、所需技術
本系統要求使用java技術開發。所需知識包括java程序設計語言、swing基本GUI組件、多線程編程、socket編程、集成開發環境使用eclipse。系統采用兩層C/S體系結構,C端負責通過GUI與客戶交互,實現注冊、登陸、收發信息、退出等功能; S端是聊天系統的服務器。
三、需求分析
開發一個類似QQ 的聊天室系統,即WeChat聊天系統。該系統應具有如下功能:
1、2、用戶注冊、登錄 群聊;
3、私聊;
4、服務器發送系統消息;
5、服務器踢人;
6、保存日志;
7、保存聊天信息;
四、系統設計
1、服務器結構
啟動服務器監聽AppServer服務器控制監聽窗體ServerFrameConnection處理所有用戶請求
服務器端結構圖示
2、客戶端結構
啟動客戶端ChatClient用戶登錄窗體Login用戶聊天主窗體ChatRoom時鐘窗體ClockRegister用戶注冊窗體Windowclose用戶窗體監聽器
客戶端結構圖示
1、AppServer.java
為服務器端監聽類,負責服務器的啟動,包括啟動監聽端口、服務器監控界面。
2、ServerFrame.java 為服務器監控窗體,負責監控服務器運行狀態。
3、Connection.java 為服務器連接處理的具體實現。
4、ChatClient.java 為客戶端程序啟動類,負責客戶端的啟動和退出。
5、Login.java 為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。
6、Register.java 為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反饋。
7、ChatRoom.java 為客戶端程序聊天室主界面,負責接收、發送聊天內容與服務器的Connection合作。
8、Windowclose 為ChatRoom.java的內部類,負責監聽聊天室界面的操作,當用戶退出時返回給服務器信息。
9、Clock.java 為客戶端程序的一個小程序,實現的一個石英鐘功能。(可選)
五、實現細節
概述:聊天室主要功能的實現:從界面輸入登錄信息,然后與服務器建立Socket連接(連接時應指定服務器的IP地址和端口號,而客戶端socket的端口由本方操作系統從空閑端口中確定),服務器端的“傾聽Socket”收到連接請求后,一般會接受連接請求,并生成一個服務端socket,專門負責與此客戶端socket的通信。一旦連接請求成功,客戶端將信息及請求通過本方socket的輸出流發送給服務器端相應的socket,服務端則通過服務器端Socket的輸入流接受客戶端傳輸過來的信息及請求,分析是何請求,然后根據請求類型,進行相應的處理(如登錄、轉發信息等)。服務方也可以根據需要,通過socket的輸出流發信息和請求給客戶端(公告)??蛻舴胶头辗蕉伎梢酝ㄟ^關閉本方的socket而結束一次通訊過程。為了實現多客戶在線的請求,使用多線程機制來處理,對每一個客戶端連接通訊,服務器端都有一個線程專門負責處理。
一)客戶端細節
1、注冊:
當選擇注冊時,Register界面等待用戶輸入注冊信息,并將信息封裝成Register_Customer類,然后通過建立在Socket的連接之上的對象輸出流將用戶注冊信息發送給服務器端,服務器端將請求轉發給Connection處理,Connection 在收到信息后將驗證數據的完整性并在數據庫中查找該用戶名是否已經注冊,然后將注冊信息加入數據庫,最后將注冊結果返回給客戶端??蛻舳孙@示注冊結果。
2、登錄:
當選擇登錄時,客戶端由Login 界面等待用戶輸入登錄信息后,封裝成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄信息發送給服務器端,服務器端將請求轉發給Connection處理,Connection 在收到信息后將驗證數據的完整性并在對象型數據庫中查找該用戶名是否已經注冊,然后將注冊用戶的信息與登錄請求信息進行密碼驗證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結果返回給客戶端。若登錄成功,客戶端將啟動聊天室主界面。
3、聊天 a、發送聊天信息:私聊功能需在在線列表中選中私聊聊天對象,并勾選私聊選項。群聊功能取消對私聊功能的勾選即可。當用戶點擊完發送按鈕后,程序開始將當前用戶名、聊天對象、聊天內容、表情和是否私聊進行封裝,然后獲取Socket連接,再用對象輸出流包裝Socket的輸出流將聊天信息對象發送給服務器端。
b、接收聊天信息:用一個單獨的接收線程實現,客戶端必須隨時接收服務器發來的消息,而讀取消息的方法采用的是阻塞式方法,若在事件處理程序中讀(占用的是事件處理線程)則會使程序在此后無法響應用戶操作,所以需要生成一個單獨的線程專門用于讀取處理消息。而發送消息的方法則是將消息放入操作系統的發送緩沖區后就返回的,所以發送執行的相當快,可以在事件處理線程中直接調用。發送和接收可以同時進行。二)服務器端細節
1、注冊:創建一個File文件類,載入“user.txt”,再用對象輸入流ObjectInputStream包裝File文件類,將存儲在“user.txt”得向量對象Vector中載入內存中,現在系統中的向量就是對象型數據庫,存儲著每條用戶信息對象。判斷是否是第一個注冊用戶,判斷用戶名是否已經存在,判斷用戶名是否為系統關鍵字,用戶名有效后 寫入數據庫,并給客戶端返回信息,關閉Socket連接。
2、登錄:去數據庫讀用戶數據,打開用戶數據庫文件“user.txt”,將用戶數據對象集載入內存,以供下面的程序使用。驗證用戶名是否存在,驗證用戶密碼是否正確,驗證用戶是否已經登錄,驗證是否已經超過最大登錄人數,如果以上驗證全部正確,返回客戶端信息,關閉Socket連接。
3、退出:接收退出信息,當用戶退出時,客戶端將會用基于Socket的對象輸出流發給服務器退出對象,把用戶從在線列表中刪除,更新在線列表。
4、聊天:接收用戶聊天信息,當用戶發送聊天信息時,服務端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其轉換為Message對象,返回聊天信息,然后系統從Message中提出消息類型,再根據類型將消息強制轉化ChatMessage,調用ChatMeaage中方法,獲取目的客戶名稱列表,根據目的地用戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉發到相應的用戶。
六、系統展示
1、注冊
客戶端注冊界面
2、登錄
客戶端登錄界面
3、聊天界面
聊天界面
4、服務器界面
服務器管理界面
服務器用戶信息管理界面
七、實驗小結
本次實驗是比較復雜的一個題目,采用C/S架構設計的聊天室,使用增量迭代方式開發,從初始的0.1版到最終的2.0正式版。通過本次實驗,對C/S架構有了較深的認識,也對多線程編程、網絡編程、GUI的認識更清晰。在項目中遇到很多問題,在解決問題的過程中,對Java也漸漸的熟悉,尤其是對各種異常的處理更是對自己的一種鍛煉。在此次實驗中應用了很多上課時未講到的知識,自己查閱API,閱讀JDK源碼學習方法的使用讓自己收獲頗豐。由于這是一個人的項目,雖然在項目的實施上很自由,可到問題沒有人討論,耗費了很多精力,不過這也是提高自己的好方法。
該Rain153 WeChat聊天室由于時間原因,很多功能實現的并不合理,也有些功能尚未實現。Rain153 WeChat并未與數據庫連接,只是簡單的用文件保存用具信息及消息記錄。
第五篇:java聊天室設計總結
JAVA聊天室程序設計總結
大二第一學期末我們進行了為期兩周的java實習,這次的實習內容是設計一個多人聊天室。在網絡越來越發達的今天,人們對網絡的依賴越來越多,越來越離不開網絡,由此而產生的聊天工具越來越多,類似QQ、MSN,網絡聊天時一類的聊天系統的發展日新月異,因此老師布置了制作一個有簡單聊天功能的網絡聊天程序的課程;而且通過制作該程序還能更好的學習網絡軟件編程知識。
一、設計內容
利用java語言實現聊天室程序。聊天室分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發來的消息,客戶端需登錄到服務器端才可以實現正常的聊天功能。設計的聊天室能實現用戶登錄,顯示登錄用戶列表,以及發送聊天信息和顯示聊天信息的功能。并可以選擇接收信息的用戶進行單發或群發的功能,運行程序,登錄服務器后,可以從列表中選擇單個或多個用戶進行聊天,它是圖形界面,線程,流與文件系統等技術的綜合應用。
二、實現功能
1、啟動服務器端,接收客戶端發來的信息,并在服務器端窗體顯示客戶端聊天信息,再吧信息返給在線用戶。
2、啟動客戶端,進入客戶端頁面,輸入用戶名,點擊登錄按鈕,在顯示在線用戶列表內顯示用戶名。
3、發送編輯框輸入發送內容,單擊發送按鈕,啟動輸出流,把信息發送出去,同時把發出的信息追加到聊天內容文本域內,顯示用戶名,時間和發送內容。
4、聊天信息文本域,在線用戶顯示域和發送信息的文本域加了滾動條,其中聊天信息文本域,發送信息的文本域的文字能自動換行。
5、別的客戶端發來信息是通過輸入流讀取信息,并截取發來信息的用戶名及信息,用戶名加到在線用戶列表上顯示在線,信息追加到聊天內容文本域內,顯示用戶名,時間和發送內容。
三、設計收獲
這是大學以來第一次自主設計一個聊天程序,于我來說還是很有新鮮感但同時也有著稍許擔心。通過此次課程設計,將我本學期所學的JAVA知識得到鞏固和應用,在設計的過程中我遇到了很到問題,但經過一次又一次的思考,一遍又一遍的檢查和在老師、同學們的幫助下,慢慢的走上了成功之路,同時也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。這次課程設計還讓我懂得了寫程序不能閉門造車,要努力拓寬知識面,開闊視野,拓展思維。它還讓我學會了在網上查閱那些無限的資料。讓我不僅學會了書本上的知識,還讓自己能夠面對困難并且克服它使我更加扎實的掌握了有關JAVA方面的知識。過而能改,善莫大焉。在聊天室設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲齲最終的檢測調試環節,本身就是在踐行“過而能改,善莫大焉”的知行觀。程序雖然完成,但是距離優秀仍存在一定差距,用JAVA開發大型項目還有很多我需要去努力學習的知識。希望自己能不斷學習和實踐,爭取以后做得更好。