網絡編程
計算機網路
- 所謂計算機網絡,就是把分佈在不同區域的計算機與專門的外部設備用通信線路相互連接成一個規模大,而且功能強的網絡系統,從而使得計算機之間可以相互傳遞信息,共享數據、軟件等資源
- 所謂的網絡編程,指的就是在同一個網絡中不同機器之間的通信
IP地址
- IP地址的是互聯網地址(Internet Protocol Address),是聯網設備與互聯網之間的唯一標識,在同一個網段中,IP地址是唯一的
- IP地址是數字型的,是一個32位的整數,通過將其分成4個8位的二進制數,每8位之間用圓點隔開,每個8位整數可以轉換爲一個0~255的十進制整數
- 分爲IPV4和IPV6
- IP地址分類
A類:保留給政府結構,1.0.01~126.255.255.254
B類:分配給中型企業,127.0.0.1~191.255.255.254
C類:分配給任何需要的個人,192.0.0.1~223.255.255.254
D類:用於組播,224.0.0.1~239.255.255.254
E類:用於實驗,240.0.0.1~255.255.255.254
端口
- 數據的發送和接收都需要通過端口出入計算機,端口號用於唯一標識通信實體上進行網絡通訊的程序,同一臺機器上不能兩個程序佔用同一個端口
- 端口號的取值範圍:0~65535
- 端口分類:
- 公認端口:0~1023
- 註冊端口:1025~49151
- 動態或私有端口:1024~65535
- 常用端口:
- mysql:3306
- oracle:1521
- tomcat:8080
通信協議
- 需要通信的設備之間需要實現相同的通信協議
- 網絡分層:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層
- 通信協議分類:
- 傳輸層協議:TCP和UDP
- 網絡層IP協議:IPV4和IPv6,互聯網協議
- 應用層協議:HTTP
相關類的使用
InetAddress類
package waking.test.wl;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo01 {
public static void main(String[] args) {
InetAddress ia = null;
try {
ia = InetAddress.getLocalHost();
System.out.println(ia);
String hostName = ia.getHostName();
System.out.println(hostName);
String hostAddress = ia.getHostAddress();
System.out.println(hostAddress);
ia = InetAddress.getByName("www.baidu.com");
System.out.println(ia);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
URLEncoder類和URLDecoder類
package waking.test.wl;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Demo02 {
public static void main(String[] args) {
try {
String encode = URLEncoder.encode("waking","GBK");
System.out.println(encode);
String decode = URLDecoder.decode(encode,"utf-8");
System.out.println(decode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
TCP網絡通信
- TCP,Transmission Control Protocol,傳輸控制協議,基於字節流的傳輸層通信協議
- 特點:
安全的
面向鏈接的
傳輸數據無限制,一旦連接建立,雙方可以按統一的格式傳輸大的數據
客戶端向服務端發送一個請求
服務端收到請求後,回客戶端一個響應
客戶端向收到服務端的響應後,回服務端一個確認信息
socket模型
代碼實現
package waking.test.wl;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Demo03 {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket so = new Socket("127.0.0.1", 9099);
OutputStream os = so.getOutputStream();
String name = "waking";
os.write(name.getBytes(), 0, name.length());
os.flush();
so.close();
}
}
package waking.test.wl;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo030 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9099);
Socket accept = ss.accept();
InputStream is = accept.getInputStream();
byte[] b = new byte[1024];
int read = is.read(b);
System.out.println(new String(b, 0, read));
ss.close();
}
}
package waking.test.wl;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Demo04 {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket so = new Socket("127.0.0.1", 9009);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("E://timg.jpg")));
BufferedOutputStream bos = new BufferedOutputStream( so.getOutputStream());
byte[] b = new byte[1024];
int len = -1;
while((len=bis.read(b))!=-1) {
bos.write(b, 0, len);
}
bos.close();
bis.close();
so.close();
}
}
package waking.test.wl;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo040 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9009);
Socket accept = ss.accept();
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("E://a.jpg")));
byte[] b = new byte[1024];
int len = -1;
while((len=bis.read(b))!=-1) {
bos.write(b, 0, len);
}
bos.close();
bis.close();
accept.close();
ss.close();
}
}
UDP通信
- 這裏簡單介紹
- User Datagram Protocol的簡稱,用戶數據包協議,提供面向事物的簡單不可靠信息傳送服務
特點:
不安全
無連接
效率高
UDP傳輸數據時是有大小限制的,每個被傳輸的數據報必須限制在64kb之內