1. 程式人生 > >javaAPI_網絡編程基礎_網絡編程基礎1

javaAPI_網絡編程基礎_網絡編程基礎1

osi pen 接收數據 地理位置 ethos 進制 break 對象 1.0


網絡編程基礎

1.網絡編程概述

(1).計算機網絡
是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件
及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。

(2).網絡編程
就是用來實現網絡互連的不同計算機上運行的程序間可以進行數據交換。


2.網絡模型概述以及圖解

(1).計算機網絡之間以何種規則進行通信,就是網絡模型研究問題.

(2).網絡模型一般是指
OSI(Open System Interconnection開放系統互連)參考模型
TCP/IP參考模型

(3).圖解

3.網絡編程三要素

(1).IP地址:
網絡中計算機的唯一標識。
計算機只能識別二進制的數據,所以我們的IP地址應該是一個二進制的數據。
但是呢,我們配置的IP地址確不是二進制的,為什麽呢?
IP:192.168.1.100
換算:11000000 10101000 00000001 01100100
假如真是:11000000 10101000 00000001 01100100的話。
我們如果每次再上課的時候要配置該IP地址,記憶起來就比較的麻煩。
所以,為了方便表示IP地址,我們就把IP地址的每一個字節上的數據換算成十進制,然後用.分開來表示:
"點分十進制"
IP地址的組成:網絡號段+主機號段
A類:第一號段為網絡號段+後三段的主機號段
一個網絡號:256*256*256 = 16777216
B類:前二號段為網絡號段+後二段的主機號段
一個網絡號:256*256 = 65536
C類:前三號段為網絡號段+後一段的主機號段
一個網絡號:256
IP地址的分類:
A類 1.0.0.1---127.255.255.254 (1)10.X.X.X是私有地址(私有地址就是在互聯網上不使用,而被用在局域網絡中的地址) (2)127.X.X.X是保留地址,用做循環測試用的。
B類 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C類 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D類 224.0.0.1---239.255.255.254
E類 240.0.0.1---247.255.255.254

兩個DOS命令:
ipconfig 查看本機ip地址
ping 後面跟ip地址。測試本機與指定的ip地址間的通信是否有問題

特殊的IP地址:
127.0.0.1 回環地址(表示本機)
x.x.x.255 廣播地址
x.x.x.0 網絡地址

(2).端口號:
正在運行的程序的標識。
有效端口:0~65535,其中0~1024系統使用或保留端口。

(3).協議:

通信的規則
UDP:
把數據打包
數據有限制
不建立連接
速度快
不可靠
TCP:
建立連接通道
數據無限制
速度慢
可靠

舉例:
UDP:發短信
TCP:打電話


4.Socket套接字

(1).概述
網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字


(2).Socket套接字原理機制
A:通信的兩端都有Socket。
B:網絡通信其實就是Socket間的通信。
C:數據在兩個Socket間通過IO傳輸

(3).Socket通信原理圖


5.UDP協議發送接收數據[DatagramSocket]

(1).實現步驟:

A:創建發送端Socket對象
B:創建數據,並把數據打包
C:調用Socket對象的發送方法發送數據包
D:釋放資源

(2).使用UDP發送數據
public static void main(String[] args) throws IOException {
// 創建發送端Socket對象
// DatagramSocket()
DatagramSocket ds = new DatagramSocket();

// 創建數據,並把數據打包
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 創建數據
byte[] bys = "hello,udp,我來了".getBytes();
// 長度
int length = bys.length;
// IP地址對象
InetAddress address = InetAddress.getByName("192.168.12.92");
// 端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);

// 調用Socket對象的發送方法發送數據包
// public void send(DatagramPacket p)
ds.send(dp);

// 釋放資源
ds.close();
}

(3).使用UDP接收數據步驟
A:創建接收端Socket對象
B:創建一個數據包(接收容器)
C:調用Socket對象的接收方法接收數據
D:解析數據包,並顯示在控制臺
E:釋放資源


