Java中的网络编程


前言

在这个信息高速流通的时代,网络编程已成为软件开发中不可或缺的一部分。它允许计算机之间通过互联网或局域网进行数据交换和通信,从而构建出多样化的网络应用。在众多编程语言中,Java因其跨平台的特性、健壮的安全性和强大的社区支持而成为网络编程的热门选择之一。

Java网络编程的核心在于Socket编程,它基于TCP/IP协议栈,允许程序员创建客户端和服务端应用程序,实现数据的发送与接收。无论是构建一个简单的聊天应用,还是开发一个复杂的分布式系统,Java都提供了必要的工具和接口来简化这一过程。

在本篇博客中,我们将深入探讨Java网络编程的基础概念,包括Socket和ServerSocket类的使用,以及如何利用Java提供的APIs来编写高效且可靠的网络应用程序。我们将一步步了解如何创建网络连接,处理输入输出流,以及应对网络通信中可能遇到的各种挑战。


一、网络编程是什么?

在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。

二、常见的软件架构

在这里插入图片描述
在这里插入图片描述

三、网络编程的三要素

IP:设备在网络中的地址,是唯一的标识
端口号:应用程序在设备中唯一的标识
协议:数据在网络中传输的规则
常见的协议有UDP、TCP、http、https、ftp

四、IP

在这里插入图片描述
在这里插入图片描述

1、IP的作用

设备在网络中的地址,是唯一的标识

2、IPv4有什么特点

目前的主流方案
最多只有2^32次方个ip,目前已经用完了

3、IPv6有什么特点

为了解决IPv4不够用而出现的
最多有2^128次方个ip
可以为地球上的每一粒沙子都设定ip

4、现在如何解决IPv4不够的问题

利用局域网IP解决IP不够的问题

5、特殊的IP是什么

127.0.0.1(永远表示本机)

6、常见的两个CMD命令

ipconfig:查看本机IP地址
ping:查看网络是否连同

五、端口号

应用程序在设备中的唯一标识
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用。
我们自己使用1024以上的端口就可以了。
注意:一个端口号只能被一个应用程序使用。

六、协议

在这里插入图片描述
在这里插入图片描述

七、UDP通信程序

1、步骤

在这里插入图片描述

在这里插入图片描述

2、代码示例(单播)

发送类

import java.io.IOException;
import java.net.*;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //发送数据

        //1.创建DatagramSocket对象
        //细节:
        //绑定端口,以后我们就是通过这个端口往外发送
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket ds = new DatagramSocket();

        //2.打包数据
        String str = "你好威啊!!!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;

        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);

        //3.发送数据
        ds.send(dp);

        //4.释放数据
        ds.close();
    }
}

接收类

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

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //接收数据
        //1.创建DatagramSocket对象
        //细节:
        //在接收的时候,一定要绑定端口
        //而且绑定的端口要和发送的端口一致
        DatagramSocket ds = new DatagramSocket(10086);

        //2.接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        //这个方法是阻塞的
        //程序执行到这一步的时候,会在这里死等
        //等发送端发送消息
        System.out.println(1111);
        ds.receive(dp);
        System.out.println(2222);

        //3.解析数据包
        byte[] date = dp.getData();
        int len = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();

        System.out.println("接收到数据"+new String(date,0,len));
        System.out.println("该数据是从" + address +"这台电脑中" + port +"这个端口发出的");

        //4.释放数据
        ds.close();
    }
}

3、UDP的三种通信方式

1、单播
以上代码就是单播
2、组播
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.225为预留的组播地址
3、广播
广播地址:255.255.255.255

组播代码示例
发送端代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
         /*
            组播发送端代码
        */

        //创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket() ;

        // 创建DatagramPacket对象
        String s = "你好,你好!" ;
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.1");
        int port = 10000;

        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port) ;

        // 调用MulticastSocket发送数据方法发送数据
        ms.send(datagramPacket);

        // 释放资源
        ms.close();


    }
}

接收端代码示例

public class ReceiveMessageDemo3 {
    public static void main(String[] args) throws IOException {
        /*
            组播接收端代码
        */


        //1. 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket(10000);

        //2. 将将当前本机,添加到224.0.0.2的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.2");
        ms.joinGroup(address);

        //3. 创建DatagramPacket数据包对象
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        //4. 接收数据
        ms.receive(dp);

        //5. 解析数据
        byte[] data = dp.getData();
        int len = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();

        System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));

        //6. 释放资源
        ms.close();
    }
}

八、TCP通信程序

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
通信之前要保证连接已经建立
通过Socket产生的IO流来进行网络通信

1、步骤

在这里插入图片描述

2、代码示例

客户端代码

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

public class Client {
    public static void main(String[] args) throws IOException {
        //TCP协议,发送数据

        //1.创建Socket对象
        //细节:在创建对象的同时会连接服务端
        //   如果连接不上,代码会报错
        Socket socket = new Socket("127.0.0.1",10086);

        //2.可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        //写出数据
        os.write("你好".getBytes());

        //3.释放资源
        os.close();
        socket.close();
    }
}

服务器代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        //1.创建对象ServerSocket
        ServerSocket ss = new ServerSocket(10086);

        //2.监听客户端的链接、
        Socket socket = ss.accept();

        //3.从链接通道中输入流读取数据
        /*InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);*/

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int b;
        while ((b=br.read()) != -1){
            System.out.print((char) b);
        }

        //4.释放资源
        socket.close();
        ss.close();
    }
}

3、三次握手

在这里插入图片描述

4、四次挥手

在这里插入图片描述

5、综合练习(上传文件)

Java中利用网络编程和多线程上传文件


总结

在本文中,我们从网络编程的基础出发,理解了Socket和ServerSocket的工作原理,学习了如何创建客户端和服务器端的程序,以及它们是如何通过输入输出流进行数据交换的。我们还讨论了多线程编程在处理并发连接时的重要性,以及如何通过异常处理来增强程序的健壮性。

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

窒息的鱼c

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

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

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

打赏作者

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

抵扣说明:

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

余额充值