【Java】 网络编程

1.1 概述

计算机网络:

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

网络编程的目的:

无线电台—传播交流信息,数据交换。通信

想要达到这个效果需要什么:

  1. 如何准确定位网络上的一台主机 端口,定位到这个计算机上的某个资源
  2. 找到了这个主机,如何传输数据呢?

javaweb:网页编程 B/S架构

网络编程:TCP/IP C/S架构

1.2 网络通信的要素

如何实现网络的通信?

通信双方的地址:

  • IP
  • 端口号

规则:网络信息的协议

TCP/IP参考模型

preload

小结:

  1. 网络编程中有两个主要的问题:
    • 如何准确定位到网络上的一台或者多台主机
    • 找到主机后如何进行通信
  2. 网络编程中的要素
    • IP 和 端口号 IP
    • 网络通信协议 UDP,TCP
  3. 万物皆对象

1.3 IP

ip地址:InetAdress

  • 唯一定位一台网络上的计算机

  • 127.0.0.1:本机localhost

  • ip地址的分类

    • ipv4/ipv6

      • IPV4 127.0.0.1 ,四个字节组成。 , 0~255, 42亿~ ;30亿都在北美, 亚洲4亿 , 2011年就用尽

      • IPV6 128位,8个无符号整数

        2001: 0bb2: aaaa: 0015: 0000: 0000: 1aaa: 1312

    • 公网(互联网)-私网(局域网)

      • ABCD类地址
      • 192.168.xx.xx,专门给祖组织内部使用的
  • 域名问题:记忆IP问题!

    • IP:www.vip.com
package com.GeniusSue.lesson01;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson01
 * @ClassName : .java
 * @createTime : 2022/8/29 14:07
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TestInetAdress {
    public static void main(String[] args) {
        try {
            //查询本机地址
            InetAddress allByName01 = InetAddress.getByName("127.0.0.1");
            InetAddress allByName02 = InetAddress.getByName("localhost");
            InetAddress allByName03 = InetAddress.getLocalHost();
//            System.out.println(allByName01);
//            System.out.println(allByName02);
//            System.out.println(allByName03);

            //查询网站ip
            InetAddress inetAddress=InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress);


            //常用方法
            //System.out.println(inetAddress.getAddress());
            System.out.println(inetAddress.getHostName());//ip
            System.out.println(inetAddress.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress.getHostAddress());//域名,或者自己电脑的名字


        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }
}

1.4 端口

端口表示计算机上的一个程序的进程:

  • 不同的进程有不同的端口号!用来区分软件!

  • 被规定0~65535

  • TCP,UDP:65535*2 tcp80,udp80,单个写一下,端口号不能冲突

    • 共有端口0~1023
      • HTTP:80
      • HTTPS:443
      • FTP:21
      • Telent:23
    • 程序注册端口:分配1024~49151,分配用户或者程序
      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 动态、私有:49152~65535
    netstat -ano #查看所有端口
    netstat -ano | findstr "5900" #查看指定端口
    tasklist|findstr "8696" #查看指定端口进程
    Ctrl+Shift+Esc   #任务管理器
    
    package com.GeniusSue.lesson01;
    
    import java.net.InetSocketAddress;
    
    /**
     * Created with IntelliJ IDEA.
     *
     * @author : Genius Sue
     * @version : 1.0
     * @Project : Study
     * @Package : com.GeniusSue.lesson01
     * @ClassName : .java
     * @createTime : 2022/8/29 14:30
     * @Email : 1420779618@qq.com
     * @公众号 :
     * @Website :
     * @Description :
     */
    public class TestInetSocketAddress {
        public static void main(String[] args) {
            InetSocketAddress inetSocketAddress01 = new InetSocketAddress("127.0.0.1", 8080);
            InetSocketAddress inetSocketAddress02 = new InetSocketAddress("localhost", 8080);
            System.out.println(inetSocketAddress01);
            System.out.println(inetSocketAddress02);
    
            System.out.println(inetSocketAddress01.getAddress());
            System.out.println(inetSocketAddress01.getHostName());//地址
            System.out.println(inetSocketAddress01.getPort());//端口号
    
    
        }
    }
    
    

1.5 通信协议

协议:约定

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

问题:非常复杂?

大事化小->分层

TCP/IP协议簇:实际上是一组协议

重要

  • TCP:用户传输协议
  • UDP:用户数据报协议

出名的协议:

  • TCP:
  • IP:网络互连协议
    请添加图片描述

TCP UDP对比

TCP:打电话

  • 连接,稳定

  • 三次握手 四次(挥手)分手

    最少需要三次,保证稳定连接!
    A:你瞅啥?
    B:瞅你咋地?
    A:打一架!
    
    A:我要走了!
    B:我真的要走了吗?
    B:你真的真的要走了吗?
    A:我真的要走了!
    
  • 客户端、服务端

  • 传输完成,释放连接,效率低

