java基礎專欄—java網絡編程

java網絡編程

​ 在網絡成層中TCP對應於四層java

  • 鏈路層(物理通道)一般是對網絡鏈接設備的驅動協議,例如對光纖和都對網線的驅動不同
  • 網絡層(核心層)TCP/IP協議的核心,他用於將數據分組發送
  • 傳輸層(主要是程序間通訊) 包括TCP,UDP
  • 應用層主要是負責應用程序的協議。如HTTP,FTP

IP地址和端口號

​ 用來區分計算機的惟一標識(IP地址)編程

  • 手動寫的
  • 分配的

採用八個二進制位表示一個段(因此最大隻有255),用四個字節標識一個電腦數組

192.168.105.222安全

==192.168==:是局域的IP地址,之內的電腦都是聯通的服務器

==本機地址== :127.0.0.1,表示本身的地址網絡

==ping操做==:ping也屬於一個通訊協議,是TCP/IP協議的一部分,用於檢查網絡通路是否可用socket

計算機之間的數據通信操作系統

端口:通信是爲了不不一樣程序之間的數據發錯,致使丟失等等,操做系統實現的邏輯編號,每一個應用程序都有被分配的端口號。.net

UDP協議

​ UDP是無鏈接通訊協議,既在傳輸數據時。數據的發送端和接受端不創建邏輯鏈接,不確認接受端是否存在,也不會接受反饋。code

  • UDP協議消耗資源小,通訊效率高,通常用於音頻,視頻和普通護具的傳輸
  • 使用UDP不能確保數據的完整,可能會丟失
  • 數據大小被限制在64K內

InetAddress

java.net中的類都與互聯網有關係

public static InetAddress getLocalHost()
//localhost本地主機,會拋出異常
//主機名和IP地址
  
public String getHostName()
  
public String getHostAddress()
  
public static InetAddress getByName(String name)
//傳輸別人的主機名,拿到對方的IP地址

DatagramPacket and DatagramSocket

​ 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協議是面向鏈接呃通訊協議。必須創建發送與接收端的邏輯鏈接。

  • 客戶端想服務端發出鏈接請求

  • 服務端向客戶端發送一個響應

  • 客服端想服務端發送確認信息

  • 刻意確保傳輸數據的安全性

    ​==TCP與UDP的區分:==UDP只區分發送和接受,可是TCP嚴格區分客服端和服務器,服務器不會主動鏈接客戶端。在鏈接通路完成後悔自動創建一個字節流對象(OutputStream,InputStream)

Socket

//傳入服務器的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("");
//網絡上的流對象能夠不用關閉流對象

ServerSocet

//服務器爲了區分究竟是那個客戶端鏈接了,須要拿到客戶端的套接字
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();
相關文章
相關標籤/搜索