網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)_第1頁
網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)_第2頁
網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)_第3頁
網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)_第4頁
網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)編制僅供參考審核批準(zhǔn)生效日期地址:電話:傳真:郵編:網(wǎng)絡(luò)程序設(shè)計考試大作業(yè)題目:聊天室程序班級:學(xué)號:姓名:成績:TOC\o"1-3"\h\u5519網(wǎng)絡(luò)程序設(shè)計考試大作業(yè) 1996一.所使用的背景知識、主要函數(shù)的描述 310731二.程序設(shè)計思想及程序設(shè)計流程框圖 315864三.主要代碼及代碼運行結(jié)果 491771.啟動服務(wù)器 4119782.登錄 6123273.注冊 10321774.登錄和注冊判定 12142455.進入聊天界面 1371056.私聊頁面 17一.所使用的背景知識、主要函數(shù)的描述背景:根據(jù)現(xiàn)在最流行的聊天工具QQ,模仿一部分主要功能來完成。主要函數(shù):publicclassServer;服務(wù)器的創(chuàng)建。publicclassClient;客戶端的創(chuàng)建。publicclassMainextendsJFrame;登錄界面的顯示。publicclassRegistextendsJDialog;注冊界面的顯示。publicclassUserInformation;用戶信息的保存和驗證。publicclassAllTalkFrameextendsJFrame;登錄后進入群聊界面。publicclassPointToPointTalkFrameextendsJFrame;私聊界面。二.程序設(shè)計思想及程序設(shè)計流程框圖設(shè)計思想:利用socket與serversocket在客戶端與客戶端之間的通信,InputStreamInputStreamReader輸入輸出流進行信息的發(fā)送與接收。程序設(shè)計流程:主頁面:輸入賬號與密碼,點擊登錄或者注冊進入下一頁面。登錄:判定是否正確,正確則進去聊天界面。注冊:進去注冊界面,成功則返回主頁面。進入聊天室:能發(fā)送信息讓在線的所有人看到。私聊界面:能與一個人單獨聊天,信息只能被雙方看到。主頁面主頁面注冊登錄注冊登錄進入聊天室進入聊天室點擊名字進入私聊點擊名字進入私聊三.主要代碼及代碼運行結(jié)果1.啟動服務(wù)器代碼:publicclassServer{ ServerSocketserver; staticintclientNum=0; //存放與服務(wù)器連接上的對應(yīng)的Socket,作用是保存服務(wù)器與客戶端之間的流,便于服務(wù)器給每個客戶端進行回發(fā)消息 List<Socket>clientConnection=newArrayList<Socket>(); publicServer(){ try{ server=newServerSocket(9999); System.out.println("服務(wù)器已經(jīng)啟動"); }catch(IOExceptione){ e.printStackTrace(); System.out.println("服務(wù)器啟動失敗"); } } //內(nèi)部類,監(jiān)聽客戶端是否有連接到服務(wù)器,并將此客戶端的Socket傳遞給HandleSocket進行處理,同時將client存放到List中,即clientConnection中 classSocketListenerimplementsRunnable{ publicvoidrun(){ Socketclient; try{ while(true){ client=server.accept(); //連接上一個就壓入List中,即clientConnection中 clientConnection.add(client); HandleSockeths=newHandleSocket(client); //連接上就讓HandleSocket去處理 newThread(hs).start(); } }catch(IOExceptione){ System.out.println("客戶連接服務(wù)器失敗"); } } } //內(nèi)部類處理一個Socket,接收一個Client發(fā)送過來的消息,并且服務(wù)器原封不動的返回給所有客戶端,客戶端對消息進行過濾 classHandleSocketimplementsRunnable{ Socketclient; HandleSocket(Socketclient){ this.client=client; } publicvoidrun(){ try{ clientNum++; //啟用輸入流 InputStreamis=client.getInputStream(); InputStreamReaderisr=newInputStreamReader(is); BufferedReaderbr=newBufferedReader(isr); System.out.println("第"+clientNum+"個客戶端連接進入服務(wù)器"); booleanflag=true; Strings; do{ //對用戶發(fā)來的消息進行群發(fā)給客戶端 s=br.readLine(); System.out.println("接受到一個客戶端消息:"+s); for(inti=0;i<clientConnection.size();i++){ Socketclient=clientConnection.get(i); OutputStreamos=client.getOutputStream(); PrintStreamps=newPrintStream(os); ps.println(s); } }while(flag); client.close(); }catch(IOExceptione){ System.out.println("有一個客戶斷開與服務(wù)器的連接"); } } }界面:登錄代碼:packagecom.qq.main;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPasswordField;importjavax.swing.JTextField;importcom.qq.regist.Regist;importcom.qq.regist.UserInformation;/***主界面*/publicclassMainextendsJFrame{ //組件的內(nèi)容 privateJLabeluserId; privateJLabeluserPassword; privateJTextFieldinputId; privateJPasswordFieldinputPassword; privateJButtonbtLogin; privateJButtonbtRegist; Main(){ userId=newJLabel("帳號"); userPassword=newJLabel("密碼"); inputId=newJTextField(6); inputPassword=newJPasswordField(); btLogin=newJButton("登陸"); btRegist=newJButton("注冊"); //設(shè)置窗體屬性 Toolkittk=Toolkit.getDefaultToolkit(); DimensionscreenSize=tk.getScreenSize();//得到當(dāng)前屏幕的長和寬 intx=(int)screenSize.getWidth(); inty=(int)screenSize.getHeight(); this.setBounds((x-240)/2,(y-600)/2,240,600);//窗口顯示的大小,位置 this.setResizable(false);//窗口大小不能改變 this.setLayout(null);//默認的格式 this.setBackground(Color.BLACK);//窗口的顏色 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序 //設(shè)置JLabel屬性 userId.setBounds(30,160,40,20); userPassword.setBounds(30,200,40,20); //設(shè)置文本域?qū)傩? inputId.setBounds(90,160,100,20); inputPassword.setBounds(90,200,100,20); inputPassword.setEchoChar('*');//用*顯示代替你輸入的密碼 //設(shè)置JButton屬性 btLogin.setBounds(50,240,60,20); btRegist.setBounds(120,240,60,20); //注冊“登陸”按鈕監(jiān)聽器 btLogin.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ UserInformationuser=newUserInformation(); StringuserName=inputId.getText(); StringuserPassword=newString(inputPassword.getPassword()); if(userName.equals("")){ JOptionPane.showMessageDialog(null,"用戶名不能為空"); }elseif("".equals(userPassword)){ JOptionPane.showMessageDialog(null,"密碼不能為空"); }elseif(user.isExist(userName) &&user.userInfomation.getProperty(userName).equals( userPassword)){ newAllTalkFrame(userName).setVisible(true);//判斷成功后new一個群聊窗口 Main.this.dispose(); }else{ JOptionPane.showMessageDialog(null,"此用戶名不存在或者密碼不正確"); } } }); //注冊“注冊”按鈕監(jiān)聽器 btRegist.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ newRegist();//注冊頁面 } }); this.add(userId); this.add(userPassword); this.add(inputId); this.add(inputPassword); this.add(btLogin); this.add(btRegist); this.setVisible(true); } publicstaticvoidmain(String[]args){ newMain(); }}界面:注冊 代碼: //注冊“提交”按鈕的監(jiān)聽器 btSubmit.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ StringuserName=inputId.getText(); StringuserPassword=newString(inputPassword.getPassword()); StringuserPasswordConfirm=newString(inputPasswordConfirm .getPassword()); System.out.println("您點擊了提交按鈕"); if(userName.equals("")){ JOptionPane.showMessageDialog(null,"用戶名不能為空"); }elseif("".equals(userPassword) ||"".equals(userPasswordConfirm)){ JOptionPane.showMessageDialog(null,"密碼和密碼重復(fù)都不能為空"); }elseif(!userPassword.equals(userPasswordConfirm)){ JOptionPane.showMessageDialog(null,"密碼和密碼重復(fù)不一致"); }else{ UserInformationuser=newUserInformation(); if(user.isExist(userName)){ JOptionPane.showMessageDialog(null,"此用戶名已存在"); }else{ JOptionPane.showMessageDialog(null,"注冊成功"); user.insert(userName,userPassword);//UserInformation類 Regist.this.dispose(); } } } }); //注冊“取消”按鈕的監(jiān)聽器 btCancel.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ System.out.println("您點擊了取消按鈕"); Regist.this.dispose(); } });界面:登錄和注冊判定代碼: //注冊一個用戶 publicvoidinsert(StringuserName,StringuserPassword){ try{ userInfomation=newProperties(); InputStreamis; OutputStreamos; is=newFileInputStream("c:/userIperties"); os=newFileOutputStream("c:/userIperties",true); userInfomation.load(is); //將用戶名和密碼存儲到內(nèi)存中 userInfomation.setProperty(userName,userPassword); //將用戶名和密碼保存到文件中 userInfomation.store(os,null); }catch(FileNotFoundExceptione1){ System.out.println("文件userIperties沒有找到"); }catch(IOExceptione){ System.out.println("寫userIperties出錯"); } } //判斷此用戶名是否存在 publicbooleanisExist(StringuserName){ try{ userInfomation=newProperties(); InputStreamis; is=newFileInputStream("c:/userIperties"); userInfomation.load(is); if(userInfomation.containsKey(userName)){ returntrue; } }catch(FileNotFoundExceptione1){ System.out.println("文件userIperties沒有找到"); }catch(IOExceptione){ System.out.println("寫userIperties出錯"); } returnfalse; }進入聊天界面代碼:classshowOldMessageThreadimplementsRunnable{ publicvoidrun(){ booleanflag=true; while(flag){ try{ //接收群聊服務(wù)器端回發(fā)過來的消息 StringserverOutput=client.br.readLine()+"\r\n"; if(!serverOutput.startsWith("私聊") &&!serverOutput.startsWith("*") &&!(serverOutput.substring(serverOutput .indexOf(":")+1).equals("\r\n"))){ Strings1=serverOutput.replace('說',''); Strings=s1.replaceAll("?","\r\n"); oldMessageTextArea.append(s); } //添加客戶端的用戶在線列表 if(!serverOutput.startsWith("*") &&!serverOutput.startsWith("私聊") &&(serverOutput.indexOf("說")!=-1)){ StringlistName=serverOutput.substring(0, serverOutput.indexOf('說')); //如果JList中有相同名字的用戶,則不添加,否則添加 if(!users.contains(listName)){ System.out.println("用戶"+listName+"上線了"); users.add(listName); userList.setListData(users); } } //判斷服務(wù)器回發(fā)過來的消息是不是以"私聊"開頭的,是的話就提取出這兩個用戶名 if(serverOutput.startsWith("私聊")){ StringsiliaoName1=serverOutput.substring( serverOutput.indexOf("*")+1,serverOutput .indexOf("和")); StringsiliaoName2=serverOutput.substring( serverOutput.indexOf("和")+1,serverOutput .indexOf("\r")); StringsiliaoBenshen=""; StringsiliaoDuixiangName=""; if(siliaoName1.equals(clientName)){ siliaoBenshen=siliaoName1; siliaoDuixiangName=siliaoName2; }else{ siliaoBenshen=siliaoName2; siliaoDuixiangName=siliaoName1; } //判斷這兩個名字中是否有與自己同名的,有的話就彈出個私聊窗口 if(siliaoName1.equals(clientName) ||siliaoName2.equals(clientName)){ newPointToPointTalkFrame(siliaoBenshen+"和" +siliaoDuixiangName).setVisible(true); } } }catch(IOExceptione1){ System.out.println("讀取服務(wù)器端消息出錯"); } } } } //注冊JList的點擊事件,進入私聊界面 userList.addMouseListener(newMouseAdapter(){ publicvoidmouseClicked(MouseEvente){ if(e.getClickCount()==2){ if(AllTalkFrame.this.userList.getSelectedValue() .toString().equals(clientName)){ JOptionPane.showMessageDialog(null,"不能和自己聊天"); }else{ StringPToPMemberName="私聊" +"*" +clientName +"和" +AllTalkFrame.this.userList.getSelectedValue() .toString(); client.ps.println(PToPMemberName); } } } });界面:私聊頁面代碼: //線程:只要服務(wù)器端有消息,就將消息顯示到oldMessageTextArea classshowOldMessageThreadimplementsRunnable{ publicvoidrun(){ booleanflag=true; while(flag){ try{ //接收服務(wù)器端回發(fā)過來的消息 StringserverOutput=client.br.readLine()+"\r\n"; System.out.println("私聊服務(wù)器發(fā)過來的消息:"+serverOutput); //將消息中的兩個用

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論