UDP:发短信

  • 不连接,不稳定
  • 客户端,服务端:没有明确的衔接

1.6 TCP

客户端

  1. 连接服务器Socket

  2. 发送消息

package com.GeniusSue.lesson02;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson02
 * @ClassName : .java
 * @createTime : 2022/8/29 14:47
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */

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

        Socket socket=null;
        OutputStream outputStream=null;
        try {
            //1.要知道服务器的地址,端口号
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2.创建一个socket连接
            socket = new Socket(serverIP,port);
            //3.发送消息 IO流
            outputStream = socket.getOutputStream();
            outputStream.write("你好欢迎学习狂神说JAVA".getBytes());


        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if (outputStream!=null)
            {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
           if ((socket!=null))
           {
               try {
                   socket.close();
               } catch (IOException e) {
                   throw new RuntimeException(e);
               }
           }


        }


    }
}

服务器

  1. 建立服务器的端口ServerSocket
  2. 等待用户的连接通过accept
  3. 接收用户的消息
package com.GeniusSue.lesson02;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson02
 * @ClassName : .java
 * @createTime : 2022/8/29 14:47
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */


//服务端
public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream inputStream=null;
        ByteArrayOutputStream byteArrayOutputStream=null;
        try {
            //1.我得有一个地址
            serverSocket = new ServerSocket(9999);
            //2.等待客户端连接
            socket = serverSocket.accept();
            //3.读取客户端的消息
            inputStream = socket.getInputStream();

            //管道流
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len=inputStream.read(buffer))!=-1)
            {
                byteArrayOutputStream.write(buffer,0,len);
            }
            System.out.println(byteArrayOutputStream.toString());


            } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //关闭资源
            if (byteArrayOutputStream!=null)
            {
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
           if (inputStream!=null)
           {
               try {
                   inputStream.close();
               } catch (IOException e) {
                   throw new RuntimeException(e);
               }
           }
           if (socket!=null)
           {
               try {
                   socket.close();
               } catch (IOException e) {
                   throw new RuntimeException(e);
               }
           }

           if (serverSocket!=null)
           {
               try {
                   serverSocket.close();
               } catch (IOException e) {
                   throw new RuntimeException(e);
               }
           }

        }


    }
}

文件上传

服务器端

package com.GeniusSue.lesson02;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson02
 * @ClassName : .java
 * @createTime : 2022/8/29 15:24
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TcpServerDemo02 {
    public static void main(String[] args) throws Exception{
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2.监听客户端的连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
        //3.获取输入流
        InputStream in = socket.getInputStream();

        //4.文件输出
        FileOutputStream fileInputStream = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=in.read(buffer))!=-1)
        {
         fileInputStream.write(buffer,0,len);
        }


        //通知客户端接收完毕
        OutputStream out = socket.getOutputStream();
        out.write("我接收完毕了,你可以断开了".getBytes());


        //关闭资源
        fileInputStream.close();
        in.close();
        socket.close();
        serverSocket.close();
    }
}

客户端

package com.GeniusSue.lesson02;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson02
 * @ClassName : .java
 * @createTime : 2022/8/29 15:17
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {

        //1.创建一个socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //2.创建一个输出流
        OutputStream out = socket.getOutputStream();

        //3.读取文件
        FileInputStream fileInputStream = new FileInputStream(new File("wxtx.jpg"));
        //4.写出文件
        byte[] buffer01 = new byte[1024];
        int len;
        while ((len=fileInputStream.read(buffer01))!=-1)
        {
            out.write(buffer01,0,len);
        }


        //通知服务器,我已经结束了
        socket.shutdownOutput();//我已经传输完了!

        //确定服务器接收完毕,才能够断开连接
        InputStream in = socket.getInputStream();
        //String byte[]
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] buffer02 = new byte[1024];
        int len2;
        while ((len=in.read(buffer02))!=-1)
        {
            byteArrayOutputStream.write(buffer02, 0, len);
        }
        System.out.println(byteArrayOutputStream.toString());

        //5.关闭资源
        byteArrayOutputStream.close();
        in.close();
        fileInputStream.close();
        out.close();
        socket.close();


    }
}

Tomcat

服务端

  • 自定义 S
  • Tomcat服务器 S: java后台开发

客户端

  • 自定义 C
  • 浏览器 B

1.7 UDP

发短信:不用连接,需要知道对地址


发送消息

发送端

package com.GeniusSue.lesson03;

import java.net.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson03
 * @ClassName : .java
 * @createTime : 2022/8/29 16:08
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
//不需要连接服务器
public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1.建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        //2.建个包
        String msg="你好啊,服务器!";

        //发送给谁
        InetAddress localhost = InetAddress.getByName("localhost");
        int port=9090;
        //数据,数据的长度起始,发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);


        //3.发送包
        socket.send(packet);

        //4.关闭流
        socket.close();


    }

}

