JAVASE第26天笔记

Day26笔记

标签(空格分隔): java基础


今日目标

  • 描述什么是网络编程
    说出网络编程三要素
    描述什么是IP
    描述什么是端口
    描述什么是协议
    说出socket通信原理
    说出TCP和UDP的区别
    说出TCP三次握手过程
    说出UDP通信原理
    独立分析UDP服务端编写步骤
    独立编写UDP服务端代码,端口号12306,用于接收并打印客户端发送的字符串
    独立分析UDP客户端编写步骤
    独立编写UDP客户端代码,向12306端口发送字符串数据
    说出TCP通信原理
    独立分析TCP服务端代码编写步骤
    独立编写TCP服务端代码。端口号12306,用于接收并打印客户端发送的字符串
    独立分析TCP服务端代码编写步骤
    独立编写TCP服务端代码,向12306端口发送字符串数据
    独立编写代码通过多线程将服务端和客户端整合到一个命令窗口
    独立编写代码将服务器设置成多线程,将服务端和客户端合并成一个应用程序
    独立分析大写转换服务器的编码思路
    独立编写大写转换服务器代码,服务端接收客户端发送的字母转换成大写返回给客户端
    独立分析文件上传服务器的编码思路
    独立编写文件上传服务器代码实现代码服务端接收客户端发送的视频文件

网络编程

计算机和计算机的通过某些协议进行通信,通过应用程序去实现数据的交换

IP地址

是什么?
网络终端在网络中的一个地址,通过这个地址,我们可以实现终端与终端之间的数据通信
命令:
ipconfig : 获取我们本机ip
ping ip 地址: 测试计算机之间是否连通
IPV4 和 IPV6
回路地址: 127.0.0.1

端口号

端口:其实就是本机应用程序的一个标识,通过这个端口号,就可以找到这个应用程序,1024起,1024以下已经被系统分配
* 常用端口
* mysql: 3306
* oracle: 1521
* web: 80
* tomcat: 8080
* QQ: 4000
* feiQ: 2425

通信协议

协议:其实就是计算机在交换数据的过程中,所遵循的一种约定或者规则
UDP:
面向无连接 数据不安全 速度快 不区分客户端和服务端
TCP:
面向连接 数据安全 速度相比UDP略慢 需要区分客户端和服务端
三次握手: 客户端发起请求 服务端接收请求回应 传输数据
http协议(超文本传输协议):基于TCP原理

网络三要素: IP地址 端口号 协议

Socket原理

简单而言,就是计算机在相互通信之间的一个端点
底层的数据交换是通过IO流进行传输
数据的交换都是通过端点与端点之间的相互通信传输

UDP传输

发送端:
第一步: 通过空参创建一个DatagramSocket对象
第二步: 创建一个发送数据的包裹对象 DatagramPacket(字节数组,有效长度,要发送的ip地址, 端口)
第三步:把包裹发送出去,调用DatagramSocket对象send方法,把这个包裹作为参数传递进去
第四步:关闭这个个DatagramSocket对象,调用close方法

接收端:
第一步: 通过空参创建一个DatagramSocket对象,在构造方法里面指定一个端口,举例DatagramSocket socket = new DatagramSocket(6666); //创建Socket相当于创建码头
第二步: 创建一个包裹,用于接收,举例DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱
第三步:调用DatagramSocket对象来接收包裹,通过传入自定义的包裹作为参数
,举例socket.receive(packet); //接货,接收数据
第四步:获取包裹里面的数据,举例
byte[] arr = packet.getData(); //获取数据
int len = packet.getLength(); //获取有效的字节个数
System.out.println(new String(arr,0,len));

第五步:关闭服务端的连接,调用DatagramSocket对象的close方法.

InetAddress介绍

