网络编程(1)

16 篇文章 0 订阅

基本知识

 IP地址:

      用来标识网络中的一个通信实体的地址。通信实体可以是计算机、路由器等。 比如互联网的每个服务器都要有自己的IP地址,而每个局域网的计算机要通信也要配置IP地址。路由器是连接两个或多个网络的网络设备。

      目前主流使用的IP地址是IPV4,但是随着网络规模的不断扩大,IPV4面临着枯竭的危险,所以推出了IPV6。

      IPV4:32位地址,并以8位为一个单位,分成四部分,以点分十进制表示,如192.168.0.1。因为8位二进制的计数范围是00000000---11111111,对应十进制的0-255,所以-4.278.4.1是错误的IPV4地址。

      IPV6:128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,每个数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

注意事项

      1. 127.0.0.1 本机地址

      2. 192.168.0.0--192.168.255.255为私有地址,属于非注册地址,专门为组织机构内部使用。

package cn.zh.net;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 *InteAddredd:
 *  getLocalHost:本机
 *  getByName:根据域名DNS 或IP地址解析IP地址
 *  两个成员方法:
 *      getHostAddress:返回地址
 *      getHostName:返回计算机名
 *
 */
public class IPTest {
    public static void main(String[] args) throws UnknownHostException {
        //使用getLocalHost方法创建InetAddress对象。
        InetAddress address = InetAddress.getLocalHost();
        System.out.println(address.getHostAddress());//获取ip地址
        System.out.println(address.getHostName());
        //根据域名得到InetAddress对象
        address = InetAddress.getByName("www.baidu.com");
        System.out.println(address.getHostAddress());
        System.out.println(address.getHostName());
        //根据ip得到InetAddress对象
        address = InetAddress.getByName("183.232.231.172");
        System.out.println(address.getHostAddress());
        System.out.println(address.getHostName());

    }
}

▪ 端口:

      IP地址用来标识一台计算机,但是一台计算机上可能提供多种网络应用程序,如何来区分这些不同的程序呢?这就要用到端口。

      端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。 端口的表示是一个16位的二进制整数,对应十进制的0-65535。

      Oracle、MySQL、Tomcat、QQ、msn、迅雷、电驴、360等网络程序都有自己的端口。

总结

      1. IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据。

      2. IP地址好比为电话号码,而端口号就好比为分机号。

package cn.zh.net;

import java.net.InetSocketAddress;

public class PortTest {
    public static void main(String[] args) {
        //包含端口
        InetSocketAddress socketAddress1 = new InetSocketAddress("127.0.0.1",8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",9000);
        System.out.println(socketAddress1.getHostName());//127.0.0.1
        System.out.println(socketAddress2.getAddress());//localhost/127.0.0.1
    }
}

▪ URL:

      在www上,每一信息资源都有统一且唯一的地址,该地址就叫URL(Uniform Resource Locator),它是www的统一资源定位符。URL由4部分组成:协议 、存放资源的主机域名、资源文件名和端口号。如果未指定该端口号,则使用协议默认的端口。例如http 协议的默认端口为 80。 在浏览器中访问网页时,地址栏显示的地址就是URL。

      在java.net包中提供了URL类,该类封装了大量复杂的涉及从远程站点获取信息的细节。

package cn.zh.net;

import java.net.URL;

public class URLTest {
    public static void main(String[] args) throws Exception{
        URL u = new URL("https://www.csdn.net");
        System.out.println("获取与此url关联的协议的默认端口"+u.getDefaultPort());
        System.out.println("getFile"+u.getFile());
        System.out.println("主机"+u.getHost());
        System.out.println("路径"+u.getPath());
        // 如果www.google.cn:80则返回80.否则返回-1
        System.out.println("端口:" + u.getPort());
        System.out.println("协议:" + u.getProtocol());
        System.out.println("参数部分:" + u.getQuery());
        System.out.println("锚点:" + u.getRef());
    }
}

▪ Socket:

      我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接Socket来进行分离。

      套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次工作。

      Socket实际是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。

爬虫原理

package cn.zh.net;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

/**
 * 网络爬虫原理
 * 1.获取URL
 * 2.下载资源
 * 3.分析
 * 4.处理
 */
public class SpiderTest01 {
    public static void main(String[] args) throws Exception {

        //1.获取URL
        URL url = new URL("https://www.jd.com");
        //2.下载资源
        InputStream is = url.openStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf8"));
        String msg = null;
        while (null!=(msg=br.readLine())){
            System.out.println(msg);
        }
        br.close();
        //3.分析
        //4.处理
    }
}
package cn.zh.net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 网络爬虫原理+模拟浏览器
 */
public class SpiderTest02 {
    public static void main(String[] args) throws Exception {

        //1.获取URL
        URL url = new URL("https://www.diangping.com");
        //2.下载资源
        HttpURLConnection connection=(HttpURLConnection)url.openConnection();

        connection.setRequestMethod("GET");
        connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36");
        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf8"));
        String msg = null;
        while (null != (msg = br.readLine())) {
            System.out.println(msg);
        }
        br.close();
        //3.分析
        //4.处理
    }
}

网络编程udp基本步骤

创建 UdpClisent.java文件

package cn.zh.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

/**
 * 发送端
 * 1.使用DatagrameSocket指定端口 创建接受端
 * 2.准备数据 一定要转成字节数组
 * 3.封装成DatagramPacket包裹,需要指定目的地
 * 4.发送包裹send(DatagramPacket p)
 * 5.释放资源
 */
public class UdpClient {
    public static void main(String[] args) throws Exception{
        System.out.println("发送方启动中.....");
        //使用DatagrameSocket指定端口 创建接受端
        DatagramSocket client = new DatagramSocket(8888);
        //准备数据 一定要转成字节数组
        String data = "上海尚学堂";
        byte[] datas = data.getBytes();
        //.封装成DatagramPacket包裹,需要指定目的地
        DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
        //发送包裹send(DatagramPacket p)
        client.send(packet);
        //释放资源
        client.close();
    }
}

创建UdpServer.java文件

package cn.zh.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 接收端
 * 同一协议下端口不允许重复
 * 1.使用DatagrameSocket指定端口 创建接受端
 * 2.准备容器 封装成DatagramPacket包裹
 * 3.阻塞式接收包裹receive(DatagramPacket p)
 * 4.分析数据
 *  byte[] getData()
 *         getLength()
 * 5.释放资源
 */
public class UdpServer {
    public static void main(String[] args) throws IOException {
        System.out.println("接受方启动中......");
        //.使用DatagrameSocket指定端口 创建接受端
        DatagramSocket server = new DatagramSocket(9999);
        //准备容器 封装成DatagramPacket包裹
        byte[] container = new byte[1024*60];
        DatagramPacket packet = new DatagramPacket(container,0,container.length);

        //阻塞式接收包裹receive(DatagramPacket p)
        server.receive(packet);
        //分析数据
        //byte[] getData()
         //      getLength()
        byte[] datas = packet.getData();
        int len = packet.getLength();
        System.out.println(new String(datas,0,len));
        //释放资源
        server.close();

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值