java 网络

计算机网络

网络体系分层:

七层模型,也称为OSI(Open System Interconnection)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
ISO 就是 Internationalization Standard Organization(国际标准组织)。

在这里插入图片描述

请添加图片描述

TCP / IP 协议

在Internet中TCP/IP协议是使用最为广泛的通讯协议。TCP/IP是英文Transmission Control Protocol/Internet Protocol的缩写,意思是“传输控制协议/网际协议”

实际生活当中有时也确实就是指这两种协议(tcp和ip)。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。

  1. TCP协议:面向连接的,可靠的流传输协议

  2. UDP协议:是不具有可靠性的且不需要建立连接数据报协议,只负责发送,不管对方是否接受,保证的是传输的效率;例如我们的视频通话

    这里所说的连接不是通常意义的连接,是有一个连接,回复,确定连接的过程

    TCP建立连接通过三次握手:

    请添加图片描述 > >TCP中断连接通过四次握手(一问一答,一问一答): > 请添加图片描述

    这里以客户端请求断开连接为例子:

    1. 客户端向服务端请求断开链接
    2. 服务端确定并应答,
    3. 服务端请求断开连接,
    4. 客户端确认并应答
  3. 网络层ip协议: 其实就是ip地址:端口号; ip地址识别具体的那一个主机,端口号识别主机上的具体那一个应用程序; ip地址是动态分配的,即每次主机入网获取的ip地址可能不同,而我们的MAC地址是固定的,不能实现复用;这也是引入ip地址的目的,避免地址不必要的浪费。 IP 地址(IPv4 地址)由32位正整数来表示,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数,例如我们的主机地址是:127.0.0.1

    ip地址又网络地址+主机地址组成

    根据网络地址的位数我们把ip地址分为ABCD四类

    ip类别网络地址位数主机地址位数
    A前8位后24位
    B前16位后16位
    C前24位后8位
    D前32位没有

    D类ip主要用于广播,多播

    端口号的确定

    • 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
    • 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。

Socket 网络编程

在java中,我们用Socket类来实现对网络的操作,socket翻译过来为套接字的意思, 套接字是网络通信中最小的单位,可以理解为一个端点,两个这样的端点通过建立连接就可以通信了; Socket本质是编程接口(API),对TCP/IP的封装。

TCP协议编程

流式套接字,面向字节流

服务端:

 		Scanner input =new Scanner(System.in);
        ServerSocket socket = new ServerSocket(6666);
        //服务端等待连接,有一个连接就返回退出,没有就一直等待客户端的连接
        Socket client = socket.accept();
        System.out.println("已连接");
		//拿到客户端的流,进行相关的读写操作
        InputStream inputStream = client.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        String s = br.readLine();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        if(s.equals("BYE")){
            bw.write(s);
            bw.newLine();

        }else{
            System.out.println(s);
            bw.write(input.next());
            bw.newLine();
        }
        bw.close();
        br.close();
        socket.close();



客户端:

  		Socket socket = new Socket("127.0.0.1",6666);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        Scanner input = new Scanner(System.in);
        System.out.print("输入发给服务端的:");
        bw.write(input.next());
        bw.newLine();
        bw.flush();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(br.readLine());
        br.close();
        bw.close();
        socket.close();
UDP协议编程

数据报式套接字,面向无连接 ,谁先收,谁先启动

UDP编程不区分客户端和服务端

   private static void udp() throws IOException {
        // 监听端口,
        DatagramSocket socket = new DatagramSocket(6666);
        //发送 send()
        String str = "hello !";
        byte [] b = str.getBytes();
        int length = b.length;
        int port = 8888;
        InetAddress inetAddress = InetAddress.getLocalHost();
        DatagramPacket dp = new DatagramPacket(b,length,inetAddress,port);
        socket.send(dp);

        //接收 receive
        byte [] bytes = new byte[1024];
        DatagramPacket dpReceive = new DatagramPacket(bytes,bytes.length);
        socket.receive(dpReceive);
        System.out.println(new String(bytes,0,dpReceive.getLength()));

        socket.close();

    }

et(bytes,bytes.length);
socket.receive(dpReceive);
System.out.println(new String(bytes,0,dpReceive.getLength()));

    socket.close();

}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值