91.網絡編程java
(1)網絡模型編程
OSI模型:七層協議安全
TCP/IP模型:經常使用服務器
(2)網絡通訊三要素網絡
第一:ip地址socket
使用dos命令查看ip地址,ipconfig.net
ip最大值是233.255.255.255,可設置區間1.0.0.0-233.255.255.2553d
用dos命令查看主機是否互通的,ping 域名\ip地址server
迴環地址:127.0.0.1對象
第二 端口號,用於標識進程的邏輯地址,不一樣的進程端口不一樣
dos命令查看端口號,netstat-ano
第三,協議
常見的有兩種協議:
TCP和UDP協議
UDP:
將數據源和目的地封裝到數據包中,不須要創建鏈接。
每一個數據包的大小限制在64k。
由於不創建鏈接,因此安全性差,速度快。
TCP:
創建鏈接造成傳輸數據的通道,而後再傳輸數據,經過三次的握手。
安全性高,效率低。
(3)InetAdress類
單例模式(沒有構造器),不能直接new,根據靜態方法來返回該對象
getByName(String name)根據已知的給定的主機名肯定主機的IP地址
import java.net.InetAddress; import java.net.UnknownHostException; public class InetAdressDemo { public static void main(String[] args) throws UnknownHostException { //經過靜態方法返回InetAddress的對象 InetAddress localHost = InetAddress.getLocalHost(); //得到IP地址的字符串 String hostAddress = localHost.getHostAddress(); System.out.println("IP地址是"+hostAddress); //得到IP地址中的主機的名字 String hostName = localHost.getHostName(); System.out.println("主機名是"+hostName); //根據給定的主機名返回該對象 InetAddress byName = InetAddress.getByName("C64-20190318DQZ"); String hostAddress1 = byName.getHostAddress(); String hostName1 = byName.getHostName(); System.out.println("IP地址是"+hostAddress1); System.out.println("IP地址是"+hostName1); } }
(4)UDP通訊
分兩個部分
服務端步驟
第一步:建立socket服務對象(須要作關閉)
DatagramSocket(int port)
第二步:接收數據,用DataGrampacket表示數據包
DataGramPacket(byte[] buf,int length)
第三步:解析數據包
接收數據 receive(),程序到此阻塞有數據接收則繼續
得到客戶端的ip,getAdress();
得到數據 getData();
得到長度 getLength();
import java.net.*; public class UdpServer { public static void main(String[] args){ //服務器端步驟一,建立Socket服務對象(須要作關閉) DatagramSocket socket = null; try { socket=new DatagramSocket(10000); //步驟二,建立接收數據包 byte[] buf=new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); System.out.println("服務端開始啓動,等待客戶端發送內容"); //步驟三,解析數據 socket.receive(datagramPacket);//程序到此阻塞,有數據傳入繼續 //得到客戶端的ip InetAddress inetAddress = datagramPacket.getAddress(); //得到數據 byte[] data = datagramPacket.getData(); int length=datagramPacket.getLength(); String s=new String(data,0,length); System.out.println(inetAddress.getHostAddress()+"發送的內容是"+s+" 長度是"+length); } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } } } }
客戶端步驟:
第一步:建立DatagramSocket不用給端口(需關閉)
第二步:建立數據包
DatagramPacket(byte[] buf,int length,InetAddress address,int port)
第三步:發送數據包
send();
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpClient { public static void main(String[] args){ //服務器端步驟一,建立Socket服務對象(須要作關閉,不用給端口) DatagramSocket socket = null; try { socket=new DatagramSocket(); //步驟二,建立數據包 String s="愛我中華!"; byte[] buf=s.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000); //步驟三,發送數據包 socket.send(datagramPacket); } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } } } }
先運行服務端再運行客戶端,服務端就顯示出來了
拓展:
注意字符字節的轉換,從控制檯輸入的東西是以字節流方式存在的,讓程序實現從控制檯輸入數據接收
用BufferReader,不斷接收使用While(true)
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpServer { public static void main(String[] args){ //服務器端步驟一,建立Socket服務對象(須要作關閉) DatagramSocket socket = null; try { socket=new DatagramSocket(10000); //步驟二,建立接收數據包 byte[] buf=new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); System.out.println("服務端開始啓動,等待客戶端發送內容"); //步驟三,解析數據 while(true){ socket.receive(datagramPacket);//程序到此阻塞,有數據傳入繼續 //得到客戶端的ip InetAddress inetAddress = datagramPacket.getAddress(); //得到數據 byte[] data = datagramPacket.getData(); int length=datagramPacket.getLength(); String s=new String(data,0,length); System.out.println(inetAddress.getHostAddress()+"發送的內容是: "+s); } } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpClient { public static void main(String[] args){ //服務器端步驟一,建立Socket服務對象(須要作關閉,不用給端口) DatagramSocket socket = null; BufferedReader reader=null; try { socket=new DatagramSocket(); //注意從控制檯輸入的內容是以字節流的方式存儲的,因此讀取的是字節流,爲了更方便顯示把字節流轉換成字符流 reader=new BufferedReader(new InputStreamReader(System.in)); //步驟二,建立數據包 String s=null; //使其不斷接收使用While(true) while((s=reader.readLine())!=null){ //設置退出循環的標識 if("exit".equals(s)){ break; }else{ byte[] buf=s.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000); //步驟三,發送數據包 socket.send(datagramPacket); } } System.out.println("退出客戶端"); } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } try { if(reader!=null){ reader.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
TCP通訊
服務端
第一步:建立Socket對象指定端口(需關閉)
ServerSocket(int port);
第二步:監聽接收客戶端對象Socket(也須要關閉)
Socket accept();
第三步:得到流對象
getInputStream(); BfferedReader
第四步:讀取數據
第五步:得到客戶端的IP地址
getHostAdress();
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) { //步驟一,建立服務端ServerSocket對象,指定端口(須要關閉) ServerSocket serverSocket = null; BufferedReader reader=null; //步驟二,建立監聽接收客戶端對象Socket Socket socket=null; try { serverSocket= new ServerSocket(9999); socket=serverSocket.accept(); //步驟三,得到流對象,注意字節流字符流的轉換 reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //步驟四,讀取數據 String s = reader.readLine(); //步驟五,得到客戶端的ip地址 InetAddress inetAddress = socket.getInetAddress(); System.out.println(inetAddress.getHostAddress()+"發送的內容是: "+s); } catch (Exception e) { e.printStackTrace(); } finally { try { if(serverSocket!=null){ serverSocket.close(); } if(socket!=null){ socket.close(); } if(reader!=null){ reader.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
客戶端
第一步:建立請求的Socket(需關閉)
Socket(String host,int port)
第二步:得到輸出流
getOutputStream(); BufferedWriter
第三步:寫數據
第四步:釋放資源
import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.Socket; public class TcpClient { public static void main(String[] args) { //步驟一,建立Socket對象,指定ip和端口(須要關閉) Socket socket=null; BufferedWriter writer=null; try { socket=new Socket("192.168.1.11",9999); //步驟三,得到輸出流對象,注意字節流字符流的轉換 writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //步驟四,寫數據 writer.write("愛我中華"); writer.newLine();//換行 writer.flush();//刷新 } catch (Exception e) { e.printStackTrace(); } finally { try { if(socket!=null){ socket.close(); } if(writer!=null){ writer.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
拓展:實現TCP從控制檯輸入數據
加一個BufferReader,用While(true)搭配if...breakv
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class TcpServer1 { public static void main(String[] args) { //步驟一,建立服務端ServerSocket對象,指定端口(須要關閉) ServerSocket serverSocket = null; BufferedReader reader=null; //步驟二,建立監聽接收客戶端對象Socket Socket socket=null; try { serverSocket= new ServerSocket(9999); socket=serverSocket.accept(); //步驟三,得到流對象,注意字節流字符流的轉換 reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String s=null; //步驟四,讀取數據 while (true){ if((s=reader.readLine())==null){ break; }else{ //步驟五,得到客戶端的ip地址 InetAddress inetAddress = socket.getInetAddress(); System.out.println(inetAddress.getHostAddress()+"發送的內容是: "+s); } } System.out.println("退出服務端"); } catch (Exception e) { e.printStackTrace(); } finally { try { if(serverSocket!=null){ serverSocket.close(); } if(socket!=null){ socket.close(); } if(reader!=null){ reader.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class TcpClient1 { public static void main(String[] args) { //步驟一,建立Socket對象,指定ip和端口(須要關閉) Socket socket=null; BufferedWriter writer=null; BufferedReader reader=null; try { socket=new Socket("192.168.1.11",9999); String s =null; reader=new BufferedReader(new InputStreamReader(System.in)); //步驟三,得到輸出流對象,注意字節流字符流的轉換 writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); while ((s=reader.readLine())!=null){ if("exit".equals(s)){ break; }else{ //步驟四,寫數據 writer.write(s); writer.newLine();//換行 writer.flush();//刷新 } } System.out.println("退出客戶端程序"); } catch (Exception e) { e.printStackTrace(); } finally { try { if(socket!=null){ socket.close(); } if(writer!=null){ writer.close(); } } catch (Exception e) { e.printStackTrace(); } } } }