【Java基础】知识点八:网络编程

网络编程

  • 网络编程概述
    • 计算机网络
    • 目的
    • 两个问题:
  • 网络通信要素
    • IP和端口号
    • 网络通信协议
      • TCP协议
      • UDP协议(适合播放视频)

网络编程概述

计算机网络

分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规
模大、功能强的网络系统称为计算机网络

目的

直接或间接地通过网络协议与其他计算机实现数据交换,进行通讯

两个问题:

①如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
②找到主机后如何可靠高效地进行数据传输

网络通信要素

IP和端口号

IP:唯一的标识 Internet 上的计算机(通信实体),在Java中使用InetAddress类代表IP

如何实例化InetAdress两个方法:getByName(String host)/getLocalHost()
两个常用方法:getHostAddress()、getHostName()

IP分类:IPv4 和 IPv6 ; 万维网和局域网

端口号:正在计算机上运行的进程。
要求:不同的进程有不同的端口号
范围:被规定为一个 16 位的整数 0~65535。

端口号与IP地址的组合得出一个网络套接字:Socket
public class InetAddressTest {
     

    public static void main(String[] args) {
     

        try {
     
            InetAddress inet1 = InetAddress.getByName("192.168.10.14");
            System.out.println(inet1);// inet1 = /192.168.10.14

            InetAddress inet2 = InetAddress.getByName("www.atguigu.com");
            System.out.println(inet2);//www.atguigu.com/117.34.7.111

            InetAddress inet3 = InetAddress.getByName("127.0.0.1");
            System.out.println(inet3);// /127.0.0.1

            //获取本机IP
            InetAddress inet4 = InetAddress.getLocalHost();
            System.out.println(inet4);

            //getHostName()
            System.out.println(inet1.getHostName());

            //getHostAddress()
            System.out.println(inet2.getAddress());

        } catch (UnknownHostException e) {
     
            e.printStackTrace();
        }

    }
}

网络通信协议

【Java基础】知识点八:网络编程_第1张图片

TCP协议

使用TCP协议前,须先建立TCP连接,形成传输数据通道
传输前,采用“三次握手”方式,点对点通信,是可靠的
TCP协议进行通信的两个应用进程:客户端、服务端。
在连接中可进行大数据量的传输,传输完毕,需释放已建立的连接,效率低

示例:客户端发送信息给服务端,服务端将数据显示在控制台上

public class TCPTest {
     
    //客户端
    @Test
    public void client()  {
     
        Socket socket = null;
        OutputStream os = null;
        try {
     
            //1.创建Socket对象,指明服务器端的ip和端口号
            InetAddress inet = InetAddress.getByName("192.168.14.100");
            socket = new Socket(inet,8899);
            //2.获取一个输出流,用于输出数据
            os = socket.getOutputStream();
            //3.写出数据的操作
            os.write("你好,我是客户端mm".getBytes());
        } catch (IOException e) {
     
            e.printStackTrace();
        } finally {
     
            //4.资源的关闭
            if(os != null){
     
                try {
     
                    os.close();
                } catch (IOException e) {
     
                    e.printStackTrace();
                }

            }
            if(socket != null){
     
                try {
     
                    socket.close();
                } catch (IOException e) {
     
                    e.printStackTrace();
                }

            }
        }
    }
    //服务端
    @Test
    public void server()  {
     

        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
     
            //1.创建服务器端的ServerSocket,指明自己的端口号
            ss = new ServerSocket(8899);
            //2.调用accept()表示接收来自于客户端的socket
            socket = ss.accept();
            //3.获取输入流
            is = socket.getInputStream();
            //4.读取输入流中的数据
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[5];
            int len;
            while((len = is.read(buffer)) != -1){
     
                baos.write(buffer,0,len);
            }

            System.out.println(baos.toString());
            System.out.println("收到了来自于:" + socket.getInetAddress().getHostAddress() + "的数据");
        } catch (IOException e) {
     
            e.printStackTrace();
        } finally {
     
            if(baos != null){
     
                //5.关闭资源
                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(ss != null){
     
                try {
     
                    ss.close();
                } catch (IOException e) {
     
                    e.printStackTrace();
                }
            }
        }
    }
}

UDP协议(适合播放视频)

将数据、源、目的封装成数据包,不需要建立连接
每个数据报的大小限制在64K内
发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
可以广播发送,发送数据结束时无需释放资源,开销小,速度快
public class UDPTest {
     

    //发送端
    @Test
    public void sender() throws IOException {
     

        DatagramSocket socket = new DatagramSocket();
        String str = "我是UDP方式发送的导弹";
        byte[] data = str.getBytes();
        InetAddress inet = InetAddress.getLocalHost();
        DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
        socket.send(packet);
        socket.close();
    }
    //接收端
    @Test
    public void receiver() throws IOException {
     

        DatagramSocket socket = new DatagramSocket(9090);
        byte[] buffer = new byte[100];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
    }
}

你可能感兴趣的:(Java基础,java)