我是靠谱客的博主 哭泣啤酒,最近开发中收集的这篇文章主要介绍大数据 -- java基础16 网络编程 TCP UDP,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、网络编程的三要素:
    (1)IP地址
    (2)端口号
    (3)协议
2、IP地址 : 网络中计算机唯一标识。
(1)IP地址在计算机中存储的时候是由二进制的形式进行存储的:
    IP:192.168.7.42   十进制
    换算成二进制:   11000000.10101000.00000111.00101010
    实际上存储的是:  11000000101010000000011100101010

    为了方便IP地址的标识,就把IP地址上的每一个字节上的数据转换成10进制,然后字节与字节之间用 . 分割标识。
    这样的表示法叫做 : 点分十进制表示法

(2)IP地址的组成:  网络号段 + 主机号段

(3)IP地址的分类:
    A:第一个号段定义为网络号段 + 后面三个号段都是为主机号段  (主机号段:将来可以连接多少台电脑)
        可以有多少台主机相连:    (3个号段): 256*256*255       11111111*11111111*11111110 = 256*256*255
    B:前两个号段为网络号段 + 后两个号段为主机号段      256*255
    C:前三个号段都为网路号段 + 最后一个号段为主机号段   255 局域网
    D:224.0.0.1---239.255.255.254
    E:240.0.0.1---247.255.255.254

(4)特殊的IP地址:
    1、loaclhost = 本机 = 127.0.0.1
        127.0.0.1 : 回环地址,可以用于测试本机的网络是否有问题, 检测方法: ping 127.0.0.1

    2、广播地址:
        x.x.x.255

    3、网络地址:
        x.x.x.0

3、为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用:

    InetAddress的方法:

    (1)public static InetAddress getByName(String host)   确定主机名称的IP地址。

    (2)public String getHostName()  获取此IP地址的主机名。

    (3)public String getHostAddress()   返回文本显示中的IP地址字符串。

    (4)getAddress()   返回此InetAddress对象的原始IP地址。
public class InetAddressDemo {
    public static void main(String[] args) {

        //public static InetAddress getByName(String host)   确定主机名称的IP地址。
        InetAddress name = null;
        try {
            name = InetAddress.getByName("192.168.7.18");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        System.out.println(name);         //  /192.168.7.18


        //public String getHostName()  获取此IP地址的主机名。
        String hostName = name.getHostName();
        System.out.println(hostName);     // XiaoWang


        //public String getHostAddress()   返回文本显示中的IP地址字符串。
        String hostAddress = name.getHostAddress();
        System.out.println(hostAddress);      // 192.168.7.18  (这是一个字符串)
    }
}

4、TCP

