JAVA网络编程(一)

这篇具有很好参考价值的文章主要介绍了JAVA网络编程(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是网络编程

定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
应用场景:即时通信,网游,邮件等
不管什么场景,都是计算机与计算机之间通过网络在进行数据传输
java提供一个java.net包,可以帮助我们开发网络应用程序。

二、常见的网络应用程序架构

JAVA网络编程(一)
CS架构是指在远端有一个服务器Server,用户需要在本地下载一个客户端Client。
BS架构是指远端有一个服务器,用户通过浏览器进行访问。
JAVA网络编程(一)

BS架构的优缺点

优点:
①不需要开发客户端,只需要页面和服务端
②用户不需要下载应用,只需要在浏览器访问
缺点:
①如果应用中的资源体积过大,那么用户体验将受到影响,比如图片过大,浏览器就要加载一会儿才能显示。
JAVA网络编程(一)

CS架构的优缺点

优点:
①画面可以做的非常精美,不用担心传输慢,因为需要提前下载资源包到本地
缺点:
②需要开发客户端和服务端,工作量加大
③用户需要下载安装和更新

三、网络编程三要素

IP、端口号、协议
JAVA网络编程(一)

IP

全称:Internet Protocol,是互联网协议地址,也称ip地址,是分配给上网设备的数字标签。
常见的IP分类有IPv4和IPv6两种。

IPv4

JAVA网络编程(一)

IPv6

JAVA网络编程(一)

总结:

JAVA网络编程(一)

JAVA网络编程(一)

IPv4是如何节约分配的?

JAVA网络编程(一)
以网吧举例,网吧里面的电脑很多,不可能为每一台电脑设置一个公网ip,所以就出现了下面的方案:
所有电脑共用一个公网ip,每台电脑拥有一个局域网ip
JAVA网络编程(一)

特殊的Ip地址

127.0.0.1,也可以是localhost:是回送地址,也称本地回环地址,也称本机ip,永远只会寻找当前所在本机。
提问:
如果192.168.1.100是我电脑的ip地址,那么这个ip和127.0.0.1是一样的吗?
答案:不是的,192.168.1.100是局域网给你的电脑分配的ip地址,而127.0.0.1是只代表本机的地址
举例
使用电脑向192.168.1.100发送消息,数据会先经过路由器,然后通过路由器发送数据给我的电脑。
并且如果我的电脑换了一个局域网环境,比如换了一个路由器,那么我的电脑的ip地址可能会发生改变。
JAVA网络编程(一)
如果使用127.0.0.1,我的电脑就不会向路由器发送信息,信息在通过网卡的时候就会发现这条数据是发送给回环地址的,直接发送给我的电脑。
JAVA网络编程(一)

常见的cmd命令

JAVA网络编程(一)

总结

JAVA网络编程(一)

InetAddress对象

InetAddress类没有公有的构造方法,只能通过getByName(String name)方法获取InetAddress对象。
InetAddress对象表示一个IP,一个IP对应着一台网络中的设备,所以InetAddress对象也可以表示一台设备。
当获取到这台设备的InetAddress对象时,就可以给这个对象发送消息了

/**
 * @author Watching
 * * @date 2023/5/26
 * * Describe:
 * static InetAddress getByName(String host) 确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址
 * String getHostName() 获取此ip地址的主机名
 * String getHostAddress() 返回文本显示中的ip地址字符串
 */
public class MyInetAddressDemo1 {
    public static void main(String[] args) throws UnknownHostException {
        //InetAddress 表示ip的对象,而ip有表示一台联网设备,所以这也能表示一台设备对象
        InetAddress address = InetAddress.getByName("DESKTOP-DHVQ061");
        System.out.println(address);

        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress);

        String hostName = address.getHostName();
        System.out.println(hostName);
    }
}

JAVA网络编程(一)

端口号

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

协议

计算机网络中,连接和通信的规则被称为网络通信协议。
JAVA网络编程(一)

OSI参考模型
数据从应用层一直传输到物理层,转为可网络传递的二进制形式,传递另外一台电脑上,再由下到上到应用层,转为原始数据。
JAVA网络编程(一)
TCP/IP协议
TCP/IP模型将应用层、表示层、会话层合为一层,数据链路层、物理层合为一层。
TCP/IP模型减少了流程复杂度,减少了资源消耗
JAVA网络编程(一)
我们重点学习传输层的TCP和UDP协议。

