1.ip:
定义网络上的不同节点(手机,电脑,路由器…)
IPv4:32位 IPV6:128位
非注册IP地址(公司内部使用): 192.168.0.0 ~ 192.168.255.255
特殊的IP:
127.0.0.1 本地IP
1ocalhost 本机域名
DNS域名解析器
java.net 类 InetAddress 此类表示互联网协议 (IP) 地址。
static InetAddress getLocalHost() 返回本地主机。
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地 址
String getHostAddress()
返回 IP 地址字符串(以文本表现形式)。
String getHostName()
获取此 IP 地址的主机名。
2.端口; 区分软件的;
定义端口 2个字节 0~65535
相同的协议下端口不能冲突
端口自定义越大越好,8000以上,8000以内预留端口号
特殊的端口号:
80: http
8080: tomcat
1521: Oracle端口号
3306: mysql端口号
INetSocketAddress 此类实现 IP 套接字地址(IP 地址 + 端口号)。
/
public class PortDemo02 {
public static void main(String[] args) {
//InetSocketAddress(String hostname, int port) 根据主机名和端口号创建套接字地址。
InetSocketAddress i=new InetSocketAddress(“127.0.0.1”,8888);
System.out.println(i);
/
* InetAddress getAddress()
获取 InetAddress。
String getHostName()
获取 hostname。
int getPort() 获取端口
*/
System.out.println(i.getAddress().getHostName());
System.out.println(i.getHostName());
System.out.println(i.getPort());
}
}
/* 发送数据
- 协议: 规范 合同
- udp :非面向连接的 写信 ,不安全,效率高,协议简单,开销小,大小有限制一般不超过60k
- tcp :面向连接的 打电话 ,安全,效率低,开销大 3次握手:1.拨号 2.回访:响应
3.发送数据 ,基于IO穿出数据 - 应用层如何与传输层进行沟通?
-
通过Socket套接字
-
面向Socket编程,Socket相当于插座,是两层之间沟通的接口,
不同协议,Socket的实现不一样
*
- udp如何实现Socket编程: 发送端和接收端是平等的
-
DatagramSocket 此类表示用来发送和接收数据报包的套接字
-
DatagramSocket(int port)
-
DatagramPacket 此类表示数据报包。
- UDP基本流程:发送端
-
1.创建发送端,指明发送端的端口
-
2.准备数据,转为字节数组
-
3.把数据打包 指明接收端的地址和端口号 DatagramPacket
-
4.发送数据
-
5.关闭
*/
public class SendDemo01 {
public static void main(String[] args) throws IOException {
System.out.println("----------------发送端--------------");
//1,创建发送端
DatagramSocket socket=new DatagramSocket(8888);
//2.准备数据,转为字节数组
String str=“那些你很冒险的梦”;
byte[] arr=str.getBytes();
//3.打包 DatagramPacket(byte[] buf, int offset, int length,
//SocketAddress address)
DatagramPacket packet=new DatagramPacket
(arr,0,arr.length,new InetSocketAddress(“localhost”,9999));
//4.void send(DatagramPacket p) 从此套接字发送数据报包。
socket.send(packet);
//5.关闭
socket.close();
}
}
/* 接收
- UDP基本流程:接收端
- 1.构建接受端,指定接受端端口
- 2.准备字节数组,用来存储接口收据的
- 3.把字节数组打包
- 4.阻塞式接收
- 5.处理数据
- 6.关闭
*/
public class ReceiveDemo02 {
public static void main(String[] args) throws IOException {
System.out.println("----------------接受端--------------");
//1.构建接受端,指定接受端端口
DatagramSocket socket=new DatagramSocket(9999);
//2.准备字节数组,用来存储接口收据的
byte[] arr=new byte[1024 *60];
//3.把字节数组打包 DatagramPacket(byte[] buf, int offset, int length)
DatagramPacket packet=new DatagramPacket(arr,0,arr.length);
//4.接收 void receive(DatagramPacket p) 从此套接字接收数据报包。
socket.receive(packet);
/
* byte[] getData() 返回数据缓冲区。
int getLength() 返回将要发送或接收到的数据的长度。
*/
//5.处理数据
System.out.println(new String(packet.getData()));
System.out.println(packet.getLength());
//6.关闭
socket.close();
}
}