接收端

package com.GeniusSue.lesson03;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson03
 * @ClassName : .java
 * @createTime : 2022/8/29 16:15
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */

//还是需要等待客户端的连接!
public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接收数据包
        byte[] buffer = new byte[1024];

        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);//阻塞接收


        System.out.println(new String(packet.getData(),0,packet.getLength()));

        //关闭连接
        socket.close();


    }
}

循环发送消息

package com.GeniusSue.chat;

import java.beans.beancontext.BeanContext;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.chat
 * @ClassName : .java
 * @createTime : 2022/8/29 16:32
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class UdpSenderDemo01 {

    public static void main(String[] args) throws Exception {

        DatagramSocket socket = new DatagramSocket(8888);

        //准备数据:控制台读取 System.in
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while (true)
        {
            String data = reader.readLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));

            socket.send(packet);
            if (data.equals("bye"))
            {
                break;
            }
        }


        socket.close();

    }

}

循环接收消息

package com.GeniusSue.chat;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.chat
 * @ClassName : .java
 * @createTime : 2022/8/29 16:33
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class UdpReceiveDemo01 {

    public static void main(String[] args)throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);

        while (true)
        {
            //准备接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container,0,container.length );

            socket.receive(packet);//阻塞式接收包裹

            //断开连接 bye
            byte[] data = packet.getData();
            String receivedata = new String(data, 0, data.length).trim();

            //将接收的数据读取出来
            System.out.println(receivedata);

            if (receivedata.equals("bye"))
            {
                break;
            }



        }

        socket.close();


    }
}

在线咨询:两个人都可以是发送方,也都可以是接收方!

发送线方程体

package com.GeniusSue.chat;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.chat
 * @ClassName : .java
 * @createTime : 2022/8/29 17:02
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TalkReceive implements Runnable{
    DatagramSocket socket=null;

    private int port;
    private String msgFrom;

    public TalkReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom=msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void run() {

        while (true)
        {

            try {
                //准备接收包裹
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container,0,container.length );

                socket.receive(packet);//阻塞式接收包裹

                //断开连接 bye
                byte[] data = packet.getData();
                String receivedata = new String(data, 0, data.length).trim();

                //将接收的数据读取出来
                System.out.println(msgFrom+": "+receivedata);

                if (receivedata.equals("bye"))
                {
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }




        }

        socket.close();

    }
}

接收方线程体

package com.GeniusSue.chat;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.chat
 * @ClassName : .java
 * @createTime : 2022/8/29 16:51
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TalkSend implements Runnable{
    DatagramSocket socket=null;
    BufferedReader reader=null;
    
    private int fromPort;
    private String toIP;
    private int toPort;

    public TalkSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
         try {
             socket = new DatagramSocket(fromPort);
             reader = new BufferedReader(new InputStreamReader(System.in));
         } catch (SocketException e) {
             throw new RuntimeException(e);
         }


    }

    @Override
    public void run() {

        while (true)
        {
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));

                socket.send(packet);
                if (data.equals("bye"))
                {
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }


        socket.close();

        
    }
}

执行学生端线程

package com.GeniusSue.chat;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.chat
 * @ClassName : .java
 * @createTime : 2022/8/29 17:07
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777, "localhost", 9999)).start();
        new Thread(new TalkReceive(8888, "老师")).start();

    }
}

执行老师端线程

package com.GeniusSue.chat;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.chat
 * @ClassName : .java
 * @createTime : 2022/8/29 17:09
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class TalkTeacher {

    public static void main(String[] args) {
        new Thread(new TalkSend(5555, "localhost", 8888)).start();
        new Thread(new TalkReceive(9999, "学生")).start();

    }
}

1.8 URL

https://www.baidu.com/

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS域名解析->www.baidu.com xxx.x…x…x

协议://ip地址:端口/项目名/资源
package com.GeniusSue.lesson04;

import com.sun.org.apache.bcel.internal.generic.NEW;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Genius Sue
 * @version : 1.0
 * @Project : Study
 * @Package : com.GeniusSue.lesson04
 * @ClassName : .java
 * @createTime : 2022/8/30 9:06
 * @Email : 1420779618@qq.com
 * @公众号 :
 * @Website :
 * @Description :
 */
public class URLDown {
    public static void main(String[] args) throws IOException {
        //1.下载地址
        URL url = new URL("http://localhost:8080/Genius_Sue/SecurityFile.txt");

        //2.连接到这个资源 HTTP
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream stream = new FileOutputStream("SecurityFile.txt");

        byte[] buffer = new byte[1024];
        int len;
        while((len=inputStream.read(buffer))!=-1)
        {

            stream.write(buffer,0,len);//写出这个数据
        }
        stream.close();
        inputStream.close();
        urlConnection.disconnect();

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Genius-Sue

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

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

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

打赏作者

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

抵扣说明:

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

余额充值