java网络编程

网络编程

用java实现在网络中传输数据

Ip地址

IP 地址:是网络中的唯一标识

  • IP 地址的两大分类

    • IPV4(主流)

    • IPV6(还未普及)

  • 常用 MSDOS 命令

    • ipconfig -all - 获取一些信息 例如本机的ip地址等…

    • ping xxx.xxx.xxx.xx - 测试是否畅通

    • netstat -ano

  • 特殊的 IP 地址

    • 127.0.0.1 - 本地的回还地址

InertAddress类的使用

方法名说明
static InetAddress getByName(String host)确定主机名的 IP 地址,主机名可以是机器名成,也可以是 IP 地址
String getHostName()获取此 IP 地址的主机名
String getHostAddress()返回文本显示中的 IP 地址字符串

demo:

package com.itxs.demo01;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @Classname : demo01
 * @Description : TODO InertAddress Ip地址类
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) throws UnknownHostException {
        // 个人理解,把一个ip地址进行包装
        // 自己本机的IP地址进行包装的三种方式
        // 方式一: ipv4的地址进行包装
        InetAddress byName = InetAddress.getByName("192.168.1.108");
        System.out.println(byName);// /192.168.80.1
        // 方式二: 包装 127.0.0.1
        InetAddress byName1 = InetAddress.getByName("127.0.0.1");
        System.out.println(byName1);///127.0.0.1
        // 通过自己计算机的名字进行包装
        InetAddress byName2 = InetAddress.getByName("DESKTOP-6KFSBG2");
        System.out.println(byName2);//DESKTOP-6KFSBG2/192.168.1.108
        //============================================================
        // 通过获取计算机名字获取到的ip进行拆分
        System.out.println(byName2.getHostName()); // 主机名字:DESKTOP-6KFSBG2
        System.out.println(byName2.getHostAddress());// ip地址:192.168.1.108
    }
}

运行结果:
在这里插入图片描述

端口

简单了解端口的视频

端口是应用程序在设备当中的唯一标识

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

协议

帮助你理解两种协议的视频

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

  • UDP 协议

    • 用户数据包协议(User Datagram Protocol)

    • UDP 是 无连接 通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接,简单来说,当一台计算机想另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端收到数据时,也不会像发送端反馈是否接收到数据

    • 由于 UDP 协议消耗资源小,通信效率高,所以通常应用于音频、视频和普通数据的传输

    • 例如视频会议通常采用 UDP 协议,因为这种情况及时偶尔丢失一两个数据包,也不会对接受结果产生太大的影响,但是在 UDP 协议传输数据时,由于 UDP 协议是面向无连接性,不能保证数据的完整性,所以在传输重要数据的时候不建议使用 UDP 协议

  • TCP 协议

    • 传输控制协议(Transmission Control Protocol)

    • TCP 协议是 面向连接 的通信协议,即传输数据之前,在发送端和接收端简历逻辑连接,然后在传输数据,他提供了两台计算机之间的 可靠无差错 的数据传输。在 TCP 连接中不需要明确客户端与服务器端,由客户端想服务器端发送连接请求,每次连接的创建都需要经过 “三次握手”

    • 三次握手:TCP 协议中,在发送数据的准备阶段,客户端以服务器端的三次交互,以保证连接的可靠

      1. 第一次:客户端向服务器端发送连接请求,等待服务器端确认

      2. 第二次:服务器端向客户端会送一个响应,通知客户端接受到了连接请求

      3. 第三次:客户端再次向服务器端发送确认信息,确认连接

    • 完成三次握手之后,建立连接,客户端和服务器就可以开始进行数据传输,由于这种 面向连接 的特性,TCP 协议可以保证传输数据的安全,所以应用十分广泛,例如文件的上传、下载、网页的浏览等

UDP通讯程序

UDP发送数据

demo:对自己的计算机发送一段字符串

package com.itxs.demo02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * @Classname : demo01
 * @Description : TODO UDP发送数据案例 - 对自己计算机发送一段字符串
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) throws IOException {
         // 创建一个发送对象
        DatagramSocket ds = new DatagramSocket();
        // 把数据进行打包
        byte[] bytes = "hello,world".getBytes();// 需要发送的数据
        int length = bytes.length;// 数据的长度
        InetAddress byName = InetAddress.getByName("127.0.0.1");// 自己电脑的Ip地址
        int port = 9527;// 随机写入的一个端口号
        DatagramPacket dp = new DatagramPacket(bytes, length, byName, port);
        // 另一种写法
        //TODO DatagramPacket dp = new DatagramPacket("hello,world".getBytes(),("hello,world".getBytes()).length, InetAddress.getByName("127.0.0.1"),9527);

        // 发送数据
        ds.send(new DatagramPacket("hello,world".getBytes(),("hello,world".getBytes()).length, InetAddress.getByName("127.0.0.1"),9527));
        //ds.send(dp);
        // 关闭发送
        ds.close();
    }
}

