java运用网络编程技术代码_Java 网络编程
java網絡編程
1、什么叫計算機網絡?
由不同地理位置的不同計算機主機,連接起來組成的網絡。
2、什么叫網絡編程?
在網絡的基礎上,使用網絡進行編程,對應用層進行設計的活動。
3、網絡編程三要素:IP地址、端口、通訊協議
IP地址
1、在計算機網絡中某個計算機的唯一標識
2、在計算機網絡中,現在命名IP地址的規定是IPv4協議,該協議規定每個IP地址由4個0-255之間的數字組成(也就是32位),一共有2^32個,超過40億。IP地址是一個32位的二進制數,通常被分割為4個“8位二進制數”(也就是4個字節)。IP地址通常用“點分十進制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進制整數。
3、由于IP地址不好記憶,所以有了域名,一個域名對應一個ip,但一個IP可以對應很多域名。類似于一個人可以有很多微信,但一個微信只對應一個人。
4、IPv6是下一版本的互聯網協議,也可以說是下一代互聯網的協議,它的提出最初是因為隨著互聯網的迅速發展,IPv4定義的有限地址空間將被耗盡,而地址空間的不足必將妨礙互聯網的進一步發展。為了擴大地址空間,擬通過IPv6以重新定義地址空間。IPv4采用32位地址長度,只有大約43億個地址,而IPv6采用128位地址長度,幾乎可以不受限制地提供地址。
5、IP地址編址方式:A、B、C、D、E五類地址
(1)A類地址是指:IP地址的四段地址中只有第一段為網絡號碼,其余三段為計算機本地號碼。
A類IP地址 地址范圍1.0.0.1到127.255.255.254
二進制表示為:00000001 00000000 00000000 00000001 - 01111111 11111111 11111111 11111110。最后一個是廣播地址。(最高位必須是0),子網掩碼:255.0.0.0
(2)B類地址是指:在IP地址的四段號碼中,前兩段號碼為網絡號碼。
B類IP地址地址范圍128.0.0.1-191.255.255.254
二進制表示為:10000000 00000000 00000000 00000001----10111111 11111111 11111111 11111110。 最后一個是廣播地址。(最高位必須是10),B類IP地址的子網掩碼為255.255.0.0。
(3)C類地址是指:在IP地址的四段號碼中,前三段號碼為網絡號碼,剩下的一段號碼為本地計算機的號碼。
C類IP地址范圍192.0.0.1-223.255.255.254
二進制表示為: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110。(最高位必須是110)
C類IP地址的子網掩碼為255.255.255.0
(4)D類IP地址在歷史上被叫做多播地址(multicast address),即組播地址。
多播地址的最高位必須是“1110”,范圍從224.0.0.0到239.255.255.255。
(5)IP地址中凡是以“11110”開頭的E類IP地址都保留用于將來和實驗使用
(6)特殊IP:
0.0.0.0 對應當前主機
255.255.255.255對應當前子網的廣播地址
127.0.0.1到127.255.255.255用于回路測試,127.0.0.1對應本機IP地址
端口
1、是一個數字,用來標記電腦里的某個進程。
2、使用兩個字節表示端口,0-65535,意味著計算機中同時運行的進程最多有65536個
當一個程序運行時,需要一個端口號,運行結束后,端口號被收回
3、作用:一個計算機上可以并發運行多個網絡程序,而不會在互相之間產生干擾。一個進程在網絡中進行通訊時,先通過IP地址找到電腦,然后通過端口找到對應進程。
4、程序運行時可以指定端口號,也可以隨機分配。0-1024是系統需要的端口號
通訊協議
1、通訊雙方在信息交互時,對信息的封裝和解析的規則,就稱為協議
2、訊協議又稱通信規程,是指通信雙方對數據傳送控制的一種約定。約定中包括對數據格式,同步方式,傳送速度,傳送步驟,檢糾錯方式以及控制字符定義等問題做出統一規定,通信雙方必須共同遵守,它也叫做鏈路控制規程。
3、應用層:http協議、https協議、FTP協議
傳輸層:UDP協議、TCP協議
網絡層:IP協議
物理層:底層硬件設備、數據的完整和校驗
網絡的幾種結構
1、客戶端/服務器結構,也叫做Client/Server結構,簡稱C/S結構(需要三次握手)
2、瀏覽器/服務器結構,也叫做Browser/Server結構,簡稱為B/S結構
3、P2P結構
java中的網絡編程技術
1、java 為我們提供了一個InetAddress類,該類的功能是代表一個IP地址,并且將IP地址和域名相關的操作方法包含在該類的內部。
2、獲取方式:
getByName(String host):根據主機名稱獲取當前類型對象
getByAddress(byte[] arr):根據ip地址的字節數組獲取當前類型對象
getAllByName(String host):根據主機名稱獲取的所有當前類型對象的數組
getLocalHost():獲取當前主機的當前類型對象
3、對象的常用方法:
getHostName():獲取主機名稱
getAddress():獲取ip地址的字節數組
toString():同時獲取主機名稱和ip地址的字符串表示
4、代碼示例
importjava.net.InetAddress;importjava.util.Arrays;public classTest1 {public static void main(String[] args) throwsException {//獲取主機名稱的IP地址
InetAddress ip1 = InetAddress.getByName("www.baidu.com");
System.out.println(ip1);
String s1=ip1.getHostName();//獲取主機名
byte[] b1 = ip1.getAddress();//獲取原始地址
System.out.println(s1+"..."+Arrays.toString(b1));
System.out.println("---------------------------------");//根據ip地址的字節數組獲取當前類型對象
byte[] b2 = {61,-121,-87,125};
InetAddress ip2=InetAddress.getByAddress(b2);
System.out.println(ip2);
System.out.println("---------------------------------");//根據本地回環地址獲取當前類型對象
byte[] b3 = {127, 0, 0, 1};
InetAddress ip3=InetAddress.getByAddress(b3);
System.out.println(ip3);
System.out.println(ip3.getHostName()+ "..." +Arrays.toString(ip3.getAddress()));
System.out.println("---------------------------------");//獲取本機當前類型對象
InetAddress ip4 =InetAddress.getLocalHost();
System.out.println(ip4);
System.out.println(ip4.getHostName()+ "..." +Arrays.toString(ip4.getAddress()));
}
}
UDP協議和TCP協議
1、都是傳輸層協議,端到端協議。
2、區別:
UDP協議面向無連接,像發短信,寄信,先發送的消息未必先到達,不安全,效率高,只區分發送端和接收端,而不區分客戶端和服務端
TCP協議面向連接,像打電話,先發送的消息一定是先到,安全,效率低,區分客戶端和服務端。在連接的時候,會有三次握手的動作。
3、Socket? 兩臺計算機的通訊點,類似于碼頭、郵局。。。
Socket:也稱為套接字,套接字編程:網絡編程、通信點編程(端到端編程)
不同的協議中,使用的Socket對象各不相同:UDP協議中,使用的是DatagramSocket;在TCP協議中,客戶端使用的是Socket、服務端使用的ServerSocket和Socket
UDP的編程實現
1、使用的Socket是DatagramSocket
2、構造方法
DatagramSocket():不指定端口號,創建通信點,端口號隨機分配,一般用于發送端
DatagramSocket(int port):指定端口號,創建通信點,一般用于接收端
3、成員方法
send(DatagramPacket dp):將一個dp數據報包發送
receive(DatagramPacket dp):將數據接收到dp參數中
4、DatagramPacket介紹:
1、表示一個數據報數據的封裝對象的類型
2、構造方法:
DatagramPacket(byte[]?buf, int?offset, int?length, InetAddress?address, int?port)
buf:要發送的數據的字節數組
offset:從數組的哪個位置開始發送
length:發送多少數據
address:發送到哪個ip
port:發送到哪個程序
3、常用成員方法:
getData():返回該數據包中的字節數組
getLength():返回該數據包中接收到的字節個數
5、UDP編程步驟
發送端:
1、準備通訊點對象
2、準備要發送的包裹對象
3、調用通訊點的發送方法
接受端:
1、準備通訊點對象
2、準備接收端的接收容器
3、調用接收方法
4、解析收到的數據
importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.util.Scanner;public classSend {public static void main(String[] args) throwsException {
String host= "127.0.0.1";//創建發送端
DatagramSocket ds = newDatagramSocket();//要發送的數據
Scanner sc = newScanner(System.in);while(true) {//循環發送時要注意socket兩邊步驟要保持一致
System.out.println("要發送的內容:");byte[] buf =sc.nextLine().getBytes();//目標地
InetAddress address =InetAddress.getByName(host);//創建包
DatagramPacket dp = new DatagramPacket(buf, 0, buf.length,address, 9999);
ds.send(dp);
System.out.println("是否繼續?1是,0否");if("1".equals(sc.nextLine())) {continue;
}else break;
}
sc.close();
ds.close();//注意關閉資源
}
}
發送端
importjava.net.DatagramPacket;importjava.net.DatagramSocket;public classReceive {public static void main(String[] args) throwsException {
DatagramSocket ds= new DatagramSocket(9999);//接收端要指定端口號
while(true) {byte[] buf = new byte[1024];//創建接收容器
DatagramPacket dp = newDatagramPacket(buf, buf.length);
ds.receive(dp);//調用接收方法
byte[] data =dp.getData();int len =dp.getLength();
System.out.println(new String(data,0,len));//解析內容
}
}
}
接收端
TCP的編程實現
1、使用的通訊點就是Socket類型
2、客戶端和服務端獲取Socket對象的區別:
1、客戶端使用Socket的構造方法,創建一個Socket對象
2、服務端不能使用自己創建的方式,而是使用服務端一個特殊的對象ServerSocket,接收客戶端發來的請求,生成一個為這個客戶端服務的Socket對象
3、構造方法:
Socket(InetAddress ip, int port):建立一個通信點,專門用于和ip主機的port程序進行通信。
只要這個對象創建成功了,就說明這個連接已經建立起來了,就說明當前的客戶端已經聯系上服務端了,已經獲取了服務端返回的響應。
在創建對象的過程,就是在請求和服務端連接的過程。
4、服務端獲取Socket對象的方式:
1、啟動一個服務程序,類型是ServerSocket,可以接收客戶端發來的連接請求,一旦接收到請求,就可以創建一個和當前客戶端交互的Socket對象
2、ServerSocket的構造方法
ServerSocket(int port):創建一個服務端Socket對象,等待訪問port端口的客戶端(監聽此端口)
3、accept():接收一個客戶端發來的請求,返回一個服務此客戶端的Socket對象
5、獲取客戶端和服務端的連接
1、兩個方法:
InputStream ?getInputStream():獲取Socket對象的網絡輸入流
OutputStream ?getOutputStream():獲取Socket對象的網絡輸出流
2、一旦獲取了輸入輸出流,就可以通過I\O的方式,來操作網絡數據的傳輸。
3、對應關系:
客戶端的網絡輸入流,對應服務端的網絡輸出流
客戶端的網絡輸出流,對應服務端的網絡輸入流
6、TCP編程步驟
客戶端:
1、創建Socket對象,建立和服務端的連接
2、獲取網絡輸入流和輸出流
3、通過I/O的操作進行數據的傳輸
服務器端:
1、創建ServerSocket對象,開啟服務器,監聽端口
2、調用accept方法,接收客戶端請求,返回Socket對象
3、獲取網絡輸入流和輸出流
4、通過I/O的操作進行數據的傳輸
importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintStream;importjava.net.InetAddress;importjava.net.Socket;importjava.util.Scanner;public classTCPClient {public static void main(String[] args) throwsException {//String s = "10.10.92.184";
InetAddress s =InetAddress.getLocalHost();int port = 9999;while(true) {//注意,客戶端和服務器端要保證流程一致//創建客戶端通訊點
Socket socket = newSocket(s,port);
OutputStream os=socket.getOutputStream();//使用打印流進行包裝
PrintStream ps = newPrintStream(os);//獲得網絡輸入流
Scanner sc = newScanner(System.in);
ps.println(sc.nextLine());//獲得網絡輸出流
InputStream is =socket.getInputStream();//使用轉換流進行包裝
InputStreamReader isr = newInputStreamReader(is);//使用高效緩沖流進行包裝
BufferedReader br = newBufferedReader(isr);
System.out.println(br.readLine());
}
}
}
加強版客戶端
importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classServer {public static void main(String[] args) throwsException {//創建服務器端ServerSocket對象,監聽9999端口,接受客戶端的請求
ServerSocket ss = new ServerSocket(9999);//創建線程池,避免浪費資源
ExecutorService es = Executors.newFixedThreadPool(10);while(true) {//接受客戶端的請求
Socket s = ss.accept();//阻塞式方法//使用匿名內部類方法創建多線程,使服務器可以和多個客戶端通訊
Runnable r = newRunnable() {public voidrun() {try{//獲得輸入流
InputStream is =s.getInputStream();//轉換流包裝
InputStreamReader isr = newInputStreamReader(is);//高效緩沖流包裝
BufferedReader br = newBufferedReader(isr);
System.out.println(s.getLocalAddress()+"..."+s.getPort()+"..."+br.readLine());//獲得輸出流
OutputStream os =s.getOutputStream();//打印流包裝
PrintStream ps = newPrintStream(os);
ps.println("收到");
}catch(Exception e) {
e.printStackTrace();
}
}
};
es.submit(r);//加入線程池
}
}
}
加強版服務器
7、TCP編程加強
1、讓客戶端也接收數據,服務端也發送數據
2、讓字節流進行加強,轉成字符流,加強成緩沖字符流
3、讓服務端多線程,同時可以處理多個用戶的請求
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的java运用网络编程技术代码_Java 网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 命令读取参数_如何读取/处理命
- 下一篇: java反射效率对比_Java反射三种方