1. 程式人生 > >Java基礎--網絡編程

Java基礎--網絡編程

rac ktr mysq exc pre 三方 tmp string tac

1.網絡的概念

把多臺計算機通過物理線路連接起來,就形成了網絡。目的在於交換數據和共享信息。

2.網絡通信的三要素:

1】IP地址:唯一標識網絡上的每一臺計算機。兩臺計算機之間通信的必備有素

2】端口號:計算機中應用的標號(代表一個應用程序)

0-1024系統使用或保留端口

常見端口:http:80 stmp: 25 ftp:21

有效端口0-65536,開發者可以的端口是1025-65536之間。一些第三方引用如mysql:3306 oracle:1251。

3】通信協議:通信的規則 TCP,UDP

3.網絡通信模型

技術分享圖片

4.InetAdress

InetAddress 表示IP地址。

 1 public class Test01 {
 2     public static void main(String[] args) {
 3         // 獲取本機IP地址
 4         InetAddress ip1;
 5         try {
 6             ip1 = InetAddress.getLocalHost();
 7             // USER-20180113BT/192.168.2.56
 8             System.out.println(ip1.toString());
 9             
10
// 獲取主機名稱 11 System.out.println(ip1.getHostName()); 12 System.out.println(ip1.getHostAddress()); 13 14 } catch (UnknownHostException e) { 15 e.printStackTrace(); 16 } 17 } 18 }

5.TCP編程

TCP編程中,如果要完成通信,通信雙方必須要創建socket,通過socket完成通信。

TCP通信步驟

[1] 服務器啟動ServerSocket作為通信的Server端,等待客戶端鏈入。

[2] 客戶端創建Socket作為通信的Client端

[3] Client端鏈入Server端後建立可靠的雙向的持續性的點對點的通訊連接,即可通信。

案例:完成一次單向通信

服務器端

 1 package cn.sxt01.net01;
 2 
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 public class Server01 {
 9     public static void main(String[] args) {
10         
11         System.out.println("服務器啟動...");
12         
13         // 【1】創建server socket
14         ServerSocket serverSocket = null;
15         Socket clientSocket = null;
16         try {
17         
18             serverSocket = new ServerSocket(8000);
19             // 【2】等待客戶端的鏈入->阻塞式函數->監聽8000端口,看是否有client鏈入
20             clientSocket = serverSocket.accept();
21             
22             System.out.println(clientSocket.getInetAddress().getHostAddress()+"鏈入!");
23         
24             // 【3】給客戶端主動發信息
25             OutputStream out = clientSocket.getOutputStream();
26             
27             String msg = "hello 兄弟";
28             byte[] buf = msg.getBytes("UTF-8");
29             out.write(buf);
30             clientSocket.shutdownOutput();
31             
32             out.close();
33             
34         
35         } catch (IOException e) {
36             e.printStackTrace();
37         }
38     }
39 }

客戶端

 1 package cn.sxt02.net01;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.Socket;
 6 
 7 public class Client01 {
 8     public static void main(String[] args) {
 9         System.out.println("客戶端運行...");
10         
11         // 【1】創建客戶端socket
12         Socket socket = null;
13         try {
14             socket = new Socket("192.168.2.56", 8000);
15             
16             // 【2】接收來自服務器的消息
17             InputStream in = socket.getInputStream();
18             byte[] buf = new byte[1024];
19             int len = in.read(buf);
20             
21             String msg = new String(buf, 0, len, "UTF-8");
22             System.out.println(msg);
23             
24         } catch (IOException e) {
25             e.printStackTrace();
26         }
27     }
28 }

6.常見問題

[1] 端口被占用

java.net.BindException: Address already in use: JVM_Bind

【2】服務器未啟動

java.net.ConnectException: Connection refused: connect

【3】連接超時異常 SocketTimeoutException

當網速很慢時,可能發生連接超時異常。

Java基礎--網絡編程