java补充:网络编程

1 概述

计算机网络

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

网络编程

  • 在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换

网络编程三要素

  1. IP地址
    要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而lP地址就是这个标识号。也就是设备的标识

  2. 端口
    如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识

  3. 协议
    连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议

2 InetAddress使用(ip)

这个类表示的是ip地址
java补充:网络编程

端口

端口:设备上应用程序的唯一标识

端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败

3 协议

协议:计算机网络中,连接和通信的规则被称为网络通信协议

UDP

无连接,不可靠传输

TCP

面向连接,可靠无差错
三次握手

4 UDP通信

UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象

通信双方没有客户端和服务端

Java提供了DatagramSocket类作为基于UDP协议的Socket

UDP发送数据的步骤

1 创建发送端的Socket对象(DatagranSocket)

DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口

2 创建数据,并把数据打包

创建数据,并把数据打包
DatagramPacket (byte[ ] buf, int length,InetAddress oddress, int port)

3 调用DatagramSocket对象的方法发送数据

调用DatagramSocket对象的方法发送数据
void send (DatagramPacket p)从此套接字发送数据报包

4 关闭发送端

关闭发送端
void close 关闭此数据报套接字

package com.yy;

import org.junit.Test;

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

public class UDPTest {

    @Test
    public void SendTest() throws Exception {
        //DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口
        DatagramSocket ds = new DatagramSocket();
        //创建数据,并把数据打包
        //DatagramPacket (byte[ ] buf, int length,InetAddress oddress, int port)
        //构造一个数据包,发送长度为length的数据包到指定主机上的指定端口号。
        byte[] bytes = "upd,我来了".getBytes();
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.20.220"),10086);

        //调用DatagramSocket对象的方法发送数据
        //void send (DatagramPacket p)从此套接字发送数据报包
        ds.send(dp);
        //关闭发送端
        //void close 关闭此数据报套接字
        ds.close();
    }
}

UDP接收数据

接收数据的步骤

  1. 创建接收端的Socket对象(DatagramSocket)
    DatagramSocket (int port)构造数据报套接字并将其绑定到本地主机上的指定端口
  2. 创建一个数据包,用于接收数据
    DatagramPacket (byte[J buf,int length)构造一个DatogramPacket用于接收长度为 length数据包
  3. 调用DatagramSocket对象的方法接收数据
    调用DatagramSocket对象的方法接收数据
  4. 解析数据包,并把数据在控制台显示
    byte[] getData()返回数据缓冲区
    int getLength()返回要发送的数据的长度或接收到的数据的长度
  5. 关闭接收端
@Test
    public void sdTest() throws Exception {
        //1. 创建接收端的Socket对象(DatagramSocket)
        //DatagramSocket (int port)构造数据报套接字并将其绑定到本地主机上的指定端口
        DatagramSocket ds = new DatagramSocket(10086);
        //2. 创建一个数据包,用于接收数据
        //DatagramPacket (byte[J buf,int length)构造一个DatogramPacket用于接收长度为 length数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        //3. 调用DatagramSocket对象的方法接收数据
        ds.receive(dp);
        //4. 解析数据包,并把数据在控制台显示
        // byte[] getData()返回数据缓冲区
        byte[] datas  =dp.getData();
        //int getLength()返回要发送的数据的长度或接收到的数据的长度
        int length = dp.getLength();
        String dataString = new String(datas,0,length);
        System.out.println("date is : "+dataString);
        //5. 关闭接收端
        ds.close();
    }

在运行该方法时,执行上面的发送方法,如何会将上面的结果进行获取,如下图所示
java补充:网络编程

5 TCP通信

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链趵一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信

Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信

Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

TCP发送数据

TCP发送数据的步骤

  1. 创建客户端的Socket对象(Socket)
    ocket (String host,int port)创建流套接字并将其连接到指定主机上的指定端口号
  2. 获取输出流,写数据
    outputStream getoutputStream()返回此套接字的输出流
  3. 释放资源
@Test
    public void SendTest() throws Exception {
        //1. 创建客户端的Socket对象(Socket)
        //Socket (InetAddress address, int port)创建流套接字并将其连接到指定IP地址的指定端口号
//        InetAddress byName1 = InetAddress.getByName("www.baidu.com");
//        InetAddress byName2 = InetAddress.getByName("192.168.20.220");
//        InetAddress byName3 = InetAddress.getByName("localhost");
//        System.out.println(byName1+"-----"+byName2+"-----------"+byName3);//www.baidu.com/110.242.68.3-----/192.168.20.220-----------localhost/127.0.0.1

        //Socket (String host,int port)创建流套接字并将其连接到指定主机上的指定端口号
        Socket s = new Socket("192.168.20.220",10000);

        //2. 获取输出流,写数据
        //outputStream getoutputStream()返回此套接字的输出流
        OutputStream os = s.getOutputStream();
        os.write("tcp,I am coming".getBytes());

        //3. 释放资源
        os.close();

    }

TCP接收数据

TCP接收数据的步骤

  1. 创建服务器端的Socket对象(ServerSocket)
    ServerSocket (int port)创建绑定到指定端口的服务器套接字

  2. 监听客户端连接,返回一个Socket对象
    Socket accept ()侦听要连接到此套接字并接受它

  3. 获取输入流,读数据,并把数据显示在控制台
    InputStream getInputStream()

  4. 释放资源
    void close()

@Test
    public void sdTest() throws Exception {
        //1. 创建服务器端的Socket对象(ServerSocket)
        //ServerSocket (int port)创建绑定到指定端口的服务器套接字
        ServerSocket ss = new ServerSocket(10086);
        //Socket accept ()侦听要连接到此套接字并接受它
        Socket accept = ss.accept();

        //2. 获取输入流,读数据,并把数据显示在控制台
        InputStream is = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read();
        String data = new String(bytes,0,len);
        System.out.println("data is : "+ data);
        //3. 释放资源
        ss.close();
        accept.close();
    }
上一篇:Docker常用命令


下一篇:2020华为秋招笔试题第一题C++实现(istringstream和unordered_map)