一.网络编程
1.IP:定义网络上的不同的节点(手机,电脑,路由器...)
IPV4:32位 IPV6:128位
非注册IP地址(公司内部使用):192.168.0.0~192.168.255.255
特殊的IP:
127.0.0.1 本地IP
localhost 本地域名
DNS域名解析器
java,net类InetAddress 此类标识互联网协议(IP)地址。
static InetAddress getLocalHost() 返回本地主机
static InetAddress getByName(String host)在给定主机名的情况下确认主机的IP地址
public class IPDemo01 {
public static void main(String[] args) throws UnknownHostException {
InetAddress address1=InetAddress.getLocalHost();
System.out.println(address1);
/*
* String getHostAddress()
返回 IP 地址字符串(以文本表现形式)。
String getHostName()
获取此 IP 地址的主机名。
*/
System.out.println(address1.getHostAddress());
System.out.println(address1.getHostName());
InetAddress address2=InetAddress.getByName("www.baidu.com");
InetAddress address3=InetAddress.getByName("115.239.211.112");
System.out.println(address3); //115.239.211.112
System.out.println(address3.getHostAddress()); //115.239.211.112
System.out.println(address3.getHostName()); //115.239.211.112
}
}
2.端口:区分软件的
定义端口 2个字节 0~65535
相同的协议下端口不能冲突
端口自定越大越好,8000以上,8000以内预留端口号
特殊的端口号:
80 http
8080 tomcat
1521 Oracle端口号
3306 mysql端口
INetSocketAddress 此类实现IP套接地址(IP地址+端口号)
import java.net.InetSocketAddress;
public class PortDemo02 {
public static void main(String[] args) {
//InetSocketAddress(String hostname, int port) 根据主机名和端口号创建套接字地址。
InetSocketAddress i=new InetSocketAddress("127.0.2.1",80);
System.out.println(i);
/*
* InetAddress getAddress()
获取 InetAddress。
String getHostName()
获取 hostname。
int getPort() 获取端口
*/
System.out.println(i.getAddress());
System.out.println(i.getHostName());
System.out.println(i.getPort());
}
}
3.URL:统一资源定位符|器
互联网的三大基石:http html url
http://www.baidu.com:80/index.html?name=zhangsan&age=123#a 协议:http 域名:www.baidu.com 端口:80 默认:80 |
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo03 {
public static void main(String[] args) throws MalformedURLException {
/*
String getFile()
获取此 URL 的文件名。
String getHost()
获取此 URL 的主机名(如果适用)。
String getPath()
获取此 URL 的路径部分。
int getPort()
获取此 URL 的端口号。
String getProtocol()
获取此 URL 的协议名称。
String getQuery()
获取此 URL 的查询部分。
String getRef()
获取此 URL 的锚点(也称为“引用”)。
*/
URL url=new URL("http://www.baidu.com:80/index.html?name=zhangsan&age=123#a");
System.out.println(url.getFile());
System.out.println(url.getHost());
System.out.println(url.getPath());
System.out.println(url.getPort());
System.out.println(url.getProtocol());
System.out.println(url.getQuery());
System.out.println(url.getRef());
}
}
4.协议:规范 合同
udp:非面向连接的 写信 ,不安全,效率高,协议简单,开销小,大小有限制,一般不超过60k
tcp:面向连接的 打电话 ,安全,效率低,开销大,
三次握手:1)拨号 2)回访 :响应 3)发送数据:基于IO穿出数据
1)应用层如何与传输层进行沟通:
通过Socket套接字
面向Socket编程,Socket相当于插座,是两层之间沟通的接口,不同协议,Socket的实现不一样
2)udp如何实现Socket编程:发送端和接收端是平等的
DatagramSocket 此类表示用来发送和接收数据报包的套接字
DatagramSocket (int port)
DatagramPacket 此类表示数据报包
3)UDP基本流程:发送端
①创建发送端,指明发送端的端口
②准备数据,转为字节数组
③吧数据打包,指明接收端的地址和端口号 DatagramPacket
④发送数据
⑤关闭
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();
}
}
4)UDP基本流程:接收端
①创建接受端,指明接受端的端口
②准备字节数组,用来存储接口收据的
③吧字节数组打包
④阻塞式接收
⑤处理数据
⑥关闭
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();
}
}
4)tcp基本流程:服务端
①构建服务端 ServerSocket 指定端口 ServerSocket(int port)
②阻塞式监听 Socket accept()
③一个客户端就是一个socket IO操作
④关闭
public class Server02 {
public static void main(String[] args) throws IOException {
System.out.println("------------Server-----------");
// 1.构建服务端 ServerSocket 指定端口
ServerSocket server=new ServerSocket(9999);
// 2.阻塞式监听
Socket socket=server.accept();
System.out.println("一个客户端连接成功");
// 3.一个客户端就是一个socket IO操作
DataInputStream is=new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String str=is.readUTF();
System.out.println(str);
// 4.关闭
is.close();
socket.close();
server.close();
}
}
5)tcp基本流程:客户端
①创建客户端 Socket 指定服务端的ip和端口 Socket(String host, int port)
②io操作
③关闭
public class Client01 {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("------------Client-----------");
//1.创建客户端 Socket 指定服务端的ip和端口
Socket client=new Socket("127.0.0.1",9999);
//2.io操作 OutputStream getOutputStream() 返回此套接字的输出流。
DataOutputStream out=new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
out.writeUTF("name=hangsan&pwd=123");
//3.关闭
out.flush();
out.close();
client.close();
}
}