欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络编程学习笔记(java)

程序员文章站 2022-07-11 20:59:34
...

网络编程

1.1、概述

是什么

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

也就是两台计算机通过通信线路连接起来,用统一的语言(网络协议)进行交流

目的

​ 传播交流信息,进行数据交换

要求

​ 定位网络上的一台主机例如:192.168.16.124:端口,定位到计算机上的某个资源

​ 通过介质传输数据、

网络编程:TCP/IP C/S

1.2、网络通信的要素

如何实现网络的通信?

​ 通信双方的地址:

  • IP
  • 端口号

​ 规则:网络通信的协议

  • OSI七层网络模型
  • TCP/IP四层概念模型
  • 对应网络协议

1.3、IP

ip地址:InetAddress

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

  • 127.0.0.1:本机 localhost

  • IP地址的分类

    • ipv4/ipv6

      • ipv4:127.0.0.1,四个字节组成,0~255,42亿个
      • ipv6:128位,8个无符号整数!
    • 公网(互联网)-私网(局域网)

      • 192.168.xx.xx专门给组织内部使用

      • abcd类地址

        0~255对半分

  • 域名

    • IP:www.baidu.com

1.4、端口

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

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

  • 被规定0-65536

  • TCP/UDP:65536*2(都有65536个) tcp:80,udp:80,单个协议下,端口号不能冲突

  • 端口分类

    • 公有端口 0-1023

      • HTTP:80

      • HTTPS:443

      • FTP:21

    • 程序注册端口:1024-49151

      • Tomcat:8080
      • MySQL:3306
    • 动态,私有:49152-65535

      netstat -ano # 查看所有端口

1.5、通信协议

协议:约定,就好比我们现在说的普通话。

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

大事化小:分层

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

  • TCP:用户传输协议
  • UDP:传输控制协议

TCP UDP对比

​ TCP:相当于打电话

  • 连接,稳定

  • 三次握手,四次挥手

    例:

    最少需要三次,才能建立连接

    A:你瞅啥

    B:瞅你咋地

    A:干一场

    A:我要断开了

    B:我知道了

    B:你断开了么

    A:我断开了

  • 客户端,服务端

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

​ UDP:相当于发短信

  • 不连接,不稳定
  • 客户端,服务端没有明确的界限
  • 不管有没有准备好,都可以发给你

1.6、TCP

客户端

  1. 连接服务器 Socket
  2. 发送消息
package com.wangluo.study01;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;

//客户端
public class TcpDemo01 {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        //1.要知道服务器地址
        try {
            //1.获得服务器地址
            InetAddress severip = InetAddress.getByName("127.0.0.1");
            //2.端口号
            int port=8800;
            //3.创建一个socket连接
            socket = new Socket(severip,port);
            //4.发送消息 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();
                }
            }
        }
    }
}

catch和finally部分可以不看,io流知识

服务器

  1. 建立服务端口 ServerSocket
  2. 等待用户的连接 accept
  3. 接收用户消息
package com.wangluo.study01;

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

//服务器
public class TcpServerDemo02 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket =null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        //1.建立一个地址
        try {
            serverSocket = new ServerSocket(8800);
                while (true){
                    //2.等待客户端连接
                    socket = serverSocket.accept();
                    is = socket.getInputStream();
                    //3.创建管道流(防止汉字乱码)
                    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();
                }
            }
            }
        }
}

结合使用文件传输

客户端

package com.wangluo.study02;

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

public class TcpClientDemo02 {
    public static void main(String[] args) throws IOException {
        //创建一个socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9900);
        //创建一个输出流
        OutputStream os = socket.getOutputStream();
        //文件流
        FileInputStream fis = new FileInputStream("src/com/wangluo/study02/祢豆子.jpg");
        byte[] buffer = new byte[1024];
        int len;
        while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        //关闭资源
        fis.close();
        os.close();
        socket.close();
    }
}

服务器

package com.wangluo.study02;

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

public class TcpServerDemo02 {
    public static void main(String[] args) throws IOException {
        //创建服务
        ServerSocket serverSocket = new ServerSocket(9900);
        //监听客户端
        Socket soc = serverSocket.accept();
        //获取输入流
        InputStream is = soc.getInputStream();
        //文件输出
        FileOutputStream fos = new FileOutputStream("src/com/wangluo/study02/祢豆子2.jpg");
        byte[] buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        //关闭资源
        fos.close();
        is.close();
        soc.close();
        serverSocket.close();
    }
}

这里为了节省代码量使用此种方法抛出异常,推荐try,catch抛出异常。

1.7、UDP

了解即可

发送端

package com.wangluo.study03;

import java.io.IOException;
import java.net.*;

public class UdpClientDemo01 {
    public static void main(String[] args) throws IOException {

        //1.建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //2.建个包
        String msg="你好服务器";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port=9190;
        //数据,数据的长度起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
        //3.发送包
        socket.send(packet);
        socket.close();
    }
}

接收端

package com.wangluo.study03;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//等待客户端的连接
public class UdpServerDemo01 {
    public static void main(String[] args) throws IOException {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9190);
        //接收数据包
        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();
    }
}