64.【网络编程】

一、基础知识

1.什么是计算机网络?

1.定义:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备
,通过通信线路连接起来,在网络操作系统,网络管理软件以及通信协议的管理和
协调下,(实现资源共享和信息传递的计算机系统).

2.网络编程的目的?

1.传递信息
2.数据交换
3.通信

3.如何准确的定位网络上的一台主机?

ping 域名

在这里插入图片描述

1.如何准确的定位网络上的一台主机
(1).本地Ipv4 (cmd >  ipconfig)
(2).端口号
(3).计算机上的某个资源
2.定位了网络上的一台主机,如何传输数据?
(1).javaweb 网页编程  (架构 B/S  >浏览器)
(2).TCP/IP  网络编程   (架构 C/S  >客户端(QQ软件))

4.网络通信的要素

1.如何使新网络的通信
(1).通信双方的地址:  ip 与  端口号
(2).网络通信的协议:  http,ftp,tcp,udp... 
TCP/IP参考模型

5.OSI七层参考模型

在这里插入图片描述

重点学习的是 IP .UDP .TCP
应用层: 比如QQ等,应用
传输层: 比如:通信
网络层: 比如 :封包
数据链路层: 比如:具体传输

二、IP详解

1.IP详解

(1).IP的用处:
唯一定位一台网络上的计算机
(2).本机IP(localgost)
127.0.0.1

在这里插入图片描述

(3).IP的分类
1.通过ip的地址进行分类   
 (1).ipv4地址:
     ipv4 127.0.0.1,四个字节组成,每个字节的长度为0~255,一共42亿个,(2011) 
 (2).ipv6地址:
 	 ipv6           ,128位,8个无符号整数组成
2.通过ip的公网和私网进行分类
(1).公网---互联网
(2).私网---局域网
eg: 192.168.xx.xx 专门给组织内部使用的
(3).ABCD类地址

ABCD类的地址分类: (折半操作)

在这里插入图片描述

(4).域名:
1.主要目的:是为了记忆域名

2.Java 获取IP地址

