基于CS簡單聊天程序課程設(shè)計(jì)_第1頁
基于CS簡單聊天程序課程設(shè)計(jì)_第2頁
基于CS簡單聊天程序課程設(shè)計(jì)_第3頁
基于CS簡單聊天程序課程設(shè)計(jì)_第4頁
基于CS簡單聊天程序課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)任務(wù)書 學(xué) 院計(jì)算機(jī)與信息工程學(xué)院專 業(yè)網(wǎng)絡(luò)工程課程名稱計(jì)算機(jī)網(wǎng)絡(luò)題 目基于C/S模式的簡單聊天程序完成期限自2016年6月13日至2016年6月26日共兩周內(nèi)容及任務(wù)一、項(xiàng)目的目的利用socket。實(shí)現(xiàn)客戶與服務(wù)器間的信息互通。二、項(xiàng)目任務(wù)的主要內(nèi)容和要求(1)用戶聊天室具有群發(fā),私聊,輸入昵稱與端口號等基本設(shè)置。點(diǎn)擊“連接”按鈕實(shí)現(xiàn)與服務(wù)器的連接。點(diǎn)擊“斷開”按鈕實(shí)現(xiàn)與服務(wù)器的斷開連接。(2)服務(wù)器聊天室具有啟動(dòng)服務(wù)器,停止服務(wù)器,顯示當(dāng)前在線的用戶功能。點(diǎn)擊“啟動(dòng)”按鈕實(shí)現(xiàn)與服務(wù)器的連接。點(diǎn)擊“停止”按鈕實(shí)現(xiàn)與服務(wù)器的斷開連接。(3)設(shè)計(jì)一個(gè)登錄程序。驗(yàn)證通過后才能進(jìn)入

2、聊天室。(4)當(dāng)服務(wù)器與客戶機(jī)連接成功后。能夠互相接受和發(fā)送消息。當(dāng)多個(gè)客戶機(jī)啟動(dòng)時(shí),服務(wù)器會創(chuàng)建子線程處理對應(yīng)線程的消息。三、項(xiàng)目設(shè)計(jì)(研究)思路(1)設(shè)計(jì)步驟:先畫出聊天室的模型,布局。(2)設(shè)計(jì)要點(diǎn):設(shè)計(jì)主類與子類,分別實(shí)現(xiàn)不同的功能(3)主要技術(shù)分析:需要掌握socket通信,swing和awt,io的簡單應(yīng)用.(4)解決思路:先按照草稿圖設(shè)計(jì)出聊天室布局。再寫各個(gè)類的功能。簡單測試與修改代碼。最后完善。四、具體成果形式和要求(見第一部分)進(jìn)度安排起止日期工作內(nèi)容6.13-6.18設(shè)計(jì)聊天室的模型,布局6.19-6.20編寫代碼,初步實(shí)現(xiàn)聊天程序6.21-6.26完善代碼,優(yōu)化界面,完

3、成任務(wù)主要參考資料1趙生慧.Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版)M.北京:中國水利水電出版社,2013.2萬常選.數(shù)據(jù)庫系統(tǒng)原理與設(shè)計(jì)(第二版)M.北京:清華大學(xué)出版社,2012.3謝鈞,謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)教程(第四版)M.北京:人民郵電出版社,2014.4李剛.瘋狂JAVA講義M.(第三版).北京:電子工業(yè)出版社,2014. 5耿祥義、張躍平.Java2實(shí)用教程M.(第三版).北京:清華大學(xué)出版社, 2006. 6劉海杰.Java編程設(shè)計(jì)M.北京:中國鐵道出版社,2006.指導(dǎo)教師意見(簽字): 年 月 日系(教研室)主任意見(簽字): 年 月 日基于C/S模式的簡單聊天程序設(shè)計(jì)說明書 學(xué)院名

4、稱: 計(jì)算機(jī)與信息工程學(xué)院 班級名稱: 網(wǎng)絡(luò)工程142 學(xué)生姓名: 張 三 學(xué) 號: 2014211540 題 目: 基于C/S模式的簡單聊天程序 指導(dǎo)教師 姓 名: 陳 海 寶 起止日期: 2016.6.26 目錄一、選題背景1二、方案論證1三、過程論述23.1 服務(wù)器端23.2 客戶機(jī)端8四、結(jié)果分析15五、結(jié)論17第一部分:正文部分一、選題背景使用Socket實(shí)現(xiàn)網(wǎng)上聊天功能。用戶可以通過客戶端連接到服務(wù)器端并進(jìn)行網(wǎng)上聊天。聊天時(shí)可以啟動(dòng)多個(gè)客戶端。服務(wù)器端啟動(dòng)后,接收客戶端發(fā)來的用戶名和密碼驗(yàn)證信息。驗(yàn)證通過則以當(dāng)前的聊天客戶列表信息進(jìn)行響應(yīng);此后接收客戶端發(fā)來的聊天信息,轉(zhuǎn)發(fā)給客戶端

