歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 網絡編程

Java 網絡編程

日期:2017/3/1 9:28:24   编辑:Linux編程

一:OSI模型

Open System Interconnection 開放系統互聯

二:TCP/IP分層模型

TCP代表傳輸控制協議:Transfer Control Protocol 允許兩個程序之前進行可靠的通訊

UDP代表用戶報文協議:User Datagram Protocol 允許兩個程序之前進行不可靠的通訊

三 客戶端 和 服務器

四:套接字

定義:Socket(套接字)是一種抽象層,應用程序通過它來發送和接收數據

五:InetAddress類代表IP地址,沒有構造器但是有多個方法,查詢API文檔。

六:TCP套接字編程

服務器:

–1.利用ServerSocket建立對服務端某個端口的監聽。

如:ServerSocket server = new ServerSocket(8000);

–2.利用accept方法創建服務端Socket

如:Socket socket = server.accept()

–3.利用已建立的socket創建輸入輸出流

如:BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));

–4.關閉輸入輸出流,關閉socket,關閉server

如: br.close();

pw.close();

socket.close();

 1 package inetAddress;
 2 
 3 /**
 4  * 服務器
 5  */
 6 import java.io.BufferedReader;
 7 import java.io.BufferedWriter;
 8 import java.io.InputStreamReader;
 9 import java.io.OutputStreamWriter;
10 import java.net.ServerSocket;
11 import java.net.Socket;
12 
13 public class ServerTest {
14 
15     public static void main(String[] args) throws Exception {
16         // 1創建ServerSocket對象指定端口號
17         ServerSocket server = new ServerSocket(30001);
18         server.setSoTimeout(10000);
19         // 2等待客戶連接 accept 返回類型Socket
20         Socket socket = server.accept();
21         // 3從客戶端讀數據 socket.getInputStream()
22         BufferedReader reader = new BufferedReader(new InputStreamReader(
23                 socket.getInputStream()));
24         char[] ch = new char[100];
25         int len = reader.read(ch);
26         System.out.println("從客戶端接收到的消息:");
27         System.out.println(new String(ch, 0, len));
28         // 3向客戶端寫數據 socket.getOutputStream()
29         BufferedWriter write = new BufferedWriter(new OutputStreamWriter(
30                 socket.getOutputStream()));
31         write.write("我們已經接收到消息了");
32         write.flush();
33         // 4 釋放資源
34         reader.close();
35         socket.close();
36         write.close();
37 
38     }
39 
40 }

客戶端:

–1.創建客戶端Socket向服務器發起連接請求

如:Socket socket = new Socket (“127.0.0.1”, 8000);

–2..利用已建立的socket創建輸入輸出流

如:BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream()));

–3.關閉輸入輸出流,關閉socket,關閉server

如: br.close();

pw.close();

socket.close();

 1 package inetAddress;
 2 
 3 /**
 4  * 客戶端
 5  */
 6 import java.io.BufferedReader;
 7 import java.io.BufferedWriter;
 8 import java.io.InputStreamReader;
 9 import java.io.OutputStreamWriter;
10 import java.net.Socket;
11 
12 public class Cliebt {
13 
14     public static void main(String[] args) throws Exception {
15         // 1 創建Socket對象 主機 端口
16         Socket socket = new Socket("127.0.0.1", 30001);
17         // 2向服務器寫入數據 .getOutputStream()
18         BufferedWriter write = new BufferedWriter(new OutputStreamWriter(
19                 socket.getOutputStream()));
20         write.write("你好服務器");
21         write.flush();
22         // 2讀出數據 .getInputStream()
23         BufferedReader reader = new BufferedReader(new InputStreamReader(
24                 socket.getInputStream()));
25         char[] ch = new char[100];
26         int len = reader.read(ch);
27         System.out.println("數據");
28         System.out.println(new String(ch, 0, len));
29         // 3 釋放資源
30         reader.close();
31         write.close();
32         socket.close();
33     }
34 
35 }

七:UDP套接字編程

用戶報文協議(UDP)是用於將二進制數據從一台計算機發送到另一台計算的非連接協議。 數據被稱為數據報包,它包含了數據將要發送到的目標服務器和端口號。 DatagramSocket類的send()和receive()方法都帶有一個DatagramPacket參數。
 1 package chap18UDP;
 2 
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 
 7 /**
 8  * 發送
 9  * 
10  * @author acer
11  *
12  */
13 public class Sender {
14 
15     public static void main(String[] args) throws IOException {
16         // * 1創建DatagramSocket對象
17         DatagramSocket scoket = new DatagramSocket(3000);
18         // *2 創建DatagramPacket對象
19         byte[] buffer = "你好".getBytes();
20         int port = 30001;
21         DatagramPacket packet = new DatagramPacket(buffer, buffer.length,
22                 scoket.getInetAddress().getLocalHost(), port);
23         // 3 使用send
24         scoket.send(packet);
25         System.out.println("正在發送消息");
26         // 釋放資源
27         scoket.close();
28 
29     }
30 
31 } 
接收數據報包需要執行如下步驟: 1. 創建一個足夠大的字節數組,用於存儲要接收的包的數據。 2. 使用該字節數組實例化一個DatagramPacket對象。 3. DatagramSocket被實例化,它被指定該套接字要綁定到的本地主機上的一個端口。 4. 調用DatagramSocket類的receive()方法,將DatagramPacket對象傳入該方法。這將導致執行線程阻塞,直到接收到一個數據報包或者發生了超時
 1 package chap18UDP;
 2 
 3 import java.net.DatagramPacket;
 4 import java.net.DatagramSocket;
 5 
 6 /**
 7  * 接收
 8  * 
 9  * @author acer
10  *
11  */
12 public class Reciver {
13 
14     public static void main(String[] args) throws Exception {
15         // 創建字節數組
16         byte[] buffer = new byte[1024];
17         // 2 創建DatagramPacket對象
18         DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
19         // 3 創建DatagramSocket對象
20         DatagramSocket socket = new DatagramSocket(30001);
21         // 4 使用receive方法
22         socket.receive(packet);
23         System.out.println("正在接收從" + packet.getSocketAddress() + "的信息");
24         System.out.println(new String(packet.getData()));
25         // 釋放資源
26         socket.close();
27 
28     }
29 
30 }
p發送數據報包需要執行如下步驟: •1. 創建一個足夠大的字節數組,用於存儲要發送的包數據,用該數據填充數組。 •2. 創建一個新的DatagramPacket 對象,用於存儲上面的字節數組,以及服務器名和接收者的端口號。 •3. DatagramSocket被實例化,它被指定套接字要綁定到本地主機的哪個端口。 •4. DatagramSocket類的send()方法被調用,傳入DatagramPacket對象。

Copyright © Linux教程網 All Rights Reserved