UDP接收数据

接收上面发送的数据

package com.itxs.demo02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * @Classname : demo03
 * @Description : TODO UDP - 接收数据
 * @Author : lin_refuel@qq.com
 */
public class demo03 {
    public static void main(String[] args) throws IOException {
          // 创建接收对象
        DatagramSocket ds = new DatagramSocket(9527);
          // 创建接收数据的包
        byte[] bytes = new byte[1024];// 接收的长度为1024个字节
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 接收数据的包
        // 进行接受
        ds.receive(dp); 
        int length = dp.getLength();// 字符的有效长度进行返回
        // 解析数据
        System.out.println(new String(bytes,0,length));// 将接收的字节转成字符串串进行输出
        // 关闭接收
        ds.close();
    }
}

UDP发送键盘输入的数据

package com.itxs.demo03;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * @Classname : demo01
 * @Description : TODO UDP - 持续发送
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) throws IOException {
         // 创建接收对象
        DatagramSocket ds = new DatagramSocket();
        String line; // 发送的数据
        while(true){
            System.out.println("请输入发送的内容 - over表示结束发送");
            line = new Scanner(System.in).nextLine();

            // 判断输入是否为over 如果是结束循环
            if(line.equals("over")){
                break;
            }

            // 讲数据进行打包
            byte[] bytes = line.getBytes();
            InetAddress byName = InetAddress.getByName("127.0.0.1");
            int port = 9527; // 发送地址的端口号
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, byName, port);
            // 进行发送
            ds.send(dp);
        }
        ds.close();
    }

UDP接收键盘上面的数据

package com.itxs.demo03;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * @Classname : demo02
 * @Description : TODO 接收键盘上面的内容
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) throws IOException {
         // 创建接收对象
        DatagramSocket ds = new DatagramSocket(9527);


        while(true){
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 接收的数据的包
            ds.receive(dp);// 接收的数据放入到包里
            byte[] data = dp.getData();// 包里面的数据转字节数组
            int length = dp.getLength();// 有效数据的长度
            String s = new String(data, 0, length);// 转成字符串
            System.out.println(s);// 进行输出
        }
    }
}

TCP通讯

TCP 通信原理

TCP 通信是一种可靠的网络协议,他在通信的两端各创建一个 Scoket 对象,从而在通信的两端形成网络虚拟连接,一旦建立了虚拟的网络连接,两端的程序就可以通过虚拟网络连接进行通信

Java 对基于 TCP 协议的网络提供了良好的封装,使用 Socket 对象来代表两端的通信端口,通过 Socket 产生的 IO 流来进行网络通信,客户端使用 Sokcet 类,而服务器端使用 ServerSocket 类

TCP发送原理

  • 发送数据的步骤

    1. 创建客户端的 Socket 对象 (Socket)

    2. 获取输出流,写数据

    3. 释放资源

package com.itxs.demo08;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Classname : clientTCP
 * @Description : TODO 客户端发送数据
 * @Author : lin_refuel@qq.com
 */
public class clientTCP {
    public static void main(String[] args) throws IOException {
        // 创建一个Socket ,放入一个Ip地址 和 Ip地址里面的端口号
        Socket socket = new Socket("127.0.0.1",9527);
        // 通过SocKet获取到输出流对象
        OutputStream ow = socket.getOutputStream();
        // 写入数据并且发送
        ow.write("hello,world!".getBytes());
        // 关闭socket
        socket.close();
    }
}

TCP服务器端接收数据

  • 接受数据的步骤

    1. 创建服务器端的 Socket 对象 (ServerSocket)

    2. 获取输入流,读取数据,处理数据

    3. 释放资源

package com.itxs.demo08;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Classname : serverReceive
 * @Description : TODO 服务器端口接收消息
 * @Author : lin_refuel@qq.com
 */
public class serverReceive {
    public static void main(String[] args) throws IOException {
         // 实例化一个服务器对象 设置端口为9527
        ServerSocket server1 = new ServerSocket(9527);
        // 通过 server1 创建一个接收用的socket对象用于通信
        Socket socket = server1.accept();
        // socket来获取一个输出流,读取接收的数据
        InputStream is = socket.getInputStream();
        // 创建一个缓冲区,存放读取的数据
        byte[] bytes = new byte[1024];
        int length = is.read(bytes);// 读取到数据的长度
        // 解析数据
        System.out.println("接收到:"+new String(bytes,0,length));
        // 关闭流
        socket.close();
    }
}
  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值