5、指定的聊天客戶(即私聊)或所有其他客戶端;在客戶斷開連接后公告其退出聊天系統(tǒng)的信息??蛻舳藛?dòng)后在GUI界面接收用戶輸入的服務(wù)器端信息、賬號和密碼等驗(yàn)證客戶的身份。驗(yàn)證通過則顯示當(dāng)前系統(tǒng)在線客戶列表??蛻艨梢耘c指定對象進(jìn)行私聊,也可以向系統(tǒng)中所有在線客戶發(fā)送信息。二、方案論證基于C/S的簡單聊天室可以實(shí)現(xiàn)用戶與服務(wù)器間,服務(wù)器與多個(gè)用戶間的通信。聊天室程序通常需要完成以下一些基本功能:     (1)登錄聊天室;     (2)啟動(dòng)服務(wù)器;    

6、0;(3)關(guān)閉服務(wù)器;     (4)用戶之間的聊天;    (5)退出聊天室。      本系統(tǒng)其體功能需求如下: (1)聊天室管理員經(jīng)登錄界面登錄到管理界面,即系統(tǒng)的服務(wù)器端。用戶經(jīng)登錄界面進(jìn)入聊天大廳。 (2)不論是管理員還是用戶都需要在登錄界面輸入正確的用戶名和密碼后才可以登錄到各自的界面中去。 (3)系統(tǒng)的兩個(gè)主要界面都是為方便管理員和用戶操作的。首先,管理員進(jìn)入到管理界面后可以方便的啟動(dòng)/停止服務(wù)器,看到在線用戶的信息和聊天