UDP协议

UDP协议的特点就是速度快,面向无连接, 不管是否连接成功,都会发送数据,应用场景比如视频聊天,电话等,就算出现了连接失败,也只是会出现卡顿的情况
JAVA网络编程(一)

测试UDP传输数据

步骤:
1.创建DatagramSocket对象,建立连接
2.打包数据,需要指定接收端口
3.发送数据
4.关闭连接

/**
 * @author Watching
 * * @date 2023/5/26
 * * Describe:
 */
public class SendMessageDemo1 {
    public static void main(String[] args) throws IOException {
        //发送数据
        //1.创建DatagramSocket对象
        //细节:
        //绑定端口,以后我们就是通过这个端口往外发送
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket datagramSocket = 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.发送数据
        datagramSocket.send(dp);
        //4.关闭连接
        datagramSocket.close();
    }
}

在打包数据的时候,DatagramPacket里面有很多构造器,可以根据需要选择不同的构造器。

JAVA网络编程(一)

测试UDP接收数据

步骤:
1.创建DatagramSocket对象建立连接,端口要与发送者的目的端口一致
2.创建DatagramPacket对象接收数据
3.通过DatagramPacket对象获取数据数据长度发送者IP发送者端口号等信息
4.断开连接

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:
 */
public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建socket连接,端口要与发送消息的要相同
        DatagramSocket ds = new DatagramSocket(10086);


        //2.接受数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        //该方法是阻塞式的方法,会一直阻塞直到接受到消息
        ds.receive(dp);

        //3.解析数据包
        byte[] data = dp.getData();
        int length = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();
        System.out.println(new String(data,0, length));
        System.out.println("数据是从 [" + address + "]" + "发送来的");
        System.out.println("端口是 [" + port + "]");

    }
}

接收数据时使用的DatagramSocket对象的 receive(DatagramPacket dp) 方法,这个方法是阻塞式的,直到接收到传来的消息才会停止阻塞。

UDP的三种通信方式

单播
单对单传输
JAVA网络编程(一)
组播
一组设备接收消息
JAVA网络编程(一)
广播
所有设备都能接收消息
JAVA网络编程(一)

UDP三种通信方式的代码实现

JAVA网络编程(一)

单播

前面我们编写的代码就是单播

组播

发送端:
步骤:
①创建组播连接,使用MultiCastSocket类
②创建DatagramPacket对象打包数据,需要指定接收端口
③发送消息
④关闭连接

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:测试组播发送代码
 *
 */
public class SendMessageDemo2 {
    public static void main(String[] args) throws IOException {
        //1.创建组播连接
        MulticastSocket mcs = new MulticastSocket();
        //2.创建数据包打包数据
        String str = "你好";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);
        //3.发送消息
        mcs.send(dp);
        //4.关闭连接
        mcs.close();
    }
}

接收端:
步骤:
①创建组播连接,使用MultiCastSocket
②将当前连接加入组播地址
③创建DatagramPacket对象接收数据
④解析数据
⑤关闭连接

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:接收组播消息
 */
public class ReceiveMessageDemo2 {
    public static void main(String[] args) throws IOException {
        //1.建立mcs连接,并且填写发送端的端口
        MulticastSocket mcs = new MulticastSocket(10086);
        //2.将当前本机连接加入组播
        InetAddress address = InetAddress.getByName("224.0.0.1");
        mcs.joinGroup(address);
        //3.创建DatagramPacket接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        mcs.receive(dp);
        //5.解析数据
        int port = dp.getPort();
        InetAddress ip = dp.getAddress();
        int length = dp.getLength();
        byte[] data = dp.getData();

        System.out.println(new String(data, 0, length));
        System.out.println("数据来自 [" + ip + "] 端口 [" + port + "]");
        //5.关闭连接
        mcs.close();
    }
}

可以多创建两个类,并运行他们,当发送端的代码执行后,每个添加进组播的连接都能接收到数据

广播

将单播的代码创建数据包DatagramPacket时,将发送的地址改为255.255.255.255就成了广播,局域网中的所有设备都能受到消息。

TCP协议

