1. 程式人生 > >使用JAVA寫的一個簡易通訊程式(一)

使用JAVA寫的一個簡易通訊程式(一)

好記性不如賴筆頭…………

兩種常見的網路傳輸模型:

一、OSI模型分層

專業人員一般不說每一層的名稱二是說第幾層,這是等價的,層的位次得記清楚。
7)應用層——為終端使用者提供應用程式服務。
6)表示層——為應用提供資料的表示形式。例如表示層告訴應用層哪兒有加密或它是否為一張.jpg圖片。
5)會話層——在使用者間管理會話。
4)傳輸層——在源定義資料段並編號,傳送資料,並在目的地重組資料。增加(源、目的)程序號。
3)網路層——為能通過在其他網路上的中間裝置進行端到端的傳送建立和編址包。增加(源、目的)邏輯網路地址。
2)資料鏈路層——為在區域網上主機到主機或廣域網的裝置間的傳送建立和編址幀。增加(源、目的)實體地址。
1)物理層——在裝置間傳送位元資料。物理層協議定義介質規範。定時和同步位。

二、TCP/IP模型分層

注意,不管是什麼模型,低層是物理層,頂層是內容層

4)應用層——為使用者表示應用資料。

3)傳輸層——支援裝置間的通訊和執行錯誤糾正。

2)網際層——確定通過網路的最佳路徑。

1)網路介面層——控制網路的硬體裝置和介質。

網路傳輸需要知道:地址、埠、協議

----------------------------------------------------------客戶端程式碼----------------------------------------------------------

package com.Ckinghan.socket;

import
java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPClient { public static void
main(String[] args) { /** * 啟動簡易UDP通訊的客戶端程式 */ udpClient(); } /** * @描述:簡易UDP通訊的客戶端程式 * @建立時間: */ public static void udpClient(){ //建立DategramSocket物件 DatagramSocket datagramSocket = null; //建立輸入流,從控制檯讀取資料 BufferedReader bufferedReader = null; //設定伺服器地址字串 String ip = "192.168.0.178"; //設定IP資訊 InetAddress inetAddress; try { //例項化inteAddress inetAddress = InetAddress.getByName(ip); //例項化datagramSocket datagramSocket = new DatagramSocket(); //從控制檯讀取資料(預設的字元編碼為GBK) bufferedReader = new BufferedReader(new InputStreamReader(System.in,"GBK")); //建立使用者傳送的資訊 String sendString = null; //迴圈等待使用者輸入資訊 while (true) { //讀取使用者的輸入的資訊 sendString = bufferedReader.readLine().trim(); //將要傳送的資訊轉換為位元組陣列 byte[] sendBytes = sendString.getBytes("UTF-8"); //建立並例項化datagramPacket,指定要傳送的資料、傳送的資料長度、伺服器IP地址、通訊埠 DatagramPacket datagramPacket = new DatagramPacket(sendBytes, sendBytes.length, inetAddress, 10000); //向伺服器傳送資料 datagramSocket.send(datagramPacket); //如果使用者輸入的是close,則退出聊天客戶端 if("close".equals(sendString)) break; } } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { //關閉流 if(datagramSocket != null){ datagramSocket.close(); } //關閉流 if(bufferedReader != null){ try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ----------------------------------------------------------服務端程式碼---------------------------------------------------------- package com.Ckinghan.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UDPServer { public static void main(String[] args) { /** * 啟動簡易UDP通訊的服務端程式 */ socketServer(); } /** * @描述:簡易UDP通訊的服務端程式 * @建立時間: */ public static void socketServer(){ DatagramSocket datagramSocket = null; try { //例項化DategramSocket datagramSocket = new DatagramSocket(10000); //接收資料的byte[]資料 byte[] getDate = new byte[1024]; //用以接收使用者儲存的資料 DatagramPacket datagramPacket = new DatagramPacket(getDate, getDate.length); //迴圈監聽客戶端傳送的資訊 while (true) { //將使用者傳送的資料,放到dategramPacket中 datagramSocket.receive(datagramPacket); //獲取接收到的資料位元組長度 int len = datagramPacket.getLength(); //獲取接收到的資料 byte[] date = datagramPacket.getData(); //獲取請求來源 InetAddress inetAddress = datagramPacket.getAddress(); //將接收到的位元組轉換為字元(將使用者傳送的資訊還原) String receive = new String(date, 0, len,"UTF-8"); //如果輸入字元為close,則提示使用者已退出迴圈 if("close".equals(receive)){ System.out.println(inetAddress.getHostAddress()+"的使用者已退出會話!"); // break; } //輸出使用者傳送的資訊 System.out.println(inetAddress.getHostAddress()+" :"+receive); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { //如果dategramSocket被例項化了,關閉流 if(datagramSocket != null){ datagramSocket.close(); } } } }

執行效果:

這裡寫圖片描述

這裡寫圖片描述