//通过这种方式获取到本机的主机名和ip地址
InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
package com.heima.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Demo1_Send {

    /**
     * * 1.发送Send
     * 创建DatagramSocket, 随机端口号
     * 创建DatagramPacket, 指定数据, 长度, 地址, 端口
     * 使用DatagramSocket发送DatagramPacket
     * 关闭DatagramSocket
     * @throws SocketException 
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws Exception {
        String str = "what are you 弄啥呢?";
        DatagramSocket socket = new DatagramSocket();               //创建Socket相当于创建码头
        DatagramPacket packet =                                     //创建Packet相当于集装箱
                new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
        socket.send(packet);                                        //发货,将数据发出去
        socket.close();                                             //关闭码头
    }

}

接收端

package com.heima.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Demo1_Receive {

    /**
     ** 2.接收Receive
     * 创建DatagramSocket, 指定端口号
     * 创建DatagramPacket, 指定数组, 长度
     * 使用DatagramSocket接收DatagramPacket
     * 关闭DatagramSocket
     * 从DatagramPacket中获取数据
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);       //创建Socket相当于创建码头
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱
        socket.receive(packet);                                 //接货,接收数据

        byte[] arr = packet.getData();                          //获取数据
        int len = packet.getLength();                           //获取有效的字节个数
        System.out.println(new String(arr,0,len));
        socket.close();
    }

}

TCP协议

26.16_网络编程(TCP协议)(掌握)

  • 1.客户端
    • 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
    • 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
    • 输入流可以读取服务端输出流写出的数据
    • 输出流可以写出数据到服务端的输入流
  • 2.服务端
    • 创建ServerSocket(需要指定端口号)
    • 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
    • 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
    • 输入流可以读取客户端输出流写出的数据
    • 输出流可以写出数据到客户端的输入流

26.17_网络编程(TCP协议代码优化)

* 客户端

        Socket socket = new Socket("127.0.0.1", 9999);      //创建Socket指定ip地址和端口号
        InputStream is = socket.getInputStream();           //获取输入流
        OutputStream os = socket.getOutputStream();         //获取输出流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        PrintStream ps = new PrintStream(os);

        System.out.println(br.readLine());
        ps.println("我想报名就业班");
        System.out.println(br.readLine());
        ps.println("爷不学了");
        socket.close();
* 服务端

        ServerSocket server = new ServerSocket(9999);   //创建服务器
        Socket socket = server.accept();                //接受客户端的请求
        InputStream is = socket.getInputStream();       //获取输入流
        OutputStream os = socket.getOutputStream();     //获取输出流

        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        PrintStream ps = new PrintStream(os);

        ps.println("欢迎咨询传智播客");
        System.out.println(br.readLine());
        ps.println("报满了,请报下一期吧");
        System.out.println(br.readLine());
        server.close();
        socket.close();

###26.18_网络编程(服务端是多线程的)(掌握)
    ServerSocket server = new ServerSocket(9999);   //创建服务器
        while(true) {
            final Socket socket = server.accept();              //接受客户端的请求
            new Thread() {
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        ps.println("欢迎咨询传智播客");
                        System.out.println(br.readLine());
                        ps.println("报满了,请报下一期吧");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }

网络爬虫抓取美女图片(自己优化)

package com.heima.demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class URLDemo {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://pic.sogou.com/pics?query=girl&di=2&_asf=pic.sogou.com&w=05009900&sut=0&sst0=1472204847823");
        // URLConnection openConnection()  返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
        URLConnection conn = url.openConnection();
        //获取输入流  伪装浏览头
        InputStream in = conn.getInputStream();
        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);
        //定义一个String
        String line = null;
        //定义一个集合,用于存储图片链接
        HashSet<String> hs = new HashSet<>();
        while((line = br.readLine()) != null){
            String regex = "http:[\\.|\\w|\\d|\\/|-|%]+\\.jpg";
            Pattern p = Pattern.compile(regex);
            Matcher matcher = p.matcher(line);
            while(matcher.find()){
                String picUrl = matcher.group();
                System.out.println("抓取到图片:" + picUrl);
                hs.add(picUrl);
            }
        }
        //遍历集合
        int i = 1;
        for(String img : hs){
            //System.out.println(img);
            //第一步封装URL
            URL imgUrl = new URL(img);
            //第二步获取连接 建立本机和图片的连接
            URLConnection connection = imgUrl.openConnection();
            //第三步:建立输入流
            InputStream inputStream = connection.getInputStream();
            //高效缓冲流
            BufferedInputStream bis = new BufferedInputStream(inputStream);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("img",i+".jpg")));
            int len = 0;
            while((len = bis.read()) != -1){
                bos.write(len);
            }
            System.out.println(img+"图片下载完成....");
            bis.close();
            bos.close();
            i++;
        }

        br.close();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值