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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。