网络编程

网络编程

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

1.1、概述:

传播交流信息,数据交换,通信

条件:

1、端口,定位到这个计算机上的资源

2、怎样传输数据

javaweb:网页编程 B/S

网络编程:TCP/IP C/S

1.2、网络通信的要素

如何实现网络的通信:

1、通信双方的地址:ip,端口号

2、规则:网络通信的协议

tcp、ftp、smtp、tcpimage-20220402124752007

小结:

网络编程中有两个主要的问题:

1、如何准确的定位到网络上的一台或者多台主机

2、找到主机之后如何进行通信

网络编程中的要素:

1、ip和端口号

2、网络通信协议

万物皆对象

1.3、ip

ip地址:inetaddress

唯一定位一台网络计算机

127.0.0.1:本机localhost

ip地址的分类

ipv4/ipv6

ipv4:127.0.0.1,4个字节组成,0-255

ipv6 :fe80::20eb:511a:7306:c04f%8 128位 8个无符号整数

公网(互联网)/私网(局域网)

ABCD类地址

域名:记忆ip问题

ip:www.vip.com

1.4、端口

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

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

被规定0-65535

TCP.UDP:65535*2 单个协议下,端口号不能冲突

端口分类

​ 共有端口0-1023

​ HTTP:80

​ HTTPS:443

​ FTP:21

​ Telent:23

​ 程序注册端口:1024-49151,分配用户或者程序

​ Tomcat:8080

​ MySQL:3306

​ Oracle:1521

​ 动态端口:49152-65535

1|netstat-ano#查看所有端口
2|netstat-ano|finder"5900"  //查看指定的端口
3|tasklist|findstr "8696" //查看指定端口的进程
    

1.5、通信协议

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

TCP/IP :用户传输协议

UDP:用户数据协议

IP:网络互联协议

TCP UDP对比

TCP:打电话

  • 连接,稳定

  • 三次握手,四次挥手

    连接最少需要三次

    A:你愁啥

    B:瞅你咋地

    A:那打一场

    断开需要四次

    A:我要走了

    B:你真的要走吗

    A:你真的真的要走吗

    B:我真的要走了

  • 客户端、服务端

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

UDP:发短信

  • 不需要连接,不稳定
  • 客户端、服务端没有明确的界限
  • 不管接收方状态,都可以发送
  • DDOS攻击:洪水攻击(饱和攻击)

1.6、TCP

客户端

  1. 连接服务器socket(端口)
  2. 发送消息
//客户端
public class TcpClientDemo01 {
    public static void main(String[] args) {
        Socket socket =null;
        OutputStream os  =null;
        try {
            //1、需要知道服务器的地址 端口号
            InetAddress ServerIp= InetAddress.getByName("127.0.0.1");
            //端口号
            int port = 9999;
            //2创建连接
            socket = new Socket(ServerIp, port);
            //3、发送消息  IO流
            os  = socket.getOutputStream();
                os.write("你好啊,欢迎回家".getBytes(StandardCharsets.UTF_8));
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (os!=null){
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
}
}

服务器

  1. 建立服务端口 seversocket
  2. 等待用户连接 accept
  3. 接受用户的消息
//服务端
public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is =null;
        ByteArrayOutputStream baos =null;

        try {
            //1 得先有一个地址
            serverSocket = new ServerSocket(9999);
            while (true){
                //2、等待客户端连接过来
                socket = serverSocket.accept();
                //3、读取客户端消息
                is = socket.getInputStream();
                //管道流
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = is.read(buffer))!=-1){

                    baos.write(buffer,0,len);
                }

                System.out.println(baos.toString());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!= null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件上传

服务器端

//服务器端
public class TcpServerDemo02 {
    public static void main(String[] args) throws Exception {
        //1、创建服务
        ServerSocket serverSocket = new ServerSocket(6666);
        //2、监听客户端的连接
        Socket socket = serverSocket.accept();  //阻塞式监听,会一直等待客户端连接
        //3、获取输入流
        InputStream is = socket.getInputStream();

        //4、文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.png"));
        byte[] buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        //通知客户端接收完毕
        OutputStream os = socket.getOutputStream();
        os.write("我接收完毕了,你可以断开了".getBytes(StandardCharsets.UTF_8));
        //关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close()
    }
}

客户端

//客户端
public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
        //1、创建连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),6666);
        //2、创建一个输出流
        OutputStream os = socket.getOutputStream();
        //3、读取文件
        FileInputStream fls = new FileInputStream(new File("C:\\Users\\lobort\\Desktop\\zhaopian.png"));
        //4、写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len=fls.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        //通知服务器,我已经结束了
        socket.shutdownOutput();
        //确定服务器接收完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[2014];
        int len2;
        while ((len2=inputStream.read(buffer2))!=-1){
            baos.write(buffer2,0,len2);
        }
        System.out.println(baos.toString());
        //5、关闭资源
        baos.close();
        inputStream.close();
        fls.close();
        os.close();
        socket.close();
    }
}

Tomcat

服务端

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

客户端

  • 自定义 c
  • 浏览器 B

1.7、UDP

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

发消息

  • 发送端
//不需要连接服务器
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;

        //数据,数据的长度起始位置,发送给谁(端口和ip)
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
        
        //3、发送包
        socket.send(packet);

        //4、关闭流
        socket.close();
    }
}
  • 接收端
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(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        
        //关闭连接
        socket.close();
    }
}

咨询

  • 循环发送消息
ublic class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {

        DatagramSocket socket = new DatagramSocket(8888);

        while (true){
            //准备数据:控制台输入 system.in
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

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


    }
}
  • 循环接收消息
public class UdpReceviveDemo01 {
    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); //阻塞式接受包

            //断开连接
            byte[] data = packet.getData();
            String receiveData = new String(data,0,packet.getLength());

            System.out.println(receiveData);

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


        }
        socket.close();

    }
}

在线咨询:两个人都可以式发送方和接收方

1.8、URL

https://www.baidu.com/

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

DNS域名解析: www.baidu.com 解析为ip

1|协议://ip地址:端口/项目名/资源
posted @ 2022-04-09 15:58  lobort  阅读(91)  评论(0)    收藏  举报