7、信息。用戶進(jìn)入到聊天大廳中可以聊天,查看服務(wù)器狀態(tài)。  (4) 一個(gè)用戶退出聊天室對其他用戶不能產(chǎn)生影響,而服務(wù)器斷開與客戶端的連接則所有的用戶都失去與服務(wù)器的連接。 (5)用戶的聊天信息錄入,重寫,發(fā)送,接收方便,快捷。  (6)服務(wù)器狀態(tài),聊天信息和在線用戶人數(shù)及時(shí)刷新。   (7)聊天室系統(tǒng)運(yùn)行穩(wěn)定、安全性高、三、過程論述3.1 服務(wù)器端(1)首先實(shí)現(xiàn)的是服務(wù)器開始工作 界面,如圖3-1所示:圖3-1 代碼如下:public ChatServer() try System.out.println("

8、服務(wù)器開始工作."); server=new ServerSocket(port);/初始化服務(wù)器套接字 while (true) socket=server.accept();/等待連接 System.out.println(socket.getInetAddress()+"連接n");/得到客戶機(jī)地址 Client client=new Client(socket);/實(shí)例化一個(gè)客戶線程(其中線程Client中Socket,這里的Socket只是起個(gè)過渡作用) clients.add(client);/增加客戶線程到向量中 client.start();/啟動(dòng)

9、線程 notifyChatRoom();/監(jiān)視聊天室連接變化 catch(Exception ex) ex.printStackTrace(); (2)監(jiān)視聊天室連接情況,并顯示出來,如圖3-2所示:圖3-2代碼如下:public static void notifyChatRoom() StringBuffer newUser=new StringBuffer("newUser"); for(int i =0;i<clients.size();i+) Client c=(Client)clients.elementAt(i); newUser.append(&quo

10、t;:"+); sendClients(newUser); public static void sendClients(StringBuffer message) for(int i =0;i<clients.size();i+) Client client=(Client)clients.elementAt(i); client.send(message); public void closeAll() while(clients.size()>0) Client client=(Client)clients.firstElement(); try cli

11、ent.socket.close(); catch(IOException e) e.printStackTrace(); clients.removeElement(client); /移出客戶端 public static void disconnect(Client c) / 斷開客戶端 try System.err.println(c.ip+"斷開連接n"); catch (Exception ex) ex.printStackTrace(); clients.removeElement(c); c.socket = null; (3)再次是實(shí)現(xiàn)服務(wù)器與客戶機(jī)連接機(jī)

12、制,如果有客戶機(jī)申請連接,則為此客戶機(jī)創(chuàng)建線程,代碼如下:public ChatServer() try System.out.println("服務(wù)器開始工作."); server=new ServerSocket(port);/初始化服務(wù)器套接字 while (true) socket=server.accept();/等待連接 System.out.println(socket.getInetAddress()+"連接n");/得到客戶機(jī)地址 Client client=new Client(socket);/實(shí)例化一個(gè)客戶線程(其中線程Clien

13、t中Socket,這里的Socket只是起個(gè)過渡作用) clients.add(client);/增加客戶線程到向量中 client.start();/啟動(dòng)線程 notifyChatRoom();/監(jiān)視聊天室連接變化 catch(Exception ex) ex.printStackTrace(); public ChatServer() try System.out.println("服務(wù)器開始工作."); server=new ServerSocket(port);/初始化服務(wù)器套接字 while (true) socket=server.accept();/等待連接

14、System.out.println(socket.getInetAddress()+"連接n");/得到客戶機(jī)地址 Client client=new Client(socket);/實(shí)例化一個(gè)客戶線程(其中線程Client中Socket,這里的Socket只是起個(gè)過渡作用) clients.add(client);/增加客戶線程到向量中 client.start();/啟動(dòng)線程 notifyChatRoom();/監(jiān)視聊天室連接變化 catch(Exception ex) ex.printStackTrace(); (4)再次是實(shí)現(xiàn)服務(wù)器的消息發(fā)送和接受的處理機(jī)制,如圖

15、3-3所示:圖3-3代碼如下:public Client(Socket s) socket = s; try reader = new BufferedReader(new InputStreamReader(s.getInputStream();/得到輸入流 ps = new PrintStream(s.getOutputStream();/到輸出流 String info = reader.readLine();/讀取接收到的信息 StringTokenizer stinfo = new StringTokenizer(info,":"); /分解字符串 String

16、head = stinfo.nextToken(); /獲取關(guān)鍵字 System.out.println(stinfo.toString(); System.out.println(head); if (stinfo.hasMoreTokens() name = stinfo.nextToken(); /獲取用戶名 if (stinfo.hasMoreTokens() ip = stinfo.nextToken(); /獲取IP地址 catch (IOException ex) ex.printStackTrace(); System.out.println(name); System.out

17、.println(ip); public void send (StringBuffer msg) ps.println(msg); /輸出信息 ps.flush(); public void run() while (true) String line = null; try line = reader.readLine(); System.out.println("line:"+line); catch (IOException ex) ex.printStackTrace(); /輸出錯(cuò)誤信息 ChatServer.disconnect(this);/斷開連接 Cha

18、tServer.notifyChatRoom();/更新信息 if (line = null) /客戶離開 ChatServer.disconnect(this); ChatServer.notifyChatRoom(); StringTokenizer st = new StringTokenizer(line,":");/分解字符串 String keyword = st.nextToken(); if (keyword.equals("MSG") /發(fā)送來的聊天信息 StringBuffer msg = new StringBuffer("

19、;MSG:"); msg.append(name); /在信息上增加用戶名 msg.append(st.nextToken("0n"); ChatServer.sendClients(msg);/發(fā)送聊天語句到各個(gè)客戶端 System.out.println(msg); else if (keyword.equals("quit") /退出命令 ChatServer.disconnect(this); /斷開連接 ChatServer.notifyChatRoom(); /刷新信息 3.2 客戶機(jī)端(1)客戶機(jī)登錄界面如圖3-4所示:圖3-4代

20、碼如下:public class ChatClient extends JFrame implements ActionListener TextField tfName = new TextField();/姓名輸入文本域 Button btConnect = new Button("登陸");/連接按鈕 Button btDisconnect = new Button("退出");/斷開連接按鈕 TextArea tfChat = new TextArea();/顯示聊天信息文本域 Button btSend = new Button("發(fā)

21、送"); TextField tfMessage = new TextField();/聊天輸入 java.awt.List list1 = new java.awt.List(9);/顯示在線用戶信息 Socket socket = null;/連接端口 PrintStream ps = null;/輸出流 Listen listen = null; /監(jiān)聽線程類 class Listen extends Thread BufferedReader reader; PrintStream ps; String cname; Socket socket; ChatClient cha

22、tClient; public Listen(ChatClient client,String name,Socket socket) try this.chatClient = client; this.socket = socket; ame = name; reader = new BufferedReader(new InputStreamReader(socket.getInputStream(); ps = new PrintStream(socket.getOutputStream(); catch (IOException e) e.printStackTrace(); pub

23、lic void run() while (true) String line=null; try line = reader.readLine(); /讀取數(shù)據(jù)流 System.out.println("客戶端:"+line); catch (IOException ex) ex.printStackTrace(); ps.println("quit"); /斷開連接 return; StringTokenizer stinfo = new StringTokenizer(line,":"); /分解字符串 String keywo

24、rd = stinfo.nextToken(); if (keyword.equals("MSG") chatClient.tfChat.append(line+"n"); else if (keyword.equals("newUser") chatClient.list1.clear(); chatClient.list1.add("users", 0); int i = 1; while (stinfo.hasMoreTokens() chatClient.list1.add(stinfo.nextToken

25、(), i+); public ChatClient(Socket socket) this.setLayout(new BorderLayout(); JPanel panel1 = new JPanel(); Label label = new Label("賬號"); panel1.setBackground(Color.pink); panel1.add(label); panel1.add(tfName); panel1.add(btConnect); panel1.add(btDisconnect); this.add(panel1,BorderLayout.S

26、OUTH); JPanel panel2 = new JPanel(); tfChat.setBackground(Color.yellow); panel2.add(tfChat); panel2.add(list1); this.add(panel2,BorderLayout.CENTER); JPanel panel3 = new JPanel(); Label label2 = new Label("聊天板"); panel3.add(label2); panel3.add(tfMessage); panel3.add(btSend); this.add(panel

27、3,BorderLayout.NORTH); this.setBounds(50,50,400,350); this.setVisible(true); btConnect.addActionListener(this); btDisconnect.addActionListener(this); btSend.addActionListener(this); (2)其次是實(shí)現(xiàn)消息的接受和發(fā)送處理機(jī)制,代碼如下:public void run() while (true) String line=null; try line = reader.readLine(); /讀取數(shù)據(jù)流 System

28、.out.println("客戶端:"+line); catch (IOException ex) ex.printStackTrace(); ps.println("quit"); /斷開連接 return; StringTokenizer stinfo = new StringTokenizer(line,":"); /分解字符串 String keyword = stinfo.nextToken(); if (keyword.equals("MSG") chatClient.tfChat.append(lin

29、e+"n"); else if (keyword.equals("newUser") chatClient.list1.clear(); chatClient.list1.add("users", 0); int i = 1; while (stinfo.hasMoreTokens() chatClient.list1.add(stinfo.nextToken(), i+); (3)再次是實(shí)現(xiàn)客戶端登陸界面以及功能的實(shí)現(xiàn),如圖3-5所示:圖3-5代碼如下: public class ChatClient extends JFrame

30、implements ActionListener TextField tfName = new TextField();/姓名輸入文本域 Button btConnect = new Button("登陸");/連接按鈕 Button btDisconnect = new Button("退出");/斷開連接按鈕 TextArea tfChat = new TextArea();/顯示聊天信息文本域 Button btSend = new Button("發(fā)送"); TextField tfMessage = new TextFie

31、ld();/聊天輸入 java.awt.List list1 = new java.awt.List(9);/顯示在線用戶信息 Socket socket = null;/連接端口 PrintStream ps = null;/輸出流 Listen listen = null; /監(jiān)聽線程類 class Listen extends Thread BufferedReader reader; PrintStream ps; String cname; Socket socket; ChatClient chatClient; public Listen(ChatClient client,St

32、ring name,Socket socket) try this.chatClient = client; this.socket = socket; ame = name; reader = new BufferedReader(new InputStreamReader(socket.getInputStream(); ps = new PrintStream(socket.getOutputStream(); catch (IOException e) e.printStackTrace(); public void run() while (true) String line=nul

33、l; try line = reader.readLine(); /讀取數(shù)據(jù)流 System.out.println("客戶端:"+line); catch (IOException ex) ex.printStackTrace(); ps.println("quit"); /斷開連接 return; StringTokenizer stinfo = new StringTokenizer(line,":"); /分解字符串 String keyword = stinfo.nextToken(); if (keyword.equals("MSG") chatClient.tfChat.append(line+"

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論