1.IP地址封装类InetAddress类
这个类封装了网络IP的相关信息。
- 获取本机的网络信息
// 获取本机的网络地址(主机名称 + IP地址)
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("主机名称:" + localHost.getHostName());
System.out.println("IP地址:" + localHost.getHostAddress());
- 按照主机名获取网络地址
// 获取京东的网络地址(按照主机名称)
InetAddress jdHost = InetAddress.getByName("www.jd.com");
System.out.println("京东主机名称:" + jdHost.getHostName());
System.out.println("京东主机IP: " + jdHost.getHostAddress());
- 按照主机名获取多个网络地址
System.out.println("淘宝的所有网络地址:");
InetAddress[] taobaoHostArray = InetAddress.getAllByName("www.taobao.com");
for (InetAddress taobaoHost : taobaoHostArray) {
System.out.println(taobaoHost.getHostName());
System.out.println(taobaoHost.getHostAddress());
System.out.println("--------------");
}
- 后期如果出现端口冲突怎么办?
打开命令提示符。
1.查看所有端口:netstat -ano
2.查看指定端口:netstat -aon|findstr"8080"
3.查看指定进程:tasklist|findstr"8080"
4.查看具体进程:使用任务管理器超看PID
2.TCP协议
TCP协议客户端和服务端是不平等的,通过IO流的方式进行网络数据的传输。
1.相关类:
- ServerSocket类
网络服务端。 - Socket类
网络客户端。
2.服务端代码实现:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
// 服务器端代码
public class Demo01 {
public static void main(String[] args) {
System.out.println("我是服务器!");
// 创建服务器对象并监听端口号8888
// 通过accept方法获取获取访问的客户端
//通过访问的客户端获取客户端输出的信息
// 通过客户端向客户端发送反馈信息
try (Scanner sc = new Scanner(System.in);
ServerSocket sever = new ServerSocket(8888);
Socket socket = sever.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream()){
while(true) {
//接收的信息
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println("客户端回应了:" + new String(data,0,len));
//回馈的信息
System.out.println("服务端说:");
String str = sc.next();
out.write(str.getBytes());
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.客户端代码实现:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
// 客户端代码
public class Demo02 {
public static void main(String[] args) {
System.out.println("我是客户端!");
// 创建客户端对象向192.168.104.155主机下的8888端口发送信息
// 向服务端发送消息
// 获取服务端消息
try (Scanner sc = new Scanner(System.in);
Socket socket = new Socket("192.168.104.155",8888);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream()){
while(true) {
// 发送消息处理
System.out.println("客户端说:");
String str = sc.next();
out.write(str.getBytes());
out.flush();
// 获取消息处理
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println("服务端回应了:" + new String(data,0,len));
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.UDP协议
UDP协议客户端和服务端是平等的DatagramSocket对象既可以接收数据又可以发送数据,通过DatagramPacket对象的方式进行网络数据的传输。
1.相关类:
- DatagramSocket类
用于接收和发送网络数据。 - DatagramPacket类
用于封装数据的数据包。
2.发送端代码实现:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* UDP发送端
*
*/
public class Demo03 {
public static void main(String[] args) {
// 创建UDP下的数据发送
try (DatagramSocket socket = new DatagramSocket()){
//发送的数据
byte[] data = "天王盖地虎".getBytes();
// 创建DatagramPacket数据包,向本机的8888端口发送数据。
DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(),8888);
// 使用socket发送数据。
socket.send(packet);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.接收端代码实现:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* UDP接收端
*
*/
public class Demo04 {
public static void main(String[] args) {
// 创建接收端用于接收数据
try (DatagramSocket socket = new DatagramSocket(8888)){
while(true) {
// 1.创建空的DatagramPacket数据包
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
// 2.接收信息
// DatagramSocket将接收到的信息,存入DatagramPack数据包中
socket.receive(packet);
// 3.获取数据包中的数据
// 3.1 获取数据包中的数据部分
data = new byte[1024];
data = packet.getData();
// 3.2获取数据包中的数据字节长度
int len = packet.getLength();
// 3.3获取数据包中的发送端信息。
InetAddress inetAddress = packet.getAddress();
System.out.println(new String(data,0,len));
System.out.println(inetAddress.getHostName());
System.out.println(inetAddress.getHostAddress());
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.使用Java进行网络爬虫。
- 关于URL类
import java.net.MalformedURLException;
import java.net.URL;
/**
* URL统一资源管理器。(不会验证网站的准确其实内部仅仅只是使用正则表达式)
* 1、协议
* 2、域名、计算机
* 3、端口、默认80
* 4、请求资源。
*/
public class URLTest {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://www.bilibili.com:80/video/av30023103/?p=237#3");
System.out.println("协议-->\t"+url.getProtocol());
System.out.println("端口-->\t"+url.getPort());
System.out.println("域名|IP-->\t"+url.getHost());
System.out.println("请求资源1-->\t"+url.getPath());
System.out.println("请求资源2-->\t"+url.getFile());
System.out.println("参数-->\t"+url.getQuery());
System.out.println("锚点-->\t"+url.getRef());
}
}
- 将豆瓣网中的一个图片下载到当前电脑的一个文件中。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Demo05 {
public static void main(String[] args) {
// 声明输入输出流
BufferedOutputStream out = null;
BufferedInputStream in = null;
try {
// 图片地址
String str = "https://img3.doubanio.com/view/subject/s/public/s33659613.jpg";
// 创建URL对象
URL url = new URL(str);
// 通过url对象获取获取HttpURLConnection对象
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// 创建输出流向文件中写入数据
out = new BufferedOutputStream(new FileOutputStream("C:\\Users\\10417\\Desktop\\douban.jpg"));
// 创建输入流从网页读取数据
in = new BufferedInputStream(conn.getInputStream());
// 读取操作
byte[] data = new byte[1024];
int len = -1;
while((len = in.read(data)) != -1) {
out.write(data, 0, len);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
// 关闭
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}