(4).UDP協議接收數據包
public static void main(String[] args) throws IOException {
// 創建接收端Socket對象
// DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086);

// 創建一個數據包(接收容器)
// DatagramPacket(byte[] buf, int length)
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);

// 調用Socket對象的接收方法接收數據
// public void receive(DatagramPacket p)
ds.receive(dp); // 阻塞式

// 解析數據包,並顯示在控制臺
// 獲取對方的ip
// public InetAddress getAddress()
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
// public byte[] getData():獲取數據緩沖區
// public int getLength():獲取數據的實際長度
byte[] bys2 = dp.getData();
int len = dp.getLength();
String s = new String(bys2, 0, len);
System.out.println(ip + "傳遞的數據是:" + s);

// 釋放資源
ds.close();
}

(5).UDP發送和接收數據圖解


(6).優化發送接收程序

//發送數據
public static void main(String[] args) throws IOException {
// 創建發送端的Socket對象
DatagramSocket ds = new DatagramSocket();

// 創建數據並打包
byte[] bys = "helloworld".getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("192.168.12.92"), 12345);

// 發送數據
ds.send(dp);

// 釋放資源
ds.close();
}

//接收數據
public static void main(String[] args) throws IOException {
// 創建接收端的Socket對象
DatagramSocket ds = new DatagramSocket(12345);

// 創建一個包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);

// 接收數據
ds.receive(dp);

// 解析數據
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("from " + ip + " data is : " + s);

// 釋放資源
ds.close();
}

6.UDP協議使用練習

(1).從鍵盤錄入數據進行發送,如果輸入的是886那麽客戶端就結束輸入數據。
//接收端
public static void main(String[] args) throws IOException {
// 創建接收端的Socket對象
DatagramSocket ds = new DatagramSocket(12345);

while (true) {
// 創建一個包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);

// 接收數據
ds.receive(dp);

// 解析數據
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("from " + ip + " data is : " + s);
}

// 釋放資源
// 接收端應該一直開著等待接收數據,是不需要關閉
// ds.close();
}

//發送端
public static void main(String[] args) throws IOException {
// 創建發送端的Socket對象
DatagramSocket ds = new DatagramSocket();

// 封裝鍵盤錄入數據
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}

// 創建數據並打包
byte[] bys = line.getBytes();
// 單個機器接收數據
// DatagramPacket dp = new DatagramPacket(bys, bys.length,
// InetAddress.getByName("192.168.12.92"), 12345);
// 使用官博地址,所有人都可以收到
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("192.168.12.255"), 12345);

// 發送數據
ds.send(dp);
}

// 釋放資源
ds.close();
}

(2).改進版1:多線程實現聊天程序

//接收端
public class ReceiveThread implements Runnable {

//構造方法接收參數
private DatagramSocket ds;

public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
}

@Override
public void run() {
try {
while (true) {
// 創建一個包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);

// 接收數據
ds.receive(dp);

// 解析數據
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("from " + ip + " data is : " + s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

//發送端
public class SendThread implements Runnable {

//構造方法接收參數
private DatagramSocket ds;

public SendThread(DatagramSocket ds) {
this.ds = ds;
}

@Override
public void run() {
try {
// 封裝鍵盤錄入數據
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}

// 創建數據並打包
byte[] bys = line.getBytes();
// DatagramPacket dp = new DatagramPacket(bys, bys.length,
// InetAddress.getByName("192.168.12.92"), 12345);
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("192.168.12.255"), 12306);

// 發送數據
ds.send(dp);
}

// 釋放資源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//主線程類
public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReceive = new DatagramSocket(12306);

SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReceive);

Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);

t1.start();
t2.start();
}
}

(2).最終版:多線程實現聊天程序
//代碼省略

javaAPI_網絡編程基礎_網絡編程基礎1