版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、java網(wǎng)絡編程實踐(基于c/s的控制臺聊天室 )課程設計說明書課程名稱:java網(wǎng)絡課程實踐題目:基于c/s的控制臺聊天室姓名:學號:教學班號:01指導教師: 蘭州交通大學軟件科學與工程系二一一 年 月 日任務書:題目 3:基于c/s的控制臺聊天室(1人)實現(xiàn)幾個客戶端的群聊(在控制臺窗口顯示聊天信息),信息經(jīng)服務端轉(zhuǎn)發(fā)和群發(fā),多客戶端使用多線程?;趕ocket。注意:在每一個客戶端窗口要顯示所有參與聊天者的聊天內(nèi)容,包括誰發(fā)言及發(fā)言內(nèi)容。文檔內(nèi)容要求:1、在做上述題目時,正文要求包含4部分內(nèi)容:1)項目簡述和目的 2)解題基本思路;3)分析和設計 4)主要程序源代碼;5)運行截圖;5)總
2、結(jié)和體會2、文檔裝訂順序:1)封面;2)任務書;3)團隊成員及分工列表;3)正文。3、打印格式要求:Ø 紙型:b5Ø 頁邊距:上2.54cm;下2.54cm;左2.2cm;右1.9cm;裝訂線為0Ø 字體、格式要求: 題目:2號黑體不加粗,居中,段前段后間距1行。子標題字體為4號黑體。所有的子標題均加粗,置于頁面最左端,段前段后間距均設為0.5行。文章正文皆為5號宋體,行距為固定值22磅,字距為標準。圖、表的標題文字采用小5號黑體,表中的文字采用小5號宋體基于c/s的控制臺聊天室一、 設計目的鞏固所學的java語言基礎知識,增進java語言的編輯基本功,拓展常用類
3、庫的應用,使我們通過教學環(huán)節(jié)與手段,把所學的課程及相關知識加以融會貫通, 二、設計內(nèi)容運用java程序編寫聊天室,實現(xiàn)簡單的聊天功能。它是圖形界面,線程,流與文件系統(tǒng)等技術(shù)的綜合應用。其界面主要采用了java.awt包,java.swing包等。程序?qū)崿F(xiàn)了聊天室的基本功能,其中有:1. 啟動服務器。2. 啟動登錄界面。3. 進入客戶端界面。4. 發(fā)送信息。5. 離開客戶端界面。6. 關閉服務器。三、 分析1.首先通過繼承jframe類構(gòu)造服務器界面。使服務器能夠為每一個客戶啟動一個線程,記錄客戶的上下線行為、登錄的ip,發(fā)送消息的時刻,監(jiān)視客戶的聊天記錄,對于出現(xiàn)不文明的話語,在客戶端進行屏蔽
4、,并統(tǒng)計出現(xiàn)不文明用語的次數(shù),超過三次提示警告信息,并將其踢出聊天室。2.設計客戶端程序使其能夠完成正常的通信功能,并且可以更改背景顏色,設置字體顏色。3.設計登錄程序,使其顯示登錄的ip地址端口號,以及用戶昵稱,通過登錄按鈕可以調(diào)用客戶端程序,實現(xiàn);聊天功能。四、詳細設計程序中引入的包:import .*;import java.io.*;import java.util.*;import java.awt.event.*;import java.awt.*;import java.javax.swing.*;1) 服務器端代碼中用戶自定義的類:類名:server作用:服務器的啟動繼承的類:
5、jframe,構(gòu)造服務器界面。定義的對象:textarea 文本域java.awt.list 在線客戶列表seversocket 服務器socket 客戶端 主要成員方法:void init() 構(gòu)造服務器端的界面public void actionperformed(actionevent e) 按鈕監(jiān)聽器public void keypressed(keyevent e) 鍵盤監(jiān)聽器類名:start作用:啟動服務器的線程繼承的類名:thread主要的成員方法:public void run() 啟動服務器的線程類名:sgservice繼承的類名:thread主要的成員方法: public
6、void run() 處理單個客戶的線程2) 用戶登錄相關的類:類名:login作用:構(gòu)造登錄界面繼承的類:jframe實現(xiàn)的接口:actionlistener構(gòu)造方法:public login()主要的成員方法:public void actionperformed(actionevent e) 實現(xiàn)登錄和取消按鈕的監(jiān)聽器類名:loginstart繼承的類:thread主要的方法:public void run()作用:如果登錄成功,則彈出客戶端聊天窗口,如果登錄失敗,則打印出登錄失敗,以告知客戶3) 客戶端相關的類:類名:client繼承的類:jframe實現(xiàn)的接口:actionliste
7、ner構(gòu)造方法:public client(printstream out,bufferedreader in,string name)主要的成員方法:public void receive() 接受服務端發(fā)來的信息五.主要程序源代碼/聊天室服務器import .*;import java.io.*;import java.util.*;import java.awt.event.*;import java.awt.*;import javax.swing.*;class server extends jframeprivate textarea msga=new textarea(); /服
8、務器用來輸入用的文本域private textarea area=new textarea(); /服務器顯示消息的文本域private textfield portt=new textfield("8888");private java.awt.list list=new java.awt.list(); /在線客戶列表private serversocket server;/服務器private socket client; /客戶端private map<string,socket> container=new hashmap<string,sock
9、et>(); /hashmapvoid init()panel p1=new panel();panel p2=new panel();panel p3=new panel();panel p4=new panel();panel p5=new panel();panel p6=new panel();panel p7=new panel();panel p8=new panel();panel p9=new panel();panel p10=new panel();/設置兩個重要的文本框label lb1=new label("服務器界面");lb1.setbac
10、kground(new color(250,120,150);label lb2=new label("port");borderlayout border1=new borderlayout();p1.setlayout(border1);p1.add(borderlayout.center,area);borderlayout border2=new borderlayout();p5.setlayout(border2);p5.add(borderlayout.north,p3);p5.add(borderlayout.center,msga);borderlayou
11、t border3=new borderlayout();p7.setlayout(border3);p7.add(borderlayout.center,p1);p7.add(borderlayout.south,p5);p7.setbackground(new color(250,150,200);jbutton startbutton=new jbutton("啟動服務");jbutton sendbutton=new jbutton("發(fā)送");jbutton flushbutton=new jbutton("刷新列表");f
12、lowlayout f1=new flowlayout(flowlayout.left);p8.setlayout(f1);p8.add(lb2);p8.add(portt);p8.add(startbutton);p8.add(sendbutton);p8.add(flushbutton);p8.setbackground(new color(250,120,150);borderlayout border4=new borderlayout();p9.setlayout(border4);p9.add(borderlayout.center,p7);p9.add(borderlayout.
13、south,p8);p10.setlayout(new borderlayout();label lb3=new label("在線用戶");lb3.setbackground(new color(250,120,150);p10.add(lb3,borderlayout.north);p10.add(list,borderlayout.center);area.seteditable(false);borderlayout border=new borderlayout();this.addwindowlistener(new windowadapter()public
14、void windowclosing(windowevent arg0)system.exit(0););this.setlayout(border);this.add(borderlayout.north,lb1);this.add(borderlayout.center,p9);this.settitle("聊天服務器");this.setbounds(100,100,600,550);this.setvisible(true);/“啟動服務”按鈕監(jiān)聽器startbutton.addactionlistener(new actionlistener()public vo
15、id actionperformed(actionevent e)thread t=new start();t.start(););/啟動服務按鈕監(jiān)聽器/發(fā)送按鈕監(jiān)聽器sendbutton.addactionlistener(new actionlistener()public void actionperformed(actionevent e)string msg =msga.gettext();if(msg!=null&& msg!="")/如果消息不為空calendar ca=new gregoriancalendar();int hh=ca.get
16、(calendar.hour_of_day);int mm=ca.get(calendar.minute);int ss=ca.get(calendar.second);string time=new string(hh+":"+mm+":"+ss+"");broadcast(time +"系統(tǒng)消息:"+msg); /那么廣播這條消息area.append(time+"系統(tǒng)消息:"+msg+"n");msga.settext(""););/end/刷新按鈕
17、監(jiān)聽器flushbutton.addactionlistener(new actionlistener()public void actionperformed(actionevent e)if(list!=null)list.removeall(); /清空在線用戶列表,以便刷新set<map.entry<string,socket>> myset=container.entryset(); for(iterator<map.entry<string,socket>> it=myset.iterator();it.hasnext();)/刷新列
18、表map.entry<string,socket> me=it.next();string aclientname=me.getkey();socket aclient=me.getvalue();string aclientaddress=aclient.getinetaddress().gethostaddress();list.add(aclientname+"-"+aclientaddress););msga.addkeylistener(new keyadapter()/從鍵盤監(jiān)聽器-按下enter發(fā)送消息public void keypressed(
19、keyevent e)int value=e.getkeycode();if(value=keyevent.vk_enter)string msg=msga.gettext();calendar ca=new gregoriancalendar();int hh=ca.get(calendar.hour_of_day);int mm=ca.get(calendar.minute);int ss=ca.get(calendar.second);string time=new string(hh+":"+mm+":"+ss+"");bro
20、adcast(time +"系統(tǒng)消息:"+msg); /那么廣播這條消息area.append(time+"系統(tǒng)消息:"+msg+"n");msga.settext(""););class start extends thread /啟動服務器的線程public void run()tryif(server!=null&& !server.isclosed()area.append("警告!服務器已在啟動中!n");elseserver=new serversocket(inte
21、ger.parseint(portt.gettext();/啟動服務器area.append(new date().tostring()+"n"+"恭喜!(*_*) 嘻嘻"+"服務器啟動成功!"+"nn" );while(true)client=server.accept();thread sgs=new sgservice(client); /為每位登錄的客戶創(chuàng)建一個線程 sgs.start(); /啟動客戶線程catch(exception e)system.out.println("cuowu 1&
22、quot;);e.printstacktrace();/處理單個客戶的線程class sgservice extends threadprivate socket client=null;/客戶套接字private bufferedreader br=null;/輸入流private printstream ps=null;private int counter=0;/記錄是第幾次接受用戶的信息private int mark=0;/記錄用戶說不文明用語的次數(shù)private string name=null;sgservice(socket client)/構(gòu)造方法this.client=cl
23、ient;public void run()/run-begintrybr=new bufferedreader(new inputstreamreader(client.getinputstream();ps=new printstream(client.getoutputstream();string msg=null;while(msg=br.readline()!=null)/無限循環(huán)意味著可以和用戶進行無限次交互if(counter=0)name= msg;container.put(name,client);list.add(name+"-"+client.ge
24、tinetaddress().gethostaddress();calendar ca=new gregoriancalendar();int hh=ca.get(calendar.hour_of_day);int mm=ca.get(calendar.second);string time=hh+":"+mm+":"+""broadcast(time+name+"上線了!nn");counter+;elseif(msg.equals("你是個笨蛋")mark=mark+1;if(mark<
25、;3)calendar ca=new gregoriancalendar();int hh=ca.get(calendar.hour_of_day);int mm=ca.get(calendar.minute);int ss=ca.get(calendar.second);string time=new string(hh+":"+mm+":"+ss+"");singlecom(time+"系統(tǒng)消息:警告,請注意文明用語!",client);area.append(time+"系統(tǒng)消息:"+na
26、me+"第"+mark+"次使用了不文明用語,特此警告!");else/如果客戶第三次說不文明的話,系統(tǒng)就把他踢出聊天室calendar ca=new gregoriancalendar();int hh=ca.get(calendar.hour_of_day);int mm=ca.get(calendar.minute);int ss=ca.get(calendar.second);string time=new string(hh+":"+mm+":"+ss+"");if(mark=3)si
27、nglecom(time+"系統(tǒng)消息:"+name+"由于多次使用了不文明用語,經(jīng)警告無效,現(xiàn)已被踢出聊天室!",client);/告訴他本人removeclient(name,client);/從系統(tǒng)列表中刪除這個人的信息/并向所有人廣播這一消息broadcast(time+"系統(tǒng)消息:"+name+"由于多次使用了不文明用語,經(jīng)警告無效,現(xiàn)已被踢出聊天室!n");area.append(time+"系統(tǒng)消息:"+name+"由于多次使用了不文明用語,經(jīng)警告無效,現(xiàn)已被踢出聊天室!&
28、quot;);elsecalendar ca=new gregoriancalendar();int hh=ca.get(calendar.hour_of_day);int mm=ca.get(calendar.minute);int ss=ca.get(calendar.second);string time=new string(hh+":"+mm+":"+ss+"");area.append(time+name+"說"+msg+"nn");/同時向每個在線客戶廣播這則消息catch(exc
29、eption ex)calendar ca=new gregoriancalendar();int hh=ca.get(calendar.hour_of_day);int mm=ca.get(calendar.minute);int ss=ca.get(calendar.second);string time=new string(hh+":"+mm+":"+ss+"");area.append(time+name+"下線了!n");broadcast(time+name+"下線了!n");li
30、st.remove(name+"-"+client.getinetaddress().gethostaddress();container.remove(name);void removeclient(string name,socket client)list.remove(name+"-"+client.getinetaddress().gethostaddress();container.remove(name);void broadcast(string msg)/broadcast-beginset<map.entry<string
31、,socket>> myset=container.entryset();iterator<map.entry<string,socket>> it=myset.iterator();string message=msg;while(it.hasnext()/如果列表中還有客戶map.entry<string,socket> me=it.next();socket tempclient=me.getvalue();singlecom(message,tempclient);/就把消息發(fā)給這個客戶/向單個客戶發(fā)送消息private void sin
32、glecom(string msg,socket aclient)/singlecommunition-begintryprintstream pw=new printstream(aclient.getoutputstream();string message=msg;pw.println(msg);catch(exception ex)ex.printstacktrace();public static void main(string args)new server().init();/啟動服務器窗口system.out.println("服務器");/聊天室客戶端i
33、mport java.awt.event.*;import javax.swing.*;import java.io.*;import .*;import java.awt.*;class client extends jframeprintstream out;/輸出流bufferedreader in;/輸入流string name;textarea area=new textarea();textarea msga=new textarea();textfield frdnamet=new textfield(10);list list=new list();panel p10=new
34、panel();jbutton sendbutton=new jbutton("發(fā)送");jbutton closebutton=new jbutton("關閉");jbutton jb1=new jbutton("設置字體顏色");jbutton jb2=new jbutton("設置背景顏色");label lb1=new label("昵稱");void init()this.pack();/設置幾個面板panel p1=new panel();panel p2=new panel();p
35、anel p3=new panel();panel p4=new panel();panel p5=new panel();panel p6=new panel();panel p7=new panel();panel p8=new panel();panel p9=new panel();lb1.setbackground(color.pink);/設置兩個主要的文本框borderlayout border1=new borderlayout();p1.setlayout(border1);p1.add(borderlayout.center,area);area.seteditable(f
36、alse);flowlayout f2=new flowlayout(flowlayout.left);p3.setlayout(f2);p3.add(jb1);p3.add(jb2);borderlayout border2=new borderlayout();p5.setlayout(border2);p5.add(borderlayout.north,p3);p5.add(borderlayout.center,msga);p5.setbackground(color.pink);borderlayout broder3=new borderlayout();p7.setlayout(
37、broder3);p7.add(borderlayout.center,p1);p7.add(borderlayout.south,p5);flowlayout f1=new flowlayout(flowlayout.right);p8.setlayout(f1);p8.add(sendbutton);p8.add(closebutton);p8.setbackground(color.pink);borderlayout broder4=new borderlayout();p9.setlayout(broder4);p9.add(borderlayout.center,p7);p9.ad
38、d(borderlayout.south,p8);/窗口關閉this.addwindowlistener(new windowadapter()public void windowclosing(windowevent arg0)system.exit(0););borderlayout broder5=new borderlayout();p10.setlayout(broder5);p10.add(borderlayout.center,list);p10.setbackground(color.blue);/添加字體顏色的監(jiān)聽器jb1.addactionlistener(new acti
39、onlistener()public void actionperformed(actionevent e)jcolorchooser chooser4=new jcolorchooser();color color=chooser4.showdialog(client.this,"我的調(diào)色盤",color.yellow);area.setforeground(color);msga.setforeground(color);list.setforeground(color););jb2.addactionlistener(new actionlistener()publi
40、c void actionperformed(actionevent e)jcolorchooser chooser4=new jcolorchooser();color color=chooser4.showdialog(client.this,"我的調(diào)色盤",color.yellow);area.setbackground(color););borderlayout border=new borderlayout();this.setlayout(border);this.add(borderlayout.north,lb1);this.add(borderlayout
41、.center,p9);this.add(borderlayout.east,p10);this.settitle("聊天室客戶端");this.setsize(700,600);this.setvisible(true);sendbutton.addactionlistener(new actionlistener()/“發(fā)送”按鈕監(jiān)聽器public void actionperformed(actionevent e)string msg =msga.gettext();msga.settext("");/清空輸入文本域out.println(msg
42、););msga.addkeylistener(new keyadapter()/鍵盤監(jiān)聽器-按下enter發(fā)送信息public void keypressed(keyevent e)int value=e.getkeycode();if(value=keyevent.vk_enter)string msg=msga.gettext();msga.settext("");/清空文本域out.println(msg););closebutton.addactionlistener(new actionlistener()/關閉監(jiān)聽器public void actionperf
43、ormed(actionevent e)system.exit(100););public client(printstream out,bufferedreader in,string name)/構(gòu)造方法this.out=out;this.in=in;=name;lb1.settext("昵稱:"+name);init();/彈出客戶端窗口out.println(name);receive();/開始與服務器通信public void receive()/接收服務器端發(fā)來的信息trystring text=null;while(text=in.read
44、line()!=null)this.area.append(text+"n");/在area上讀入的內(nèi)容catch(ioexception e)e.printstacktrace();/todo auto-generated catch blockfinallytryin.close();out.close();catch(exception ex)ex.printstacktrace();/登錄界面import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import .
45、*;class login extends jframe implements actionlistenertextfield txtport;textfield txtip;textfield txtname;jbutton btnlogin;jbutton btncancel;socket toserver;bufferedreader in;printstream out;public login()panel p1=new panel();panel p2=new panel();panel p3=new panel();panel p4=new panel();panel p5=ne
46、w panel(); label l1=new label("port"); label l2=new label("ip"); label l3=new label("昵稱"); txtport=new textfield("8888",15); txtip=new textfield("",15); txtname=new textfield("小敏",15); p2.add(l1); p2.add(txtport); p3.add(l2); p3.add(txtip); p4.add(l3); p4.add(txtname);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版礦山地質(zhì)環(huán)境治理施工與礦山環(huán)境治理項目合同3篇
- 2024年支模架租賃及施工安全培訓服務合同3篇
- 2024年商鋪委托租賃與共享經(jīng)濟合作協(xié)議3篇
- 供水企業(yè)安全操作指引
- 建筑智能化凈化施工合同
- 型材耐熱水性檢測合同
- 項目執(zhí)行監(jiān)控指南
- 林業(yè)項目招投標制度優(yōu)化
- 電子商務平臺建設項目歸檔
- 2024年茶文化藝術(shù)交流合作合同3篇
- 關注健康預防甲流甲型流感病毒知識科普講座課件
- 2023-2024學年江蘇省吳江市小學語文五年級上冊期末高分測試題
- GB/T 4852-2002壓敏膠粘帶初粘性試驗方法(滾球法)
- GB/T 20641-2006低壓成套開關設備和控制設備空殼體的一般要求
- 醫(yī)院固定資產(chǎn)及物資購置工作流程圖
- 中學學校辦公室主任個人述職報告
- GA/T 1774-2021法庭科學手印檢驗實驗室建設規(guī)范
- 骨科圍手術(shù)期的護理-課件
- 檢驗危急值在急危重癥病人的臨床應用課件
- 2023年陜西金融控股集團有限公司校園招聘筆試題庫及答案解析
- 醫(yī)院物業(yè)服務機構(gòu)運行管理機制
評論
0/150
提交評論