TCP协议的特点就是面向连接,要在确保连接成功之后才会传输数据,应用场景比如下载软件,发送邮件等。下载软件丢失了数据,可能会导致软件安装不成功,发送邮件丢失数据可能会导致邮件内容错乱。
JAVA网络编程(一)

TCP通信程序

JAVA网络编程(一)
客户端代码编写步骤
①创建客户端Socket对象与指定服务端连接
Socket(String host,int port);
②获取输出流,写数据
OutputStream getOutputStream
③释放资源

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:tcp协议客户端
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //tcp协议发送数据
        //1.创建socket连接对象
        //细节:创建对象的同时会连接服务端,如果连接不上,会直接报错 Exception in thread "main" java.net.ConnectException: Connection refused: connect
        Socket socket =  new Socket("127.0.0.1",10086);//这行代码就是在创建连接(三次握手
        //2.从连接通道中获取输出流,将数据输出给服务端
        OutputStream outputStream = socket.getOutputStream();
        String str = "你好!";
        outputStream.write(str.getBytes());
        //3.关闭资源
        outputStream.close();
        socket.close();//断开连接,四次挥手协议,保证连接通道中的数据已经处理完成了

    }
}

服务端代码编写步骤
①创建服务器端的socket对象(ServerSocket)
ServerSocker(int port)
②监听客户端连接,返回Socket对象
Socket accept()
③获取输入流,读数据,并把数据显示在控制台
InputStream getInputStream()
④释放资源

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:tcp协议服务端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //服务端 接收数据
        //1.创建服务端连接
        ServerSocket ss = new ServerSocket(10086);//需要绑定一个端口号,以供客户端访问
        //2.监听客户端的连接
        Socket accept = ss.accept();//accept方法也是一个阻塞式的方法
        //3.从连接通道中获取输入流
        InputStream is = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes)) != -1) {
            System.out.println(new String(bytes,0,len));
        }
        //4.释放资源
        is.close();
        ss.close();

    }
}

3次握手,4次挥手
3次握手建立连接:
JAVA网络编程(一)
4次挥手断开连接:
JAVA网络编程(一)

总结

JAVA网络编程(一)文章来源地址https://www.toymoban.com/news/detail-469916.html

到了这里,关于JAVA网络编程(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 网络编程】网络通信原理、TCP、UDP 回显服务

    互联网从何而来? 这要追溯到上个世纪 50 - 60 年代,当时正逢美苏争霸冷战, 核武器 给战争双方提供了足够的威慑力,想要保全自己,就要保证自己的 反制手段 是有效的。 如何保证能够反击: 保存指挥机构 保存核弹头和发射井 指挥机构和核弹头之间的通信链路 需要保证

    2023年04月10日
    浏览(50)
  • Java网络编程-Socket实现数据通信

    本文主要是为下一篇Websockt做铺垫,大家了解socket的一些实现。 网络编程是指利用计算机网络进行程序设计、开发的技术。网络编程主要包含三个要素,分别是: IP地址和端口号 传输协议 Socket 在计算机网络中,每台计算机都有一个IP地址,用于唯一标识该计算机在网络中的

    2024年02月10日
    浏览(45)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(84)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(79)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(71)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(47)
  • 【深入浅出C#】章节 8: 网络编程和远程通信:网络编程和远程通信

    计算机网络是指连接多台计算机设备,通过通信链路共享资源和信息的系统。它构建了一个相互连接的世界,使得人们可以在不同地点进行数据交换和资源共享。网络编程是指在计算机网络中,使用编程语言进行通信和数据传输的技术。现代应用中,网络编程发挥着重要作用

    2024年02月12日
    浏览(64)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(65)
  • 《3.linux应用编程和网络编程-第8部分-3.8.网络基础》 3.8.1.网络通信概述 3.8.3.网络通信基础知识2

        进程间通信: 管道 、 信号量、 共享内存, 技术多,操作麻烦     线程就是解决 进程间 通信 麻烦的事情,这是线程的 优势 3.8.1.网络通信概述 3.8.1.1、从进程间通信说起: 网络域套接字socket , 网络通信其实就是位于网络中不同主机上面                   的 

    2024年02月15日
    浏览(57)
  • 【网络编程】网络通信基础——简述TCP/IP协议

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 ip地址简单来说就是用来描述网络上一个设备的所在位置。 端

    2024年02月04日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包