




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機網絡課程設計說明書題 目: 基于UDP協(xié)議網上聊天程序 學 院: 計算機科學與工程學院 專 業(yè): 信息安全 姓 名: 學 號: 1000360222 指導教師: 孫晉永 目錄1 協(xié)議介紹和使用說明31.1 協(xié)議內容31.2 關鍵技術41.2.1 服務器端Socket的實現(xiàn)41.2.2 通信的建立52 程序設計62.1系統(tǒng)結構62.2主程序設計72.2.1 服務器端程序72.2.2 客戶端程序72.3 各模塊設計8客戶端向服務器發(fā)送消息8客戶端之間發(fā)送消息82.4 界面設計82.4.1 聊天界面設計的方法82.4.2 界面的功能92.5 實現(xiàn)主要代碼92.6 程序調試及運行結果152.6.
2、1 調試前的準備152.6.2 程序調試過程162.6.3 程序運行結果163 課設體會17參考文獻181 協(xié)議介紹和使用說明1.1 協(xié)議內容本課程設計主要是基于UDP的并用Java實現(xiàn)的簡單的聊天程序。UDP 用戶數(shù)據(jù)報是在運輸層的端到端抽象的邏輯信道中傳送的。UDP 在傳送數(shù)據(jù)之前不需要先建立連接。對方的運輸層在收到 UDP 報文后,不需要給出任何確認。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 是一種最有效的工作方式。雖然UDP 用戶數(shù)據(jù)報只能提供不可靠的交付,但 UDP 在某些方面有其特殊的優(yōu)點,它有即時通信的功能。比如說,使用聊天程序聊天的時候,省去的了跟對方通信的時候的鏈
3、接的麻煩,直接進行通信。UDP 只在 IP 的數(shù)據(jù)報服務之上增加了很少一點的功能,即端口的功能和差錯檢測的功能。UDP 使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制。UDP 是面向報文的。UDP 沒有擁塞控制,很適合多媒體通信的要求。UDP 支持一對一、一對多、多對一和多對多的交互通信。發(fā)送方 UDP 對應用程序交下來的報文,在添加首部后就向下交付 IP 層。UDP 對應用層交下來的報文,既不合并,也不拆分,而是保留這些報文的邊界。應用層交給 UDP 多長的報文,UDP 就照樣發(fā)送,即一次發(fā)送一個報文。接收方 UDP 對 IP 層交上來的 UDP 用戶數(shù)據(jù)報,在去除首部后就原封不
4、動地交付上層的應用進程,一次交付一個完整的報文。 圖1.1UDP基本工作過程1.2 關鍵技術 服務器端Socket的實現(xiàn)Socket又稱作套接字,它是使用 標準Unix 文件描述符 (file descriptor) 和其它程序通訊的方式。使用send()和recv()讓你更好的控制數(shù)據(jù)傳輸。在Java 網絡編程中,socket相當于應用程序的港口碼頭;在計算機網絡中,套接字由ip地址和端口號組成,為進程之間通信提供地址。兩個主機進行通信實際上就是兩個主機中的應用進程互相通信,應用進程之間的通信又稱為端到端的通信。為應用進程之間的通信提供運輸服
5、務的是運輸層的運輸協(xié)議,運輸層需要有兩種不同的運輸協(xié)議,即面向連接的TCP和無連接的UDP。 在Java中,用于實現(xiàn)基于UDP的聊天程序,使用兩個重要的類(DatagramSocket類和DatagramPacket類)。DatagramSocket類表示用來發(fā)送和接收數(shù)據(jù)報包的套接字。數(shù)據(jù)報套接字是包投遞服務的發(fā)送或接收點。每個在數(shù)據(jù)報套接字上發(fā)送或接收的包都是單獨編址和路由的。從一臺機器發(fā)送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。 在DatagramSocket上總是啟用UDP廣播發(fā)送。為了接收廣播包,應該將 DatagramSocket綁定到通配符地址。在某些實現(xiàn)
6、中,將DatagramSocket綁定到一個更加具體的地址時廣播包也可以被接收。atagramPacket類表示數(shù)據(jù)報包。 數(shù)據(jù)報包用來實現(xiàn)無連接包投遞服務。每條報文僅根據(jù)該包中包含的信息從一臺機器路由到另一臺機器。從一臺機器發(fā)送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。服務程序工作在服務器的某個端口上,一旦啟動服務,它將在這個端口上監(jiān)聽,等待客戶程序發(fā)來請求,當有客戶連接到該端口,accept()方法就返回一個Socket對象,可以用該對象獲得一個輸入輸出流。服務器的套接字用服務器套接字類(ServerSocket)來建立。具體實現(xiàn)如下:(1)建立一
7、個服務者,端口為5000。(2)服務者永遠等待,一旦客戶送來正確的請求,連接至該端口,accept()方法就返回一個Socket對象。(3)用返回的Socket對象創(chuàng)建數(shù)據(jù)輸入流類的實例in。用返回的Socket對象創(chuàng)建數(shù)據(jù)輸出流的實例out。以上實例in和out是服務者用于從客戶接受輸入信息和向客戶程序發(fā)送信息所用。此外,還需要用方法readline()和println()讀取或輸出一行數(shù)據(jù)。(4)soc.close()關閉Socket。 圖1.2 基于UDP的SOCKET編程模型 通信的建立 在客戶端建立Socket對象,并進行異常處理,主機名和端口號與連接的服務器名和提供該服務的服務程序
8、的監(jiān)聽端口必須一致。建立連接后用Socket類提供的getInputStream()和getOutputStream()方法取得輸入輸出流。在服務器端,獲得的輸入流是客戶端的輸出流,而Socket獲得的輸出流是發(fā)向客戶端的輸入流,在客戶端也是這樣。獲得socket的輸入輸出流之后,為了便于讀寫操作,需要在這兩個流對象基礎上建立易于操作的數(shù)據(jù)流DateInputStream, DataOutputStream。然后對輸入輸出流進行讀寫操作。在通信結束時關閉socket,以斷開連接,釋放資源。先關閉對應的輸入輸出流,再關閉socket本身。2 程序設計2.1系統(tǒng)結構本系統(tǒng)采用一個服務器端和多個客戶
9、端的聊天方式來實現(xiàn)。結構圖如下所示:圖2.1服務器-客戶端結構圖2.2主程序設計 服務器端程序 服務器與客戶間通過套接口Socket連接。在java中使用套接口相當簡單,Java API為處理套接口的通信提供了一個類.Socket.,使得編寫網絡應用程序相對容易服務器采用多線程以滿足多用戶的請求,程序用vector向量數(shù)組存儲連接客戶變量,通過創(chuàng)建一個ServerSocket對象來監(jiān)聽來自客戶的連接請求,默認端口為6666,然后無限循環(huán)調用accept()方法接受客戶程序的連接。 客戶端程序 客戶端是一個Java Applet程序,客戶通過Socket 建立與服務器的連接。圖2.2主程序流程圖
10、 2.3 各模塊設計客戶端向服務器發(fā)送消息 服務器與客戶都通過構造DataInputStream, PrintStream來建立輸入輸出流,然后雙方通過該輸入輸出流來相互傳遞信息,一旦收到客戶方的連接請求,服務器accept()方法返回一個新建的Socket對象??蛻舳巳缓笙蚍掌靼l(fā)送消息, 客戶端之間發(fā)送消息 客戶間發(fā)送信息通過UDP協(xié)議來實現(xiàn),用戶登錄時通過類DatagramPacket和DatagramSocket創(chuàng)建UDP包括其本地接受端口以及發(fā)送端口,默認端口為new DatagramSocket()和nickNameField.getText(),通過向服務器發(fā)送消息,然后服務器廣
11、播消息,最好達到群聊的目的??蛻舳税l(fā)送消息(send(DatagramPacket)和接受消息(receive(DatagramPacket)。 2.4 界面設計2.4.1 聊天界面設計的方法在Frame布局容器中,添加一個顯示聊天的TextArea文本框(在上面),加入Panel面板,Panel面板中包括一個發(fā)送消息的TextField單行文本框,“聊天記錄”和“發(fā)送”兩個按鈕監(jiān)聽。 圖2.3聊天界面實現(xiàn)功能圖2.4.2 界面的功能 客戶端登陸界面 輸入服務器IP,接收端口,及用戶名。登陸服務器,與服務器建立連接,進入聊天界面??蛻舳肆奶旖缑?,進行聊天。并可查看聊天記錄。服務器界面,監(jiān)聽客戶
12、端連接狀況并可發(fā)送服務器消息。2.5 實現(xiàn)主要代碼客戶端代碼:package udp;import java.io.*;import java.awt.*;import java.awt.event.*;import .*;class Client implements ActionListener, Runnable private Frame frame,f1,f2;/聊天窗口和登陸窗口private Panel p1, p2,p3;private Button sendButton,b,c,d;private TextField serverIpField,sendField,recei
13、vePortField, nickNameField;private TextArea currentUserField;boolean isClient = false;private TextArea messageArea; /聊天記錄框private String serverIp;private int serverReceivePort = 6666; /服務器接收默認端口private DatagramSocket receiveSocket = null, sendSocket = null;private DatagramPacket receivePacket = null
14、, sendPacket = null; /客戶端登陸界面public void inputIP()/聊天記錄界面public void input()/客戶端聊天界面public void launchFrame() /啟動客戶端,完成登錄public void start() try sendSocket = new DatagramSocket();/ 客戶機發(fā)送端口sendMessage(nickNameField.getText() + ":"+ receivePortField.getText() + ":");/名字和接收端口new Thr
15、ead(this).start(); catch (Exception e) messageArea.append(e + "n");/客戶端發(fā)送消息public void sendMessage(String str) try ByteArrayOutputStream out = new ByteArrayOutputStream();/捕獲內存緩沖區(qū)的數(shù)據(jù),轉換成字節(jié)數(shù)組PrintStream pout = new PrintStream(out);/輸出字節(jié)pout.print(str);byte buf = out.toByteArray();sendPacket
16、 = new DatagramPacket(buf, buf.length, InetAddress.getByName(serverIp), serverReceivePort);/構造數(shù)據(jù)報包sendSocket.send(sendPacket);/發(fā)送數(shù)據(jù)報包buf = null; catch (Exception e) e.printStackTrace();messageArea.append("消息:" + str + " 發(fā)送失敗,你還沒有登錄,或已經掉線!n");/多線程,啟動接收信息public void run() receiveMe
17、ssage();/ 客戶機接收消息public void receiveMessage()try receiveSocket = new DatagramSocket(Integer.parseInt(receivePortField.getText();/ 客戶機接受端口while (true) byte buf = new byte200;receivePacket = new DatagramPacket(buf, buf.length);receiveSocket.receive(receivePacket);if (receivePacket.getLength() = 0) mes
18、sageArea.append("空消息" + "n");continue;ByteArrayInputStream bin = new ByteArrayInputStream(receivePacket.getData();/字節(jié)串變成輸入流BufferedReader read = new BufferedReader(new InputStreamReader(bin);/先把字節(jié)流轉換為字符流,然后放入緩沖區(qū)String str= read.readLine();messageArea.append(str);if(str.contains(&
19、quot;迎:/")messageArea.append("n");read.close();bin.close(); catch (Exception e) messageArea.append(e + "sendmessage errorn"); /事件響應處理public void actionPerformed(ActionEvent e) /程序主入口 public static void main(String args) Client client = new Client(); / client.input(); client.
20、inputIP(); 服務端端代碼:package udp;import java.io.*;import java.awt.*;import java.awt.event.*;import .*;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Iterator;public class Server implements ActionListener private Frame frame; / 主窗體private Label connectLabel, mess
21、ageLabel;private TextArea messageArea; / 消息框,顯示用戶登錄信息private TextField sendField; / 輸入聊天內容的文本框private Button sendButton; / 發(fā)送按鈕private DatagramSocket receiveSocket = null, sendSocket = null;private DatagramPacket receivePacket = null, sendPacket = null;private int serverReceivePort = 6666; / 服務器端的接收
22、端口private List<ClientMessage> clientList = new ArrayList<ClientMessage>(); / 保存連接的客戶端信息boolean isServer = true;/ 程序主入口public static void main(String args) Server server = new Server();server.launchFrame();server.start(); / 啟動服務器server.receiveMessage(); / 接收信息/ 服務端界面初始化public void launchF
23、rame() / 事件監(jiān)聽處理public void actionPerformed(ActionEvent e) / 啟動服務器public void start() try sendSocket = new DatagramSocket(6660);/ 服務器發(fā)送端口 catch (Exception e) messageArea.append(e + "n");/ 服務器接收消息public void receiveMessage()try receiveSocket = new DatagramSocket(serverReceivePort);/ 服務器接受端口w
24、hile (true) byte buf = new byte200;receivePacket = new DatagramPacket(buf, buf.length);receiveSocket.receive(receivePacket);int length = clientList.size();boolean have = false;ByteArrayInputStream bin = new ByteArrayInputStream(receivePacket.getData();BufferedReader read = new BufferedReader(new Inp
25、utStreamReader(bin);String str = read.readLine();for (int i = 0; i < length; i+) ClientMessage oldMsg = clientList.get(i);if (oldMsg.hasClient(receivePacket.getPort(),receivePacket.getAddress() have = true;break;/ 未存在此客戶端if (!have) ClientMessage newMsg = new ClientMessage(Integer.parseInt(str.spl
26、it(":")1.trim(),receivePacket.getPort(),receivePacket.getAddress();messageArea.append("用戶: " + str.split(":")0+ " 進入聊天室,其IP地址:"+ receivePacket.getAddress().getHostAddress()+ " 發(fā)送端口:" + newMsg.getSendPort() + " 接收端口:"+ newMsg.getReceivePort(
27、) + " 登錄時間:"+ new Date() + " n");clientList.add(newMsg);sendMessage("熱烈歡迎:" + str.split(":")0 + " IP:"+ receivePacket.getAddress().getHostAddress()+ " 加入聊天室!n"); else / 用戶已經存在sendMessage(str);read.close();bin.close(); catch (Exception e) /
28、/e.printStackTrace();messageArea.append(e + "sendmessage errorn");/ 服務器端發(fā)送消息給客戶端public void sendToClient() /服務器 廣播消息public void sendMessage(String str) ByteArrayOutputStream out = new ByteArrayOutputStream();PrintStream pout = new PrintStream(out);pout.print(str);byte buf = out.toByteArray
29、(); / 緩沖區(qū)int length = clientList.size();try / 轉發(fā)給每一個在線用戶for (int i = 0; i < length; i+) ClientMessage msg = clientList.get(i);sendPacket = new DatagramPacket(buf, buf.length,msg.getClientIp(), msg.getReceivePort();sendSocket.send(sendPacket); catch (IOException e) e.printStackTrace();buf = null;c
30、lass ClientMessage private int receivePort; / 客戶端的接收端口private int sendPort; / 客戶端的發(fā)送端口private InetAddress clientIp; / 客戶端的IPpublic ClientMessage(int receivePort, int sendPort, InetAddress clientIp) this.receivePort = receivePort;this.clientIp = clientIp;this.sendPort = sendPort;public int getReceive
31、Port() return receivePort;public InetAddress getClientIp() return clientIp;public int getSendPort() return sendPort;public boolean hasClient(int sendPort, InetAddress ip) if (ip.getHostAddress().equals(this.getClientIp().getHostAddress()&& sendPort = this.getSendPort() return true;return false;2.6 程序調試及運行結果2.6.1 調試前的準備安裝jdk并在計算機的環(huán)境變量中配置好java環(huán)境。使用的實驗環(huán)境是Windows 7,Eclipse SDK 版本:,。2.6.2 程序調試過程啟動eclipse,單機測試。首先在主機上運行服務器端程序,再在器上運行3個客戶端程序。然后進入到用戶的圖形用戶界面,輸入服務器的IP,進行連接,如果連接成功,則客戶端就可以通過與服務器端進行通信,然后服務器轉發(fā)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國三足式袋卸料離心機數(shù)據(jù)監(jiān)測研究報告
- 深度解析教育科技行業(yè)未來發(fā)展方向
- 教育機構如何利用游戲化平臺提高教學效果
- 企業(yè)培訓中多媒體技術的應用與創(chuàng)新-以智慧教室為例
- 新版培訓課件模板圖片
- 碧桂園張家港拓客內部培訓89
- 全民健身設施補短板工程實施方案在城市老舊小區(qū)健身設施改造中的應用研究
- 全球鈾礦資源市場前景與2025年核能產業(yè)綠色低碳發(fā)展戰(zhàn)略報告
- 公交優(yōu)先戰(zhàn)略在2025年城市交通擁堵治理中的可持續(xù)發(fā)展報告
- Carpetimycin-B-生命科學試劑-MCE
- 板式換熱器、半容積式換熱器換熱器面積計算表(自動計算)
- 直流屏檢修作業(yè)指導書
- 冷鐓機 質量要求技術條件
- 《全國統(tǒng)一安裝工程預算定額》工程量計算規(guī)則
- translated-NCCN臨床實踐指南:非小細胞肺癌(中文版2022.V5)
- GB/T 8312-2002茶咖啡堿測定
- 通信線路工程施工組織設計方案【實用文檔】doc
- 護士注冊健康體檢表下載【可直接打印版本】
- 預計財務報表編制及分析課件
- Q∕SY 1347-2010 石油化工蒸汽透平式壓縮機組節(jié)能監(jiān)測方法
- 西門子順序功能圖語言S7-Graph的應用
評論
0/150
提交評論