基本思路:
1.InetAddress 没有构造器不能new 只能进行调用
InetAddress.getByName("www.baidu.com");  //获取域名和地址
2.获取域名(网站)的ip地址
(1).InetAddress.getByName(域名);
3.获取本机的ip地址
(1).InetAddress.getByName("127.0.0.1");
(2).InetAdress.getLocalHost();
package com.Kuangstudy.Net;
import javax.swing.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test {
    public static void main(String[] args) {
        //因为inetAddress是没有构造器的,所以new不了
        try {
            //获得百度的IP地址。
            InetAddress byName_address1 = InetAddress.getByName("www.baidu.com");
            System.out.println("百度 "+byName_address1);
            //
            System.out.println(byName_address1.getAddress());
            //获得规范的名字 也就是ip
            System.out.println(byName_address1.getCanonicalHostName());
            //获得主机的名字 还是ip
            System.out.println(byName_address1.getHostAddress());
            //获得域名
            System.out.println(byName_address1.getHostName());

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

三、端口详解

1.端口

端口表示一个程序的进程;

IP 是家属楼,端口是一户

1.不同的进程有不同的端口号,用来区分软件.
2.端口被规定为0~655353.TCP,UDP: 
每一个都有65535,也就是说一共有 65535*2,单个协议下,端口号不能冲突。TCP与UDP是两个协议
4.端口分类:
(1).公有端口:0~1023;
HTTP :80  HTTPS :443 FTP(远程链接):21 Telent(远程监听) 23 
(2).程序注册端口:1024~49151,分配用户或则程序
Tomcat : 8080 MySQL 3306 Oracle 1521
(3).动态、私有: 49152-65535

查看所有端口

|  端口流
netstat -ano  //查看所有的端口
netstat -ano|findstr "6942"  //查看指定的端口
tasklist|findstr "2460"  //查看2460的端口的进程
基本思路:
1.InetSocketAddress 

2.获取地址
inetSocketAddress_one.getAddress()

3.获取主机名
inetSocketAddress_one.getHostName()

4.获取端口号
inetSocketAddress_one.getPort()
import java.net.InetSocketAddress;

public class Test_InetSocket {
    public static void main(String[] args) {
        InetSocketAddress inetSocketAddress_one = new InetSocketAddress("127.0.0.1", 8080);
        System.out.println(inetSocketAddress_one);
        InetSocketAddress inetSocketAddress_two = new InetSocketAddress("localhost", 8080);
        System.out.println(inetSocketAddress_two);
        //获得主机的地址
        System.out.println(inetSocketAddress_one.getAddress());
        //获得主机的名字(域名)
        System.out.println(inetSocketAddress_one.getHostName());
        //获得主机的端口号
        System.out.println(inetSocketAddress_one.getPort());
    }
}

在这里插入图片描述

四、通信协议

1.定义

网络通信协议:速率,传输码率,代码结构,传输控制.....

2.TCP/IP协议(一个集合)

TCP/IP包括:
重要协议:
1.TCP:用户传输协议
2.UDP:用户数据报协议
....
出名的协议:
1.TCP: 用户传输协议
2.IP:网络互联协议

3.TCP与UDP的对比

TCP :  (eg:打电话 对方可拒绝与不可拒绝)
(1.链接稳定
(2.三次握手,四次挥手
请求连接 同意链接 链接

(3.客户端、服务端
(4.传输完成,释放链接,效率低

UDP : (eg:发短信 对方不能拒绝)
(1).不连接.不稳定
(2.客户端、服务端 (没有明确的界限)
(3.不管有没有准备好,都可以发给你.

三次握手:
1.判断两个事务是否连接上:(至少需要三次回应)
A.你瞅啥?
B:瞅你咋地?
A:打一架?
(…)链接成功

四次分手
1.判断两个事务是否断开连接:(需要四次操作)
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A我真的走了
(…)断开成功

(五)、TCP

1.TCP实现聊天的项目

Socket:  实现两台主机链接点的中间工具。(链接到指定IP,的端口号)
客户端通过申请链接服务端的端口,从而达到发送消息的模式.
serveSocket: 服务端创建套接字端口与客户端链接(与指定端口)
服务端窗口:
4.获取客户端的端口 通过服务端 套接字
ServerSocket serverSocket = new ServerSocket(9999);
5.等待客户端链接
 Socket socket=serverSocket.accept();
6.读取客户端发送的信息
InputStream is=socket.getInputStream();
7.打印输出
(1).管道流的方法
(2).教学用法
package com.Kuangstudy.Net;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class TcpClientDem0 {
    public static void main(String[] args) throws Exception{
        //1.我得有一份地址

            ServerSocket serverSocket = new ServerSocket(9999);
        //4.等待客户端链接过来
            Socket socket=serverSocket.accept();
         //5.读取客户端的信息
         InputStream is=socket.getInputStream();
         /*
         //6.设置读取得缓冲区
         byte []buf=new byte[1024];
         //7.设置判断得操作
         int count=0;
         //8.开始进行读取
         while ((count=is.read(buf))!=-1){
             System.out.println(new String(buf,0,count));
         }*/

        //管道流实现读取文件信息
        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        //6.设置缓冲区
        byte []buf=new byte[1024];
        int count=0;
        while ((count=is.read(buf))!=-1){
            byteArrayOutputStream.write(buf,0,count);
        }
        System.out.println(byteArrayOutputStream.toString());
        //先开得后关闭
        byteArrayOutputStream.close();
         is.close();
    }
}
客户端窗口:
1.初始化一个IP和端口号
2.创建一个套接字的链接,把IP和端口连接起来
 Socket socket = new Socket(inetAddress,port);
3.利用IO流的输出流进行发送信息
OutputStream os=socket.getOutputStream();

package com.Kuangstudy.Net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

//客户端
public class TcpClientDem1 {
    public static void main(String[] args) throws Exception {

            //1.要知道服务器的地址,和端口号
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port=9999;

           //2.创建一个Socket链接
           Socket socket = new Socket(inetAddress,port);
           //3.发送消息 IO流
           OutputStream os=socket.getOutputStream();
           os.write("你好呀,我是李明".getBytes());
           os.close();
    }
}

管道流的示意图
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.TCP上传文件的实现

客户端:
1.先读取(获得)文件 "123.jpg"(输入流)
2.再写入(输出)服务端文件"123.jpg";(文件输出流)
package com.Kuangstudy.Net;

import java.io.*;
import java.net.Socket;
//客户端

public class TCPDemo1 {
    public static void main(String[] args) throws Exception{
        //1.创建一个Socket链接
        Socket socket=new Socket("127.0.0.1",9000);
        //2.输出信息
        OutputStream outputStream=socket.getOutputStream();
        //3.文件输入流
        FileInputStream fileInputStream=new FileInputStream(new File("src/123.jpg"));//这样写的化是读取本idea下的文件
        //4.读取文件
        byte []buf=new byte[1024];
        int count=0;
        while ((count=fileInputStream.read(buf))!=-1){
            outputStream.write(buf,0,count);
        }

        //通知服务端我接收完毕
        socket.shutdownOutput();

        //客户端来接受信息
        InputStream inputStream_one = socket.getInputStream();
        int count_one=0;
        byte []buf_one=new byte[1024];
        while ((count_one=inputStream_one.read(buf_one))!=-1){
            System.out.println(new String(buf,0,count_one));
        }
        outputStream.close();
        fileInputStream.close();
    }
}

服务端:
1.等待服务端连接创建
2.读取(获得)客户端文件(输出流)
3.写入文件ideal中(文件写入)
package com.Kuangstudy.Net;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
//服务端

public class TCPDemo2 {
    public static void main(String[] args) throws Exception{
        //1.创建服务
        ServerSocket serverSocket=new ServerSocket(9000);
        //2.监听客户端链接
        Socket socket=serverSocket.accept();//阻塞或则监听,一直等待客户端链接 和Scanner一样
        //3.获取输入流
        InputStream inputStream=socket.getInputStream();
        //4.文件输出
        FileOutputStream fileOutputStream=new FileOutputStream(new File("receive.jpg"));
        byte[]buf=new byte[1024];
        int count=0;
        while ((count=inputStream.read(buf))!=-1){
            fileOutputStream.write(buf,0,count);
        }
        //通知客户端我传送完毕了
        OutputStream outputStream_one = socket.getOutputStream();
        outputStream_one.write("我已经传送完毕,服务端已关闭".getBytes(StandardCharsets.UTF_8));
        serverSocket.close();
        inputStream.close();
        fileOutputStream.close();
    }
}


在这里插入图片描述

(六)、Tomcat

服务端:
(1).自定义:(Serve) s
(2).Tomcat服务器(Serve) s
客户端:
(1).自定义:(Customer) c
(2).浏览器:(Broeser)  b
Tomcat 就是指一个服务器,我们可以自定义对服务器进行打开和关闭。

(七)、UDP

就好比如:发短信、发送导弹。(需要知道对方的地址)
1.DatagreamPacket (数据报包)

1.UDP实现消息发送

基本思路:
1.DatagramSocket     数据报套接字主要功能是:
(1). 开放端口 
(2). 接受报包
(3). 发送报包
2.DataframPack       数据报包的主要功能是: 
(1).缓存区 存储数据
接受
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDP_dialog_two {
    public static void main(String[] args) throws Exception {
        //1.创建数据报套接字
        DatagramSocket datagramSocket=new DatagramSocket(9090);

        //2.数据包报
            //2.1  设置缓冲区
            byte []buf=new byte[1024];
            //2.2
        DatagramPacket datagramPacket=new DatagramPacket(buf,0,buf.length);
        //3.数据报套接字
        datagramSocket.receive(datagramPacket);
        System.out.println(datagramSocket.getLocalPort()+" "+datagramSocket.getInetAddress());
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        //4.关闭
        datagramSocket.close();
    }
}

发送
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDP_dialog_one {
    public static void main(String[] args) throws Exception {
        //1.通过数据报开放端口
        DatagramSocket datagramSocket=new DatagramSocket();


        //2.进行数据报包套接字
            //2.1 信息写入
            String string="你好,我是您UDP的第一个小用户!";
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port=9090;
            //2.2 把信息补充  发送给谁
        DatagramPacket datagramPacket=new DatagramPacket(string.getBytes(),0,string.getBytes().length,inetAddress,port);
        //3.数据报传送消息
        datagramSocket.send(datagramPacket);

        //4.关闭数据报
        datagramSocket.close();

    }
}

在这里插入图片描述

2.UDP实现聊天的操作

2.1(未使用多线程单方面输入与单方面输出)

在这里插入代码片

发送者

package com.Kuangstudy.Net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//发送者1


public class UDPSenderDmeo1 {
    public static void main(String[] args) throws Exception {
        DatagramSocket datagramSocket=new DatagramSocket(8888);
        //缓冲数据:  控制台读取System.in
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        while (true){
        //读取一行
        String string_one=bufferedReader.readLine();
        byte []buf=string_one.getBytes();
        //打包
        DatagramPacket packet=new DatagramPacket(buf,0,buf.length,new InetSocketAddress("localhost",6666));  //发送给谁?
        //发送包
        datagramSocket.send(packet);

        if(buf.equals("bye")){
            break;
        }
        }
        datagramSocket.close();

    }
}

接收者

package com.Kuangstudy.Net;

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

//接收者1


public class UDPSenderDmeo2 {
    public static void main(String[] args) throws Exception {
        //1.接受的端口
        DatagramSocket datagramSocket=new DatagramSocket(6666);

        while (true) {
            //准备接受包裹
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length );
            datagramSocket.receive(datagramPacket);   //阻塞接受

            //断开连接
            byte []buf_two=datagramPacket.getData();
            //接受的数据
            String string_one=new String(buf_two,0,buf_two.length);
            //打印输出
            System.out.println(string_one.trim());
            if (string_one.trim().equals("bye".trim())){
                break;
            }
        }
        datagramSocket.close();
    }
}

在这里插入图片描述
在这里插入图片描述

2.2(多线程实现双面的输出)

发送者是:学生/接收者是老师
package com.Kuangstudy.Net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//发送者1

public class UDPSenderDmeo1 implements Runnable {

        DatagramSocket datagramSocket=null;
        BufferedReader bufferedReader=null;
        private int fromPort;
        private String toIP;
        private int toPort;
        public UDPSenderDmeo1(){
        }
    public UDPSenderDmeo1( int fromPort, String toIP, int toPort) throws Exception {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        datagramSocket=new DatagramSocket(fromPort);
        bufferedReader=new BufferedReader(new InputStreamReader(System.in));
    }

    @Override
        public void run()  {
        while (true) {
            try {
                //读取一行
                String string_one = bufferedReader.readLine();
                byte[] buf = string_one.getBytes();
                //打包
                DatagramPacket packet = new DatagramPacket(buf, 0, buf.length, new InetSocketAddress(this.toIP, this.toPort));  //发送给谁?
                //发送包
                datagramSocket.send(packet);

                if (buf.equals("bye")) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        datagramSocket.close();
    }
}

发送者是:老师 接收者是:学生
package com.Kuangstudy.Net;

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

//接收者1


public class UDPSenderDmeo2 implements Runnable {
    private String msgFrom;
    DatagramSocket datagramSocket=null;
    private int port;

    public UDPSenderDmeo2() {
    }
    public UDPSenderDmeo2(int port,String msgFrom) {
        this.msgFrom=msgFrom;
        this.port = port;
        try {
            datagramSocket=new DatagramSocket(port);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while (true) {
            try {
                //准备接受包裹
                byte[] buf = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length );
                datagramSocket.receive(datagramPacket);   //阻塞接受

                //断开连接
                byte []buf_two=datagramPacket.getData();  //获得数据
                //接受的数据
                String string_one=new String(buf_two,0,buf_two.length);
                //打印输出
                System.out.println(msgFrom+":"+string_one.trim());
                if (string_one.trim().equals("bye".trim())){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        datagramSocket.close();
    }
}

实现发送者是:学生的接口 ,接收者是:老师
import com.Kuangstudy.Net.UDPSenderDmeo1;
import com.Kuangstudy.Net.UDPSenderDmeo2;

public class TalkStudent {
    public static void main(String[] args) throws Exception {
        //开启两个线程
        new Thread(new UDPSenderDmeo1(7777,"localhost",9999)).start();
        new Thread(new UDPSenderDmeo2(8888,"老师")).start();
    }
}
实现发送者是:老师的接口 ,接收者是:学生
import com.Kuangstudy.Net.UDPSenderDmeo1;
import com.Kuangstudy.Net.UDPSenderDmeo2;

public class TalkTeacher_02 {
    public static void main(String[] args) throws Exception{
        new Thread(new UDPSenderDmeo1(5555,"localhost",8888)).start();
        new Thread(new UDPSenderDmeo2(9999,"学生")).start();
    }
}

在这里插入图片描述
在这里插入图片描述

(八)、URL

1.定义:
统一资源定位符:定位资源的,定位互联网上的某一项。
2.协议:      //IP:端口/项目名/资源
3.
(1). DNS 域名解析  www.baidu.com 实质上是:IP

1.爬取资源包

import com.Kuangstudy.Net.UDPSenderDmeo1;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class Demo2 {
    public static void main(String[] args) throws Exception{
        //下载文件
        URL url = new URL("");
        //2.链接此资源
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        //3.
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fileOutputStream=new FileOutputStream("Security.jpg");
        byte []buf=new byte[1024];
        int count=0;
        while ((count=inputStream.read(buf))!=-1){
            fileOutputStream.write(buf,0,count);
        }
        inputStream.close();
        fileOutputStream.close();
        urlConnection.disconnect();
    }
}

2.URL知识点

import java.net.URL;

public class Demo1 {
    public static void main(String[] args)throws Exception {
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=liming&password=123");
        System.out.println(url.getProtocol());  //得到协议名
        System.out.println(url.getHost());      //得到主机名
        System.out.println(url.getPort());      //得到端口号
        System.out.println(url.getPath());      //获得文件
        System.out.println(url.getFile());      //全路径
        System.out.println(url.getQuery());     //全参数

    }
}

在这里插入图片描述

"http://dl.stream.qqmusic.qq.com/C400000LQTRH4d6iQO.m4a?guid=3228671748&vkey=32B4FCD4F80B08521BEA1EB37A2AF2B1C6433807F310F20C8F78D52F4976FCC1114EC84B5EEDAE4827FA3928DEB1880E807485D82E7C1760&uin=&fromtag=120032"
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉士先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值