西安郵電大學Socket網(wǎng)絡(luò)編程實驗報告_第1頁
西安郵電大學Socket網(wǎng)絡(luò)編程實驗報告_第2頁
西安郵電大學Socket網(wǎng)絡(luò)編程實驗報告_第3頁
西安郵電大學Socket網(wǎng)絡(luò)編程實驗報告_第4頁
西安郵電大學Socket網(wǎng)絡(luò)編程實驗報告_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《高級Internet》實驗報告題目:Socket網(wǎng)絡(luò)編程王文浪西安郵電大學計算機學院2015年4月27日實驗?zāi)康氖煜ocket網(wǎng)絡(luò)編程熟悉CS客戶機模式熟悉ServerSocket編寫服務(wù)端熟悉使用多線程機制處理業(yè)務(wù)了解客戶機之間通信方式實驗內(nèi)容及要求采用CS模式,通過客戶機向服務(wù)器端發(fā)送消息;采用Socket來實現(xiàn)客戶機之間的網(wǎng)絡(luò)通信;通過ServerSocket創(chuàng)建服務(wù)端來處理接受客戶機請求;通過多線程方式來處理客戶機之間的通信請求;實現(xiàn)通信的界面窗口;實驗內(nèi)容有發(fā)送私聊消息、向選中用戶發(fā)送文件、用戶接受文件。實驗過程確定編程語言,架構(gòu)方式,實及通信的協(xié)議編程語言:Java;結(jié)構(gòu)方式:CS客戶機模式;通信協(xié)議:在過程中為每一條通信的信息設(shè)定一個type參數(shù),標志著通信的類型;1:向選中用戶發(fā)送私信; 0: 上下線更新-1:下線請求 2:請求發(fā)送文件3:確定接收文件創(chuàng)建工程項目SuperInternet_Client(客戶機)SuperInternet_Server(服務(wù)器端)項目客戶機目錄結(jié)構(gòu):項目的服務(wù)器端目錄結(jié)構(gòu):創(chuàng)建登錄界面ChatLogin.java1)(客戶機)實現(xiàn)的核心代碼://監(jiān)聽登錄按鈕事件(登錄時從配置文件中讀取用戶的配置信息)btnLoginButton//監(jiān)聽登錄按鈕事件(登錄時從配置文件中讀取用戶的配置信息)btnLoginButton.addActionListener(newActionListener(){ @OverridepublicvoidactionPerformed(ActionEvente){//讀取配置文件PropertiesuserProperties=newProperties();Filefile=newFile("Uperties");//加載配置文件的信息LoadPropertiesUtil.loadPro(userProperties,file);//獲得輸入用戶名Stringuname=textField.getText().toString();if(file.length()!=0){//在配置文件中是以鍵值對的方式存放用戶的信息,用戶名(key)=密碼值(value)if(userProperties.containsKey(uname)){//配置文件中包含該用戶//獲取密碼框輸入的用戶名Stringupass=newString(passwordField.getPassword());//判斷用戶密碼是否正確if(upass.equals(userProperties.getProperty(uname))){//創(chuàng)建網(wǎng)絡(luò)連接并顯示聊天窗口System.out.println("連接成功!!");try{//創(chuàng)建本地網(wǎng)絡(luò)連接,端口為8080Socketclient=newSocket("",8080);//將登錄按鈕設(shè)置為不可編輯btnLoginButton.setEnabled(false);//登錄成功,打開聊天窗口ChatRoomchatroom=newChatRoom(uname,client);chatroom.setVisible(true);//顯示聊天窗口setVisible(false);//隱藏登錄窗口}catch(UnknownHostExceptione1){e1.printStackTrace();ErrorInfoShowUtil.errorTip("連接服務(wù)器失敗,請重新登錄!",contentPanel);}catch(IOExceptione1){e1.printStackTrace();ErrorInfoShowUtil.errorTip("連接服務(wù)器失敗,請重新登錄!",contentPanel);}}else{lblPrompt.setText("您輸入的密碼錯誤!");...后續(xù)省略}});創(chuàng)建登錄界面中調(diào)用的工具類讀取配置文件工具類(LoadPropertiesUtil),實現(xiàn)的核心代碼:publicpublicclassLoadPropertiesUtil{/***加載配置文件的信息*@paramproperties*@paramfile*/publicstaticvoidloadPro(Propertiesproperties,F(xiàn)ilefile){//文件不存在,創(chuàng)建該文件if(!file.exists()){try{file.createNewFile();}catch(IOExceptione){e.printStackTrace();System.out.println("創(chuàng)建配置文件失敗,請檢查!");}}//加載配置文件的信息try{properties.load(newFileInputStream(file));}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}錯誤信息窗口工具類(ErrorInfoShowUtil.java),實現(xiàn)核心代碼:/**/***顯示錯誤連接錯誤提示框*@authorXiyouJackielin**/publicclassErrorInfoShowUtil{publicstaticvoiderrorTip(StringerrorInfo,JPanelcontentPanel){JOptionPane.showMessageDialog(contentPanel,errorInfo,"ErrorMessage",JOptionPane.ERROR_MESSAGE);}}編寫服務(wù)器端ChatServer.java,接收客戶機的請求連接,并返回當前在線人數(shù):服務(wù)器端中的靜態(tài)區(qū)初始化監(jiān)聽連接端口及在線人數(shù)集合變量/**/***服務(wù)器端,將聽客戶端請求并處理請求*@authorXiyouJackielin**/publicclassChatServer{//創(chuàng)建服務(wù)器端的socketprivatestaticServerSocketserverSocket;//創(chuàng)建集合存放在線的用戶privatestaticHashMap<String,ClientBean>onlines;//創(chuàng)建靜態(tài)塊區(qū),初始化相應(yīng)的數(shù)據(jù),只要創(chuàng)建一次static{try{serverSocket=newServerSocket(8080);onlines=newHashMap<String,ClientBean>();}catch(IOExceptione){e.printStackTrace();}} ......//后續(xù)代碼省略(開啟線程)}④ChatRegister.java(注冊頁面),實現(xiàn)核心代碼:1)用戶輸入注冊的信息,首先先在配置文件中尋找是否有相同的用戶名,如果存在相同的用戶名,則提示用戶名已經(jīng)重復,重新輸入;2)驗證用戶輸入的信息,如果兩次密碼輸入不一致,則提示密碼錯誤;3)用戶輸入注冊信息驗證通過后,打開配置文件Uperties,將注冊信息保存至配置文件中;@Override@OverridepublicvoidactionPerformed(ActionEvente){PropertiesuserProperties=newProperties();Filefile=newFile("Uperties");LoadPropertiesUtil.loadPro(userProperties,file);Stringuname=textField.getText().toString();Stringupass=newString(passwordField.getPassword());StringconfirmPass=newString(confirmpasswordField.getPassword());//判斷配置文件中是否存在該用戶if(uname.length()!=0){if(userProperties.containsKey("uname")){lblPrompt.setText("該用戶名已經(jīng)存在!");.....//后續(xù)省略}編寫保存用戶注冊信息方法,核心實現(xiàn)代碼:privateprivatevoidsaveUserinfo(PropertiesuserProperties,F(xiàn)ilefile,Stringuname,Stringupass,StringconfirmPass){if(upass.equals(confirmPass)){if(upass.length()!=0){//以uname為鍵,以upass為值,保存到配置文件中userProperties.setProperty(uname,upass);try{//將userProperties中的屬性列表(鍵和值)方式寫入輸出流userProperties.store(newFileOutputStream(file),"Copyright(c)XiyouJackielin");}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace(); }//注冊完之后將注冊按鈕設(shè)置為不可操作btnRegisterButton.setEnabled(false);//返回登錄界面ChatLoginframe=newChatLogin();frame.setVisible(true);setVisible(false);......//后續(xù)代碼省略編寫聊天窗口(ChatRoom.java)實現(xiàn)客戶機之間的聊天功能在聊天窗口中編寫子線程類并開啟,用于接收服務(wù)器返回的信息并顯示出來;0:更新在線用戶列表casecase0:{//更新列表onlines.clear();//從服務(wù)器讀取到當前的在線用戶HashSet<String>clients=chatBean.getClients();Iterator<String>it=clients.iterator();while(it.hasNext()){Stringele=it.next();if(uname.equals(ele)){onlines.add(ele+"(我)");}else{onlines.add(ele);} }//這里通過渲染器渲染用戶列表abstractListModel=newOnlinesUserListModel(onlines);list.setModel(abstractListModel); ......//后續(xù)代碼省略-1:戶下線;在客戶機用戶下線直接return結(jié)束當前窗口;1:私信casecase1:{//私聊Stringinfo=chatBean.getCurrentTime()+""+chatBean.getName()+"對"+chatBean.getClients()+"說:\r\n";//如果信息中包含我的名字,則將其換成昵稱'我'if(info.contains(uname)){info=info.replace(uname,"我");}acpMessage.play();textArea.append(info+chatBean.getInfo()+"\r\n");textArea.selectAll();break;}2:向用戶發(fā)送文件;思路:由于向用戶發(fā)送文件需要接受方法確定是否接收,故采用子線程的方式處理請求過程,并向服務(wù)器發(fā)送相應(yīng)的結(jié)果;3:確定接收文件信息;思路:發(fā)送方向接收方發(fā)出發(fā)送文件請求后,接收方答應(yīng)接收或拒收文件,響應(yīng)信息由服務(wù)器轉(zhuǎn)發(fā)到發(fā)送方,對相應(yīng)的信息作出相應(yīng)的操作。4:拒接接收文件的信息;打印出接收方拒絕接收文件的信息;服務(wù)器端響應(yīng)處理業(yè)務(wù)0:更新上下線核心代碼//創(chuàng)建服務(wù)器端的封裝信息類ChatBean,并將響應(yīng)的信息發(fā)送給客戶機ChatBeanserverUplineBean=newChatBean();serverUplineBean.setType(0);//處理的是0:上下線更新//設(shè)置服務(wù)器端返回信息(通知所有用戶xx上線了)serverUplineBean.setInfo(chatBean.getCurrentTime()+""+chatBean.getName()+"上線了");//通知所有用戶有人上線HashSet<String>onlineUserSet=newHashSet<String>();//遍歷在線用戶onlines得到用戶名的Set集合Set<String>onlineUserName=newHashSet<String>();onlineUserName=onlines.keySet();//將用戶名添加到在線用戶集合中onlineUserSet.addAll(onlineUserName);//封裝服務(wù)器端的ChatBean類serverUplineBean.setClients(onlineUserSet);//調(diào)用發(fā)送給全部在線用戶方法sendAll(serverUplineBean);-1:處理用戶下線//設(shè)置下線顯示的消息ChatBeanserverDownlineBean=newChatBean();serverDownlineBean.setInfo(chatBean.getCurrentTime()+""+chatBean.getName()+""+"下線了");System.out.println(chatBean.getName());serverDownlineBean.setType(0);HashSet<String>onLineUserSet=newHashSet<String>();onLineUserSet.addAll(onlines.keySet());serverDownlineBean.setClients(onLineUserSet);//將下線消息告知所有在線的用戶sendAll(serverDownlineBean);return;//由于用戶是下線,這里返回結(jié)束服務(wù)器為該類創(chuàng)建的業(yè)務(wù)處理線程1:發(fā)送私信消息//創(chuàng)建服務(wù)器的ChatBean對象用于封裝自己返回給客戶機的消息ChatBeanserverMessageBean=newChatBean();serverMessageBean.setType(1);serverMessageBean.setClients(chatBean.getClients());//發(fā)送的用戶serverMessageBean.setInfo(chatBean.getInfo());serverMessageBean.setName(chatBean.getName());serverMessageBean.setCurrentTime(chatBean.getCurrentTime());//向指定的用戶發(fā)送消息sendMessage(serverMessageBean);break;2:接收文件請求//創(chuàng)建服務(wù)器的ChatBean對象用于封裝處理用戶發(fā)送文件的事務(wù)返回給客戶機處理的信息ChatBeanserverSendFileBean=newChatBean();Stringinfo=chatBean.getCurrentTime()+""+chatBean.getName()+"向您傳送文件,是否接收文件";serverSendFileBean.setType(2);serverSendFileBean.setClients(chatBean.getClients());//設(shè)置被選中的用戶serverSendFileBean.setFileName(chatBean.getFileName());//文件名稱serverSendFileBean.setSize(chatBean.getSize());//文件大小serverSendFileBean.setInfo(info);serverSendFileBean.setName(chatBean.getName());//文件的來源serverSendFileBean.setCurrentTime(chatBean.getCurrentTime());//設(shè)置發(fā)送的時間//向選中的用戶發(fā)送數(shù)據(jù)sendMessage(serverSendFileBean);break;3:確認接收文件信息//創(chuàng)建服務(wù)器的ChatBean用于封裝接收方反饋給發(fā)送方的信息ChatBeanconfirmReceiveFielInfo=newChatBean();confirmReceiveFielInfo.setType(3);confirmReceiveFielInfo.setClients(chatBean.getClients());//文件發(fā)送者confirmReceiveFielInfo.setSelectedTo(chatBean.getSelectedTo());//文件接收者confirmReceiveFielInfo.setFileName(chatBean.getFileName());//文件名稱confirmReceiveFielInfo.setIp(chatBean.getIp());//接收方的ip地址confirmReceiveFielInfo.setPort(chatBean.getPort());//接收方的端口confirmReceiveFielInfo.setName(chatBean.getName());//接收方的客戶名稱confirmReceiveFielInfo.setCurrentTime(chatBean.getCurrentTime()

溫馨提示

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

最新文檔

評論

0/150

提交評論