• 网络编程(InetAddress类、UDP、TCP)


    1、InetAddress类

    (1)IP和端口号:

    IP(InternetProtocol,IP)互联网协议地址:唯一标识一台计算机。

    端口号:用于区分不同的应用程序。取值范围是0~65535,其中0~1023被系统保留。

    在计算机A访问计算机B是通过IP地址进行查找的,接着在计算机B上通过应用程序的端口号找到相应的程序。

    (2)InetAddress类常用方法:

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class InetAddressDemo {
        public static void main(String[] args) {
    
            try {
                InetAddress local = InetAddress.getLocalHost();
    
                System.out.println(local.getHostAddress());// 返回本地主机地址
                System.out.println(local.getHostName());// 主机名
    
                InetAddress address = InetAddress.getByName("主机名");
                System.out.println(address);
    
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }

    2、UDP协议

    (1)概念:

    UDP (User Datagram Protocol)用户数据报协议,在数据传输时彼此之间不需要建立连接,传输前需要把数据定义成数据报,并且传输效率高,但是不安全。

    (2)DatagramPacket类

    用于封装UDP通信中发送和接收的数据。

    第一个构造方法指明了数据包的大小,用于接收数据。

    第二个构造方法指明了数据包的大小,目标地址、端口号,用于发送数据。

    (3)DatagramSocket类

    接收和发送数据包。

     第一个构造方法中,系统会随机分配一个空闲端口,用于发送端。

    第二个构造方法,需要指定端口号,既可以用于发送端也可用于接收端。

    (4)应用:

    发送端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    public class Send {
        public static void main(String[] args) {
            while (true) {
                DatagramSocket send;
                System.out.println("请输入数据:");
    
                Scanner sc = new Scanner(System.in);
                String str = sc.next();
                try {
                    send = new DatagramSocket(3001);// 发送数据包
                    byte[] buffer = str.getBytes();
                    DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
                            InetAddress.getByName("主机名"), 3000);// 封装数据
                    // InetAddress.getByName("主机名"),获取端口号
                    send.send(dp);// 发送
                    send.close();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }

    接收端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class Receive {
        public static void main(String[] args) throws SocketException {
    
            DatagramSocket receive = new DatagramSocket(3000);
    
            byte[] buf = new byte[1024];
            while (true) {
                DatagramPacket dp = new DatagramPacket(buf, 1024);
                try {
                    receive.receive(dp);
                } catch (IOException e) {
    
                    e.printStackTrace();
                }
                String strRecv = new String(dp.getData(), 0, dp.getLength())
                        + "     " + "来自" + dp.getAddress() + "  " + dp.getPort();
                System.out.println(strRecv);
            }
    
        }
    }

     3、TCP通信

    (1)概念:

    TCP通信分为客户端和服务器端,实现通信必须由客户端连接服务端。

    (2)Socket类(客户端):

    可以指定IP地址和端口号,可以根据IP和端口号运行服务端程序,只是IP地址的形式不同。

    (3)ServerSocket类(服务器端):

    没有绑定端口号,需要调用bind方法。

    可以绑定端口号,默认最大连接数量为50。

    可以绑定端口号,指定最大连接数量。

    可以绑定端口号,指定最大连接数量、IP地址。适用于计算机上有多块网卡和多个 IP。

    (4)应用:

    客户端,可以一直发送数据:

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    public class Client {
        public static void main(String[] args) throws UnknownHostException,
                IOException {
            Socket s = new Socket(InetAddress.getByName("DESKTOP-R14D2UH"), 7999);// 通过IP和端口号连接服务器
            OutputStream out = s.getOutputStream();
    
            out.write("客户端已启动".getBytes());
            InputStream in = s.getInputStream();
            byte[] buffer = new byte[1024];
            int length = in.read(buffer);
            System.out.println(new String(buffer, 0, length));
    
            while (true) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入数据到服务器:");
                String str = sc.next();
                out.write(str.getBytes());
    
            }
    
        }
    }

    服务器,一直接收客户端发送的数据:

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(7999);
            Socket s = ss.accept();// 在服务端的指定端口监听客户端发来的连接请求,并与之连接
            OutputStream out = s.getOutputStream();
            out.write("你已经连接上了服务器".getBytes());// 字节输出
            while(true){
            InputStream in = s.getInputStream();
            byte[] buffer = new byte[1024];
            int length = in.read(buffer);
            System.out.println(new String(buffer, 0, length));}
        
    
        }
    }
  • 相关阅读:
    获取单选框的值
    HTML5本地存储详解
    设为首页和加入收藏
    用PhotoSwipe制作相册,手势可放大
    iOS 加载本地 HTML 文件 CSS 样式图片无效果
    PhotoSwipe简介
    Flexslider图片轮播、文字图片相结合滑动切换效果
    网页中插入视频的方法----腾讯、优酷为例
    webapp在Android中点击链接的时候会有淡蓝色的遮罩层
    C# 获取北京时间 (根据纪元时间(1970/1/1)转换为DateTime)
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11385495.html
Copyright © 2020-2023  润新知