JavaSE_网络编程

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();
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值