        建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

/**
 *                       -----------TCP客户端----------------
 *
 *       TCP协议客户端代码实现:
 *           1、创建客户端的Socket对象     -- 这一步如果成功创建对象,就说明连接已经建立成功
 *             构造方法: (1)Socket(InetAddress address, int port)   创建流套接字并将其连接到指定IP地址的指定端口号。
 *                     (2)Socket(String host, int port)   创建流套接字并将其连接到指定主机上的指定端口号。
 *
 *           2、获取输出流对象,向服务器写数据
 *            OutputStream getOutputStream()  返回此套接字的输出流。
 *
 *           3、释放资源,关闭Socket服务
 *
 *
 *         注意事项:
 *            要先启动服务器端,再启动客户端,否则会报连接被拒绝异常
 */

public class ClientDemo {
    public static void main(String[] args) {

        //1、创建发送端的Socket对象
        //(1)Socket(InetAddress address, int port)   创建流套接字并将其连接到指定IP地址的指定端口号。
//        Socket s = new Socket(InetAddress.getByName("192.168.7.42"), 12345);

        //(2)Socket(String host, int port)   创建流套接字并将其连接到指定主机上的指定端口号。
        Socket s = null;
        try {
            s = new Socket("192.168.7.18", 12345);


            //2、获取输出流对象,向服务器写数据
            //OutputStream getOutputStream()  返回此套接字的输出流。
            OutputStream os = s.getOutputStream();
            os.write("你好,新世界".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }


        //3、释放资源,关闭Socket服务
        if(s != null) {
            try {
                s.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}



/**
 *                      -----------TCP服务器端----------------
 *
 *       TCP协议编写服务器端代码:
 *           1、创建服务器端Socket对象(ServerSocket)
 *              构造方法:  ServerSocket(int port)   创建绑定到指定端口的服务器套接字。
 *
 *           2、服务器端没有直接对流的操作,所以调用accept()方法,监听客户端的连接,返回一个对应客户端连接的Socket对象
 *              Socket accept()   侦听要连接到此套接字并接受它。
 *
 *           3、获取通道中的输入流对象,读取客户端发送的数据
 *              InputStream getInputStream()   返回此套接字的输入流。
 *              InetAddress getInetAddress()   返回套接字所连接的地址(客户端地址)。
 *
 *           4、释放资源,关闭Socket服务
 *
 */

public class ServerDemo {
    public static void main(String[] args) {

        //1、创建服务器端Socket对象(ServerSocket)
        //ServerSocket(int port)   创建绑定到指定端口的服务器套接字。
        ServerSocket ss = null;
        try {
            ss = new ServerSocket(12345);


            //2、调用accept()方法,监听客户端的连接,返回一个对应客户端连接的Socket对象
            //Socket accept()   侦听要连接到此套接字并接受它。
            Socket s = ss.accept();


            //3、获取通道中的输入流对象,读取客户端发送的数据,并显示在控制台上
            //InputStream getInputStream()   返回此套接字的输入流。
            InputStream is = s.getInputStream();

            //获取客户端的ip
            //getInetAddress()   返回套接字所连接的地址(客户端地址)。
            String ip = s.getInetAddress().getHostAddress();
            String hostName = s.getInetAddress().getHostName();

            byte[] bytes = new byte[1024];
            int length = is.read(bytes);
            String s1 = new String(bytes, 0, length);
            System.out.println(ip + "名为: " + hostName + "发送的数据为: " + s1);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5、UDP

        将数据源和目的封装成数据包中,不需要建立连接;每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快

/**
 *                            -----------UDP发送端----------------
 *
 *      UDP协议发送数据 :
 *          1、创建发送端的Socket对象
 *
 *            DatagramSocket类构造方法1:
 *              DatagramSocket()    构造数据报套接字并将其绑定到本地主机上的任何可用端口。
 *
 *          2、创建数据,并把数据打包
 *
 *            DatagramPacket类构造方法1:
 *              DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造用于发送指定长度的数据包到指定主机上指定的端口号。
 *
 *          3、调用Socket对象的发送方法将数据发送出去
 *              发送方法 : void send(DatagramPacket p)  从此套接字发送数据报包。
 *
 *          4、释放资源,关闭Socket
 *
 */


public class SendDemo {
    public static void main(String[] args) throws Exception{

        //1、创建发送端的Socket对象
        //DatagramSocket()  构造数据报套接字并将其绑定到本地主机上的任何可用端口。
        DatagramSocket ds = new DatagramSocket();


        //2、创建数据,并把数据打包
        //(1)定义一个字节数组
        byte[] bytes = "你好,大数据".getBytes();
        //(2)获取数组的长度
        int length = bytes.length;
        //(3)要发送的IP地址
        InetAddress address = InetAddress.getByName("192.168.7.18");
        //(4)自定义设置端口号     有效端口:0~65535,其中0~1024系统使用或保留端口
        int port = 10086;

        //DatagramPacket(byte[] buf, int length, InetAddress address, int port)  构造用于发送指定长度的数据包到指定主机上指定的端口号。
        DatagramPacket dp = new DatagramPacket(bytes, length, address, port);


        //3、调用Socket对象的发送方法将数据发送出去
        //void send(DatagramPacket p)  从此套接字发送数据报包。
        ds.send(dp);


        //4、释放资源,关闭Socket
        ds.close();
    }
}



/**
 *                             -----------UDP接收端----------------
 *
 *      UDP协议接收数据:
 *          1、创建接收端的Socket对象
 *
 *            DatagramSocket类构造方法2:
 *              DatagramSocket(int port)   构造数据报套接字并将其绑定到本地主机上的指定端口。
 *
 *          2、创建一个数据包(接收容器)
 *
 *            DatagramPacket类构造方法2:
 *              DatagramPacket(byte[] buf, int length)   构造一个DatagramPacket用于接收指定长度的数据包。
 *
 *          3、调用Socket对象的接收方法接收数据
 *            接收方法 : void receive(DatagramPacket p)   从此套接字接收数据报包。
 *
 *          4、解析数据包,得到数据并显示在控制台上
 *            public byte[] getData()   获取到数据包里的数据。
 *            public int getLength()   返回要发送的数据的长度或接收到的数据的长度。
 *
 *          5、释放资源,关闭Socket
 *
 *
 *          注意事项:
 *             接收端程序在绑定同一个端口的时候不能同时运行多个,即不能同时启动多个接收端。
 */

public class ReceiveDemo {
    public static void main(String[] args) throws Exception {

        //1、创建发送端的Socket对象
        //DatagramSocket(int port)    构造数据报套接字并将其绑定到本地主机上的指定端口。
        DatagramSocket ds = new DatagramSocket(10086);       // 因为发送端定义了端口号10086


        //2、创建一个数据包(接收容器)
        //(1)定义一个字节数组
        byte[] bytes = new byte[1024];
        //(2)获取数组的长度
        int length = bytes.length;

        //DatagramPacket(byte[] buf, int length)   构造一个DatagramPacket用于接收指定长度的数据包。
        DatagramPacket dp = new DatagramPacket(bytes, length);


        //3、调用Socket对象的接收方法接收数据
        //void receive(DatagramPacket p)   从此套接字接收数据报包。
        ds.receive(dp);          //调用receive程序阻塞,直到接收到发送端发送的数据

        InetAddress address = dp.getAddress();     // 获取InetAddress对象
        String ip = address.getHostAddress();      // 通过InetAddress对象获取ip地址字符串


        //4、解析数据包,得到数据并显示在控制台上
        //public byte[] getData()   获取到数据包里的数据。
        byte[] data = dp.getData();
        //public int getLength()   返回要发送的数据的长度或接收到的数据的长度。
        int length1 = dp.getLength();

        String s = new String(data, 0, length1);
        System.out.println(ip + "发送的数据为: " + s);


        //5、释放资源,关闭Socket
        ds.close();
    }
}

最后

以上就是哭泣啤酒为你收集整理的大数据 -- java基础16 网络编程 TCP UDP的全部内容,希望文章能够帮你解决大数据 -- java基础16 网络编程 TCP UDP所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部