網絡通信三要素
1)ip地址
2)端口號
3)應該有一些規則(協議UDP/TCP)
Ip地址的分類:
IP地址的組成
IP地址 = 網絡號碼+主機地址
A類IP地址:第一段號碼爲網絡號碼,剩下的三段號碼爲本地計算機的號碼
一般情況:國防部/大的國部門
B類IP地址:前二段號碼爲網絡號碼,剩下的二段號碼爲本地計算機的號碼
一般情況:大學裏面的多媒體教室
C類IP地址:前三段號碼爲網絡號碼,剩下的一段號碼爲本地計算機的號碼
私人地址
127.0.0.1--->表示本地計算機的迴環地址
端口號:0~65535有效端口號
0-1024屬於保留端口
mysql:3306
協議:
UDP協議 --->UDP編程
不需要建立連接通道的
數據大小有限制
不可靠連接
執行效率高
TCP協議 ---->TCP編程
需要建立連接通道
數據大小無限制
可靠連接
執行效率低
InetAddress:類表示互聯網協議 (IP) 地址
常用方法:
public static InetAddress getByName(String host)
throws UnknownHostException在給定主機名的情況下確定主機的 IP 地址。
public String getHostAddress()返回 IP 地址字符串(以文本表現形式)
public String getHostName()獲取此 IP 地址的主機名。
參數:
主機名可以是機器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式
例如:
package com.westos.Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDome {
public static void main(String[] args) throws UnknownHostException {
//創建Address類對象,在知道主機名的情況下獲取IP值
InetAddress address = InetAddress.getByName("DESKTOP-JM461TS");
//調用getHostAddress方法來獲取IP的文本形式
String ip = address.getHostAddress();
System.out.println(ip);//192.168.43.204
System.out.println("----------------------");
//當你知道你的IP地址時可以通過IP地址獲取你的主機名
InetAddress address2 = InetAddress.getByName("192.168.43.204");
//獲取主機名的文本格式
String name = address2.getHostName();
System.out.println(name);//DESKTOP-JM461TS
}
}
運行結果:
192.168.43.204
---------------
DESKTOP-JM461TS
Socket(套接字)包含udp編程和tcp編程
都是網絡中的套接字:只有通過ip地址和端口號來進行唯一的標識。
原理:
兩端必須都有Socket對象
中間採用流的形式進行傳輸
例如:
我們在用的QQ就是通過這種形式來運行的:一個發送端將數據封裝在一個數據報包通過底層的傳輸比特流發送給接收端,然後接收端也創建一個數據報包來接受傳輸中的實際數據,最終將它以字符串的數據展示出來
Udp編程:
1)不需要建立連接通道
2)數據大小有限制
3)不可靠連接---->傳輸速度快!
先來看看udp編程的案例:
先來創建一個發送端類:
package com.westos.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/* 發送端的開發步驟:
* 1)創建發送端的Socket對象
* 2)創建數據,並打包
* 3)調用當前發送端Socket對象中的發送的方法
* 4)關閉資源
*
*/
public class SendDome {
public static void main(String[] args) throws IOException {
/**
* 1)創建發送端的Socket對象
* 創建DatagramSocket類對象
*/
DatagramSocket ds=new DatagramSocket();
/**
* 2)創建數據並打包
* DatagramPacket數據報包
* DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
*/
//寫數據
byte[] bys="My best wishes...".getBytes();
//獲取數據的長度
int len = bys.length;
//獲取IP地址對象
InetAddress address = InetAddress.getByName("DESKTOP-JM461TS");
//指定端口號
int port=10086;
DatagramPacket dp=new DatagramPacket(bys,0,len,address,port);
/**
* 3)調用當前發送端Socket對象中的發送的方法
* public void send(DatagramPacket p)
* throws IOException從此套接字發送數據報包
*/
ds.send(dp);
/**
* 4)關閉資源
*/
ds.close();
}
}
再創建一個接收端類:
package com.westos.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
*Udp編程的接收端 開發步驟:
* 1)創建Socket對象
* 2)創建一個數據報包(接收容器)
* 3)調用Socket對象中的接收的方法
* 4)解析實際傳遞的數據
* 5)將解析的數據(ip,數據)展示在控制檯上
* 6)關閉資源
*注意:
*接收端不要運行多次,會出現異常:
* java.net.BindException: Address already in use: Cannot bind
*/
public class receiveDome {
public static void main(String[] args) throws IOException {
/**
* 1)創建接受端的Socket對象
* 創建DatagramSocket類對象
* 構造方法:
* public DatagramSocket(int port)創建數據報包套接字對象並且將其綁定到本地主機上的指定端口
*/
DatagramSocket ds=new DatagramSocket(10086);
/**
* 2)創建一個接收的數據報包
* public DatagramSocket(int port)創建數據報包套接字對象並且將其綁定到本地主機上的指定端口
*/
byte[] bys=new byte[1024];
int len=bys.length;
DatagramPacket dp=new DatagramPacket(bys,len);
/**
* 3)調用Socket對象的接收方法
* public void receive(DatagramPacket p):接收數據報包
*/
ds.receive(dp);
//獲取IP的文本形式
//public InetAddress getAddress() :返回ip地址對象 數據報包類:DataGramPacket
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
/**
* 4)解析實際的傳遞的數據
* public byte[] getData() :獲取緩衝中實際數據(從接收容器中獲取)
* public int getLength()返回將要發送或接收到的數據的長度。
*/
byte[] bys2 = dp.getData();
int len2 = dp.getLength();
String str=new String(bys2,0,len2);
System.out.println("目前接收到的數據是"+str+",來自於"+ip);
/**
* 關閉資源
*/
ds.close();
}
}
注意要點:
我們的接收端不要運行多次,否則會出現異常:Exception in thread "main" java.net.BindException: Address already in use: Cannot bind,所以這是我們需要注意的一個點。