在網絡成層中TCP對應於四層java
鏈路層(物理通道)
一般是對網絡鏈接設備的驅動協議,例如對光纖和都對網線的驅動不同網絡層(核心層)
TCP/IP協議的核心,他用於將數據分組發送
傳輸層(主要是程序間通訊)
包括TCP,UDP應用層
主要是負責應用程序的協議。如HTTP,FTP 用來區分計算機的惟一標識(IP地址)編程
採用八個二進制位表示一個段(因此最大隻有255),用四個字節標識一個電腦數組
192.168.105.222安全
==192.168==:是局域的IP地址,之內的電腦都是聯通的服務器
==本機地址== :127.0.0.1,表示本身的地址網絡
==ping操做==:ping也屬於一個通訊協議,是TCP/IP協議的一部分,用於檢查網絡通路是否可用socket
計算機之間的數據通信操作系統
端口:通信是爲了不不一樣程序之間的數據發錯,致使丟失等等,操做系統實現的邏輯編號
,每一個應用程序都有被分配的端口號。.net
UDP是無鏈接通訊協議,既在傳輸數據時。數據的發送端和接受端不創建邏輯鏈接,不確認接受端是否存在,也不會接受反饋。code
java.net
中的類都與互聯網有關係
public static InetAddress getLocalHost() //localhost本地主機,會拋出異常 //主機名和IP地址 public String getHostName() public String getHostAddress() public static InetAddress getByName(String name) //傳輸別人的主機名,拿到對方的IP地址
DategramPacket是UDP對傳輸數據對象的封裝,接受端的IP,端口號的封裝
DatagramSocket是對封裝好的數據包的傳輸對象,是綁定IP和端口號的套接字
//客戶端 //建立DatagramPacket對象 //DatagramPacket(byte[] buf,int length,InetAddress address,int port); byte[] data = "你好UDP".getBytes(); InetAddress inet = InetAddress.getByName("192.168.1.101"); //封裝數據對象 DategramPacket datagramPacket = new DatagramPacket(data,date.length,inet,1000) //建立Socket對象 DatagramSocket datagramSocket = new datagramSocket(); //發送數據包 datagramSocket.send(datagramSocket); //關閉資源 datagramSocket.close()
//服務端 //建立DatagramSocket對象,必須綁定端口號DatagramSocket(int port); DatagramSocket datagramSocket = new DatagramSocket(1000); //建立一個字節數組用來接收數據 byte[] data = new byte[1024]; //建立一個DatagramPacket數據包對象 DatagramPacket dp = new DatagramPacket(data,data.length) //調用DatagramSocket對象的receive(DatagramPacekt dp)接收數據 datagramSocket.receive(dp); //拆包 /* 須要知道發送者的IP DatagramPacket中的public InetAddress getAddress() 須要發送端的端口號 DatagramPacket中的public int getPort() 知道數據的字節個數,避免資源浪費 DatagramPacket中的public int getLength() */ int length = dp.getLength(); int port = dp.getPort(); String address = dp.getAddress().getHostAddress(); //關閉資源 datagramSocket.close()
將發送端的getDatagraPacket的傳輸數據轉換到鍵盤輸入,在接收端DatagramSocket不關閉資源就能夠了。
String sc = new Scanner(System.in); DatagramSocket ds = new DatagramSocket(); InetAddress inet = InetAddress.getByName(192.168.1.101); while(true){ String message = sc.nextLine(); byte[] bytes = message.getBytes(); DatagramPacket dp = new DatagramPacekt(bytes,bytes.length,inet,1000); }
byte[] data = new byte[1024]; DatagramSocket ds = new DatagramSocket(1000) while(true){ DatagramPacket dp = new DatagramPacket(date,data.length); ds.receive(dp); int port = dp.getPort(); String address = dp.getAddress().getHostAddress(); int length = dp.getLength(); }
TCP協議是面向鏈接呃通訊協議。必須創建發送與接收端的邏輯鏈接。
客戶端想服務端發出鏈接請求
服務端向客戶端發送一個響應
客服端想服務端發送確認信息
刻意確保傳輸數據的安全性
==TCP與UDP的區分:==UDP只區分發送和接受,可是TCP嚴格區分客服端和服務器,服務器不會主動鏈接客戶端。在鏈接通路完成後悔自動創建一個字節流對象(OutputStream,InputStream)
//傳入服務器的IP和端口號,一運行就會去鏈接 public Socket(String host,int port); //一但鏈接就會建立對應的輸入輸出流 public OutputStream getOutputStream(); public InputStream getInputStream();
Socket socket = new Socket(127.0.0.1,1000); OutputStream out = socket.getOutputStream(); out.write(""); //網絡上的流對象能夠不用關閉流對象
//服務器爲了區分究竟是那個客戶端鏈接了,須要拿到客戶端的套接字 public ServiceSocket(int port); public Socket accept(); //這個套接字對象是經過IO傳過來的 public InputStream getInpurStream(); //向客戶端回寫數據的方法 public OutputStream getOutputStream();
ServerceSocket server = new ServerSocket(1000); Socket socket = server.accept(); InputStream in = socket.getInpuStream(); byte[] data = new byte[1024]; int len = in.read(data); System.out.println(new String(data,0,len)); OutputStream out = socket.getOutputStream(); server.write(xxxx); socket.close(); server.close();