版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)任務(wù)書 學(xué) 院計(jì)算機(jī)與信息工程學(xué)院專 業(yè)網(wǎng)絡(luò)工程課程名稱計(jì)算機(jī)網(wǎng)絡(luò)題 目基于C/S模式的簡(jiǎn)單聊天程序完成期限自2016年6月13日至2016年6月26日共兩周內(nèi)容及任務(wù)一、項(xiàng)目的目的利用socket。實(shí)現(xiàn)客戶與服務(wù)器間的信息互通。二、項(xiàng)目任務(wù)的主要內(nèi)容和要求(1)用戶聊天室具有群發(fā),私聊,輸入昵稱與端口號(hào)等基本設(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ù)器會(huì)創(chuàng)建子線程處理對(duì)應(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的簡(jiǎn)單應(yīng)用.(4)解決思路:先按照草稿圖設(shè)計(jì)出聊天室布局。再寫各個(gè)類的功能。簡(jiǎn)單測(cè)試與修改代碼。最后完善。四、具體成果形式和要求(見第一部分)進(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.北京:中國(guó)水利水電出版社,2013.2萬常選.數(shù)據(jù)庫(kù)系統(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.北京:中國(guó)鐵道出版社,2006.指導(dǎo)教師意見(簽字): 年 月 日系(教研室)主任意見(簽字): 年 月 日基于C/S模式的簡(jiǎn)單聊天程序設(shè)計(jì)說明書 學(xué)院名
4、稱: 計(jì)算機(jī)與信息工程學(xué)院 班級(jí)名稱: 網(wǎng)絡(luò)工程142 學(xué)生姓名: 張 三 學(xué) 號(hào): 2014211540 題 目: 基于C/S模式的簡(jiǎn)單聊天程序 指導(dǎo)教師 姓 名: 陳 海 寶 起止日期: 2016.6.13-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ā)來的聊
5、天信息,轉(zhuǎn)發(fā)給客戶端指定的聊天客戶(即私聊)或所有其他客戶端;在客戶斷開連接后公告其退出聊天系統(tǒng)的信息??蛻舳藛?dòng)后在GUI界面接收用戶輸入的服務(wù)器端信息、賬號(hào)和密碼等驗(yàn)證客戶的身份。驗(yàn)證通過則顯示當(dāng)前系統(tǒng)在線客戶列表??蛻艨梢耘c指定對(duì)象進(jìn)行私聊,也可以向系統(tǒng)中所有在線客戶發(fā)送信息。二、方案論證基于C/S的簡(jiǎn)單聊天室可以實(shí)現(xiàn)用戶與服務(wù)器間,服務(wù)器與多個(gè)用戶間的通信。聊天室程序通常需要完成以下一些基本功能:(1)登錄聊天室;(2)啟動(dòng)服務(wù)器;(3)關(guān)閉服務(wù)器;(4)用戶之間的聊天;(5)退出聊天室。本系統(tǒng)其體功能需求如下:(1)聊天室管理員經(jīng)登錄界面登錄到管理界面,即系統(tǒng)的服務(wù)器端。用戶經(jīng)登錄界
6、面進(jìn)入聊天大廳。 (2)不論是管理員還是用戶都需要在登錄界面輸入正確的用戶名和密碼后才可以登錄到各自的界面中去。 (3)系統(tǒng)的兩個(gè)主要界面都是為方便管理員和用戶操作的。首先,管理員進(jìn)入到管理界面后可以方便的啟動(dòng)/停止服務(wù)器,看到在線用戶的信息和聊天信息。用戶進(jìn)入到聊天大廳中可以聊天,查看服務(wù)器狀態(tài)。 (4) 一個(gè)用戶退出聊天室對(duì)其他用戶不能產(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)的是服
7、務(wù)器開始工作界面,如圖3-1所示:圖3-1 代碼如下: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è)客戶線程(其中線程Client中Socket,這里的Socket只是起個(gè)過渡作用
8、) clients.add(client);/增加客戶線程到向量中 client.start();/啟動(dòng)線程 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;iclients.size();i+) Client c=(Client)clien
9、ts.elementAt(i); newUser.append(:+); sendClients(newUser); public static void sendClients(StringBuffer message) for(int i =0;i0) Client client=(Client)clients.firstElement(); try client.socket.close(); catch(IOException e) e.printStackTrace(); clients.removeElement(client); /移出客戶端 public stati
10、c 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ī)制,如果有客戶機(jī)申請(qǐng)連接,則為此客戶機(jī)創(chuàng)建線程,代碼如下:public ChatServer() try System.out.println(服務(wù)器開始工作.); server=new ServerSocket(port);/初始化服務(wù)器套接字
11、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)線程 notifyChatRoom();/監(jiān)視聊天室連接變化 catch(Exception ex) ex.printStackTrace(
12、); 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è)客戶線程(其中線程Client中Socket,這里的Socket只是起個(gè)過渡作用) clients.add(client);/增
13、加客戶線程到向量中 client.start();/啟動(dòng)線程 notifyChatRoom();/監(jiān)視聊天室連接變化 catch(Exception ex) ex.printStackTrace(); (4)再次是實(shí)現(xiàn)服務(wù)器的消息發(fā)送和接受的處理機(jī)制,如圖3-3所示:圖3-3代碼如下:public Client(Socket s) socket = s; try reader = new BufferedReader(new InputStreamReader(s.getInputStream();/得到輸入流 ps = new PrintStream(s.getOutputStream();
14、/到輸出流 String info = reader.readLine();/讀取接收到的信息 StringTokenizer stinfo = new StringTokenizer(info,:); /分解字符串 String head = stinfo.nextToken(); /獲取關(guān)鍵字 System.out.println(stinfo.toString(); System.out.println(head); if (stinfo.hasMoreTokens() name = stinfo.nextToken(); /獲取用戶名 if (stinfo.hasMoreTokens(
15、) ip = stinfo.nextToken(); /獲取IP地址 catch (IOException ex) ex.printStackTrace(); System.out.println(name); System.out.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
16、(line:+line); catch (IOException ex) ex.printStackTrace(); /輸出錯(cuò)誤信息 ChatServer.disconnect(this);/斷開連接 ChatServer.notifyChatRoom();/更新信息 if (line = null) /客戶離開 ChatServer.disconnect(this); ChatServer.notifyChatRoom(); StringTokenizer st = new StringTokenizer(line,:);/分解字符串 String keyword = st.nextToke
17、n(); if (keyword.equals(MSG) /發(fā)送來的聊天信息 StringBuffer msg = new StringBuffer(MSG:); msg.append(name); /在信息上增加用戶名 msg.append(st.nextToken(0n); ChatServer.sendClients(msg);/發(fā)送聊天語(yǔ)句到各個(gè)客戶端 System.out.println(msg); else if (keyword.equals(quit) /退出命令 ChatServer.disconnect(this); /斷開連接 ChatServer.notifyChatR
18、oom(); /刷新信息 3.2 客戶機(jī)端(1)客戶機(jī)登錄界面如圖3-4所示:圖3-4代碼如下: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
19、= new Button(發(fā)送); 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; ChatCl
20、ient chatClient; 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.printSt
21、ackTrace(); public 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 keyword = stinfo.nextToken
22、(); 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(), i+); public ChatClient(Socket socket) this.setLayout(new BorderLa
23、yout(); JPanel panel1 = new JPanel(); Label label = new Label(賬號(hào)); panel1.setBackground(Color.pink); panel1.add(label); panel1.add(tfName); panel1.add(btConnect); panel1.add(btDisconnect); this.add(panel1,BorderLayout.SOUTH); JPanel panel2 = new JPanel(); tfChat.setBackground(Color.yellow); panel2.a
24、dd(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(panel3,BorderLayout.NORTH); this.setBounds(50,50,400,350); this.setVisible(true); btConnect.addAct
25、ionListener(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.out.println(客戶端:+line); catch (IOException ex) ex.printStackTrace(); ps.println(quit); /斷開連接
26、 return; StringTokenizer stinfo = new StringTokenizer(line,:); /分解字符串 String keyword = 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() cha
27、tClient.list1.add(stinfo.nextToken(), i+); (3)再次是實(shí)現(xiàn)客戶端登陸界面以及功能的實(shí)現(xiàn),如圖3-5所示:圖3-5代碼如下: public class ChatClient extends JFrame implements ActionListener TextField tfName = new TextField();/姓名輸入文本域 Button btConnect = new Button(登陸);/連接按鈕 Button btDisconnect = new Button(退出);/斷開連接按鈕 TextArea tfChat = new
28、TextArea();/顯示聊天信息文本域 Button btSend = new Button(發(fā)送); 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;
29、 String cname; Socket socket; ChatClient chatClient; 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.getOutputStrea
30、m(); catch (IOException e) e.printStackTrace(); public 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 keyword = stinfo.nextToken(); if (keyword.equals(MSG) chatClient.tfChat.append(line+n); else if (keyword.equals(newUser) chatClient.list1.clear
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲業(yè)解除勞動(dòng)合同樣本
- 農(nóng)業(yè)技術(shù)聘用合同證明
- 倉(cāng)儲(chǔ)管理租賃代理合同
- 建筑行業(yè)專家聘用合同
- 小區(qū)玻璃施工合同范例
- 音響技術(shù)員勞動(dòng)合同三篇
- 配電柜制造設(shè)備承攬合同三篇
- 音樂錄制與發(fā)行合同三篇
- 退伙合同協(xié)議書范本甲乙丙
- 集體宿舍租賃合同一般寫幾字
- 路虎發(fā)現(xiàn)4說明書
- 腎破裂保守治療護(hù)理查房
- 2024年避孕藥具計(jì)劃總結(jié)
- 新聞攝影課件
- 德能勤績(jī)考核表
- 收納箱注塑模具設(shè)計(jì)說明書
- Python數(shù)據(jù)科學(xué)方法與實(shí)踐(山東聯(lián)盟)智慧樹知到課后章節(jié)答案2023年下山東師范大學(xué)
- 河南省鄭州市管城區(qū)卷2023-2024學(xué)年數(shù)學(xué)四年級(jí)第一學(xué)期期末聯(lián)考試題含答案
- 班主任考核細(xì)則評(píng)分表
- 2023教科版二年級(jí)上冊(cè)科學(xué)課堂作業(yè)本參考答案
- 乘坐飛機(jī)申請(qǐng)單
評(píng)論
0/150
提交評(píng)論