【正文】
實驗三是在老師給的框架之上,對聊天程序進行擴展,功能的擴充,我們首先花費一定的時間研究程序的基本框架,之后對客戶端部分進行了更多友好界面的填充設(shè)計,好友上線,用戶屬性信息等等功能的添加,相應(yīng)的服務(wù)器部分也添加了一部分信息的處理。 實驗二為 ping 命令的擴展,我們在老師提供的 ping 命令模板之下,做了一些功能的擴接收到的圖片,文件緩存地 成功接收 53 展 。 ,信息修改需要與數(shù)據(jù)庫進行連接, 可以采用 Office的 Access數(shù)據(jù)庫,建立用戶信息表,記錄用戶的愛好,性別和年齡,建立好友關(guān)系表,記錄用戶之間的好友關(guān)系以及備注姓名。 stop()。 temp = ((/) + 1)。 counto++。 } else if (([SHAVE])) { (恭喜您,成功添加好友,現(xiàn)在你們可以對話了 )。 (())。 String type = (0, ( ))。 ///substring從消息中提取發(fā)送者,接受者,消息 32 listener = (0, ( ))。 ()。)。 } // 列出所有的好友 if (isfirend) { rset = stmt .executeQuery(select Bfirend,remark from firend where Afirend = 39。 stmt = ()。 } } catch (SQLException e) { // TODO Autogenerated catch block ()。,39。,39。 AND Bfirend = 39。 con = (jdbc:odbc:mychatdb, 29 , )。 AND Bfirend = 39。 String remark = (( ) + 1)。 + username + 39。 } else if ((s)) { (update user set sex = 39。 try { Connection con。 39。 if (()) { (this, [SUCCESS])。 27 try { Connection con。 socket = null。 break。 //接收 (listener,msg)。 } else if (([FILE])) { // 發(fā)送文件 String temp = (6)。 while (isrunning) { if ((msg = ()) != null) { if (([LOGIN])) { username = (7)。 getMsgFrom_ Dialog()如果是文字信息 [msg]直接發(fā)送給服務(wù)器 ,如果是 [FILE]文件,利用 socket2 將信息文件名發(fā)送服務(wù)器; getMsgFrom_connect()獲取服務(wù)器地址,端口號,用戶名以及密碼;如果是 [CON]注冊信息,向服務(wù)器發(fā)送 [CON]+L +用戶名 +密碼,如果是 [REG]登錄信息,向服務(wù)器發(fā)送 [CON]+R +用戶名 +密碼, ClientMsgSender extends Thread {} ClientMsgListener extends Thread{} 19 ClientMsgSender extends Thread {} 客戶端發(fā)送信息 到服務(wù)器 具體流程圖如下圖所示 客戶端信息發(fā)送流程圖 3. ClientMsgListener extends Thread 接收來自服務(wù)器的信息 20 開 始用 B u f f e r R e a d e r I n p u t S t r e a m R e a d e r( S . g e t I n p u t S t r e a m ( ) ) 實 例 化 數(shù) 據(jù)流R u n n i n g ?R e a d e r . C l o s e ( )N結(jié) 束M s g = r e a d e r . r e a d l i n e不 為 空Y信 息 頭 部 關(guān) 鍵字 為 [ M S G ]Y提 取 s e n d e r , l i s t e n e r , 內(nèi)容 調(diào) 用 s t o r e M s g 發(fā) 送 到 顯示 對 話 框Y N信 息 頭 部 關(guān) 鍵字 為 [ F I L E ]提 取 s e n d e r , l i s t e n e r , 內(nèi) 容 調(diào)用 S t o r e M s g 發(fā) 送 到 顯 示 框 , 調(diào)用 g e t f i l e 接 受 , 緩 存 文 件Y信 息 頭 部 關(guān) 鍵字 為 [ S U C C E S S ]N設(shè) 置 連 接 狀 態(tài) 為 t r u e ,修 改 數(shù) 據(jù) 庫 登 陸 成 功Y信 息 頭 部 關(guān) 鍵字 為 [ F U S E R ]N顯 示 好 友 上 的 信 息Y信 息 頭 部 關(guān) 鍵字 為 [ N O U S E R ]N用 戶 不 存 在Y信 息 頭 部 關(guān) 鍵字 為 [ H A V I N G ]N顯 示 已 經(jīng) 為 好 友Y信 息 頭 部 關(guān) 鍵字 為 [ S H A V E ]N添 加 好 友 成 功Y信 息 頭 部 關(guān) 鍵字 為 [ U S E R ]N增 加 用 戶 列 表 刷 新Y信 息 頭 部 關(guān) 鍵字 為 [ F I L S ]N增 加 好 友 列 表 刷 新Y退 出N 客戶端接收信息流程圖 21 ClientFilesender()客戶端文件信息的發(fā)送 Class ClientFileListener()客戶端文件信息的接收 22 3)服務(wù)器端 MainSever() 初始化服務(wù)器套接口 server, server2,調(diào) accept()函數(shù)進行阻塞偵聽,如果有客戶端請求,建立連接 socket2 = ()。來顯示所有在線的用戶以及好友用戶信息。 printf( Set socket sndbuf. If not specified, it is selected to \n)。 printf( Set the IP Time to Live.\n\n)。 printf(w deadline\n)。 printf(b Allow pinging a broadcast address.\n\n)。 } 在 mainloop 函數(shù)中實現(xiàn) sndbufsize=ctrlsndbuf*84*1024。 //8 位生存時間 TTL =IPPROTO_ICMP。 命令設(shè)計:設(shè)置安靜模式 ctrlcode[10] 在 ipv4和 ipv6處理函數(shù)中 void proc_v4(char *ptr, ssize_t len, struct timeval *tvrecv) //ipv4處理函數(shù) { .......... if(ctrlcode[10]!=1)//不是安靜模式則輸出信息,否則不輸出 {printf(%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f ms\n, icmplen, sock_ntop_host(prsarecv, prsalen), icmpicmp_seq, ipip_ttl, rtt)。ctrlttl, sizeof(ctrlttl))。 //設(shè)置第一次發(fā)包數(shù)量 user=getpwuid(getuid())。 temppattern[patternlen]=39。 } 如果發(fā)包數(shù)達到了設(shè)置的發(fā)包數(shù),就會終止發(fā)包,達到控制發(fā)包數(shù)的目的 命令設(shè)計:設(shè)置 pattern ctrlcode[3]=1。接收發(fā)送端客戶的信息,將信息發(fā)給確定的接受者。另一部分由 SIGALARM信號每秒驅(qū)動一次。 實驗要求: ? Wireshark 軟件的安裝; ? Wireshark軟件的啟動,并設(shè)置網(wǎng)卡的狀態(tài)為混雜狀態(tài),使得 Wireshark 可以監(jiān)控局域網(wǎng)的狀態(tài); ? 啟動數(shù)據(jù)包的捕獲,跟蹤 PC 之間的報文,并存入文件以備重新查; ? 設(shè)置過濾器過濾網(wǎng)絡(luò)報文以檢測特定數(shù)據(jù)流; ? 對常用協(xié)議的數(shù)據(jù)包的報文格式進行分析,利用協(xié)議分析軟件的統(tǒng)計工具顯示網(wǎng)絡(luò)報文的各種統(tǒng)計信息 。 二 :實驗環(huán)境 4 ? window 7 系統(tǒng)的計算機 ? Linux 虛擬機 ? 路由器,調(diào)試解調(diào)器 ? Wireshark 抓包軟件 ? Eclipse java 開發(fā)環(huán)境 三 :程序的需求分析與邏輯框圖 實驗一 : 通過 Wireshark軟件,捕獲局域網(wǎng)中的數(shù)據(jù)包。 ,一個服務(wù)器可以連接多個客戶端。 如果 sendintercal 等于 ctrlinterval 即間隔的話,就發(fā)送包并置 0,否則就加 1. 實現(xiàn)控制時間間隔的目的。 temppattern[patternlen1]=39。 //icmp頭后邊的數(shù)據(jù)長度 } else{ err_proc(packet size must be = 8!)。 } 命令設(shè)計:設(shè)置 ttl ctrlcode[8]=1。 } 通過 waitinterval和 ctrldeadline進行時間的控制,當(dāng)?shù)竭_ deadline時,執(zhí)行 deadline子函數(shù) void deadline() { 14 printf(time out!\n)。 //16 位總長度(字節(jié)) =1。 ctrlsndbuf=atoi(optarg)。 printf( [I source] [S sndbuf] destination\n)。 printf( Stop after sending count ECHO_REQUEST packets.\n\n)。 printf(s packetsize\n)。 printf(I source\n)。 與上面的設(shè)置類似,之后又 增加了好友信息的顯示,用兩個字符數(shù)組 String templisto[], String templistf[]來存儲用戶的用戶屬性信息以及好友的用戶,備注姓名信息。建立連接,初始化套接口 sock = new Socket(serverAd, port)。 } try { reader = new BufferedReader(new InputStreamReader( ()))。 } else if (([UPDATE])) { msg_update(msg)。 String sender = (0, ( ))。 (this, msg)。 if (socket != null) ()。 temp = (( )+1)。 AND password =39。,1,39。 } } private void msg_update(String msg) { ///修改用戶的屬性信息 // TODO Autogenerated method stub String temp = (8)。 where username = 39。 } else if ((a)) { (update user set age = 39。 } catch (SQLException e) { // TODO Autogenerated catch block ()。 +