韩顺平网络编程学习

34. java与网络编程😍

34.1 基础网络知识🏡

IPV4 由四个字节二进制组成 总共由32位组成 🍨

IPV6 由16个字节二进制组成 总共由128位组成(冒分十六进制)🍨

ip地址的组成 = 网络地址 + 主机地址 🍦

在这里插入图片描述

InetAddress对象的使用🍧

public class ConnectionCreat {
    public static void main(String[] args) throws UnknownHostException {
        // -- 获取本机的InetAddress 对象
        InetAddress inetAddress = InetAddress.getLocalHost();
        System.out.println(inetAddress);
        // -- 根据本机的主机名获取InetAddress 对象
        System.out.println("host :" + InetAddress.getByName("LAPTOP-RD663NNS"));
        // -- 根据域名返回 InetAddress 对象 
        System.out.println("HOST :" + InetAddress.getByName("yikeshuoguo.top"));
    }
}

/*
	LAPTOP-RD663NNS/172.21.64.1
    host :LAPTOP-RD663NNS/172.21.64.1
    HOST :yikeshuoguo.top/124.221.189.77
*/

34.2 Socket套接字编程🏡

网络通信其实就是socket之间通信👬

端口号 用于表示计算机上某个特定的网络程序🔗

客户端和服务端都会有一个端口进行通信☎️

TCP :可靠 指需要先建立再进行发送文件等数据报✋

UDP:不可靠 不需要先建立连接,直接可以发送文件等数据🤚

TCP可靠传输🚚

// ----------------服务端等待连接并接收信息----------------------------
public class server {
    public static void main(String[] args) throws IOException {
        // -- 监听本机9999号端口
        ServerSocket serverSocket = new ServerSocket(9999);
        // -- 当有客户端进行连接时,进行接收
        Socket accept = serverSocket.accept();
        System.out.println("服务端创建连接~~~~" + accept.getClass());

        InputStream inputStream = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, readLen));
        }
        // 关闭等待接收信息
        accept.shutdownInput();
        OutputStream outputStream = accept.getOutputStream();
        // -- 通过输出流,输出数据到数据通道
        outputStream.write("hello~client".getBytes());
        // -- 关闭输入流
        outputStream.close();
        inputStream.close();
        // 这里的accept相当于服务器分配的接收端口
        accept.close();
        // serverSocket相当于服务器
        serverSocket.close();
        System.out.println("服务端停止等待~~~~~");
    }
}

// ----------------客户端请求连接并发送信息------------------------
public class client {
    public static void main(String[] args) throws IOException {
        // -- 先获取本机对象信息,然后连接9999号端口
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端进行连接~~~~" + socket.getClass());
        OutputStream outputStream = socket.getOutputStream();
        // -- 通过输出流,输出数据到数据通道
        outputStream.write("hello~server".getBytes());
        // 设置输出结束标记
        socket.shutdownOutput();
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, readLen));
        }
        // -- 关闭流和对象,否则会发生拥塞
        outputStream.close();
        inputStream.close();
        socket.close();
        System.out.println("客户端退出连接");
    }
}

/*
	服务端创建连接~~~~class java.net.Socket
    hello~server
    服务端停止等待~~~~~
	
	客户端进行连接~~~~class java.net.Socket
    hello~client
    客户端退出连接
*/

netstat -an | more 分页查看本机端口占用情况

netstat -anb 查看端口连接状态

UDP不可靠传输🚜

public class Sender {
    public static void main(String[] args) throws IOException {
        // -- 创建一个端口用于 接收或者发送一个数据报
        DatagramSocket datagramSocket = new DatagramSocket(9998);

        byte[] bytes = "hello~明天吃火锅!".getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.43.219"), 9999);

        datagramSocket.send(datagramPacket);

        byte[] bytes1 = new byte[1024];
        DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
        System.out.println("等待消息的回复~~");
        datagramSocket.receive(datagramPacket1);

        byte[] byt = datagramPacket1.getData();
        System.out.println(new String(byt, 0, datagramPacket1.getLength()));
        // -- 关闭
        datagramSocket.close();
        System.out.println("发送端结束~~~");
    }
}
//-------
public class Sender {
    public static void main(String[] args) throws IOException {
        // -- 创建一个端口用于 接收或者发送一个数据报
        DatagramSocket datagramSocket = new DatagramSocket(9998);

        byte[] bytes = "hello~明天吃火锅!".getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.43.219"), 9999);

        datagramSocket.send(datagramPacket);

        byte[] bytes1 = new byte[1024];
        DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
        System.out.println("等待消息的回复~~");
        datagramSocket.receive(datagramPacket1);

        byte[] byt = datagramPacket1.getData();
        System.out.println(new String(byt, 0, datagramPacket1.getLength()));
        // -- 关闭
        datagramSocket.close();
        System.out.println("发送端结束~~~");
    }
}
/*
	等待数据报的传输~~~~~
	hello~明天吃火锅!
	
	等待消息的回复~~
	好的~明天一起吃火锅哦!
	发送端结束~~~
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捶捶自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值