使用JAVA寫的一個簡易通訊程式(一)
阿新 • • 發佈:2019-01-30
好記性不如賴筆頭…………
兩種常見的網路傳輸模型:
一、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();
}
}
}
}
執行效果: