【java】网络编程基本知识

网络编程涉及数据在不同计算机间的传输,主要元素包括IP地址(如IPv4和IPv6)、端口号和通信协议(如TCP、UDP)。IP是设备在网络中的唯一标识,端口号区分应用程序,协议规定数据传输规则。两种常见架构是CS(客户端-服务器)和BS(浏览器-服务器)。TCP提供可靠连接,UDP则速度快但不保证数据安全。示例展示了UDP和TCP的发送与接收数据过程。
摘要由CSDN通过智能技术生成

什么是网络编程?

在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
应用场景:即时通信、网游、金融证券、国际贸易,邮件等等。
不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输。
常见的软件架构有两种,分别为CS(ClientServer)BS(BrowserServer)
CS:在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序
BS:只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器
在CS当中,是通过客户端访问服务器,BS则是通过浏览器访问服务器。
BS架构优缺点:
1.不需要开发客户端,只需要页面+服务器。
2.用户不需要下载,打开浏览器就能使用。
3.如果应该过大,用户体验会受到影响。
CS架构优缺点:
1.画面可以做的非常精美,用户体验好
2.需要开发客户端,也需要开发服务端
3.用户需要下载和更新的时候太麻烦

网络编程三要素

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

IP:

全称:Internet Protocol ,是互联网协议地址,也称IP地址。
是分配给上网设备的数字标签。是网络中的地址,是唯一的。
常见的IP分类为IPv4,IPv6
IPv4
全称:Internet Protocol version 4,互联网通信协议第四版。
采用32位地址长度,分成4组,点分十进制表示法
每组范围0~255,例如IP:192.168.1.66
因为范围0~255的限定,IPv4目前已经不能满足所有人的使用。
IPv6
全称:Internet Protocol version 6,互联网通信协议第6版
次用128位地址长度,分成8组。冒分十六进制表示法
2001:0DB8:0000:0023:0008:0800:200C:417A
省略前面的0
2001:DB8:0:23:8:800:200C:417A
特殊情况:如果计算出的16进制标识形式中有多个连续的0
FF01:0:0:0:0:0:0:1101
0位压缩法:
FF01::1101

IPv4地址分类形式

1.公网地址(万维网使用)和私有地址(局域网使用)
2.192.168.开头的是私有地址,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用,以此节省IP。
例如,以网吧为例,网吧中的电脑都是使用公网IP,然后由路由器给每台电脑分配局域网IP。
特殊IP地址:
127.0.0.1。也可以是localhost:是回送地址也称本地回环地址,也称本地IP,永远只会寻找当前所在本机。
常见的CMD命令
1.ipconfig:查看本机IP地址
2.ping:检查网络是否连通(后面可以跟随网址或者IP)

InetAddress类的使用

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

public class Test {
    public static void main(String[] args) throws UnknownHostException {
    //static InetAdress getByName(String host)   确定主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址
    //String getHostName()          获取IP地址的主机名
    //String getHostAddress()       返回文本显示中的IP地址字符串
        //获取InetAddress对象 
        InetAddress address=InetAddress.getByName("192.168.1.100");
        System.out.println(address);
        String name=address.getHostName();
        System.out.println(name);
        String ip=address.getHostAddress();
        System.out.println(ip);
    }
}

输出结果

/192.168.1.100
192.168.1.100
192.168.1.100

端口号

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

协议

计算机网络中,连接和通信的规则被称为网络通信协议
OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上得到广泛推广
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准
在这里插入图片描述

在这里插入图片描述

UDP协议
1.用户数据报协议(User Datagram Protocol)
2.UDP使面向无连接通信协议。
速度快,有大小限制以此最多发送64K,数据不安全,易丢失数据
TCP协议
1.传输控制协议TCP(Transmission Control Protocol)
2.TCP协议是面向连接的通信协议
速度慢,没有大小限制,数据安全

UDP通信程序 (发送数据)

UDP发送数据可以理解为分为4步
例如,我们生活中寄快递时候有以下四步
1.找快递公司
2.打包物品
3.快递公司发送包裹
4.付钱走人
上面这四步对应UDP中4步
1.创建发送端的DatagramSocket对象
2.数据打包(DatagramPacket)
3.发送数据
4.释放资源


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

public class Test {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象(快递公司)
        //细节:
        //绑定端口:通过这个端口往外发送
        //空参:所有可用端口中随机一个使用
        //有参:指定端口进行绑定
        DatagramSocket ds=new DatagramSocket();
        //打包数据
        String s="你好";
        byte[] b=s.getBytes();
        InetAddress address=InetAddress.getByName("127.0.0.1");
        int port=10086;
        DatagramPacket dp=new DatagramPacket(b,b.length,address,port);
        //发送资源
        ds.send(dp);
        //释放资源
        ds.close();
    }
}

运行程序后会发现控制台什么都没有输出,正是因为UDP的无连接性,数据是否发送成功与他无关。

UDP通信程序 (接收数据)

同样,还是以快递为例,收快递需要以下4步
1.找快递公司 -------------- 创建接收端的DatagramSocket对象
2.接收箱子------------------- 接收打包的数据
3.从箱子里面拿到东西 ------------------- 解析数据包
4.签收走人 ------------------------ 释放资源

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

 class Demo {
        public static void main(String[] args) throws IOException {
            //  创建DatagramSocket对象(快递公司)
            //  细节:
            //在接收的数据时候,一定要绑定端口而且绑定的端口,要与发送的端口一样
            DatagramSocket ds = new DatagramSocket(10086);
            //接收数据
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            //解析数据包
            byte[] b = dp.getData();
            int len = dp.getLength();
            System.out.println("接收到数据" + new String(b, 0, len));
            System.out.println("该数据是从" + dp.getAddress() + "这台电脑发出的");
            System.out.println("端口号:"+dp.getPort());
            //释放资源
            ds.close();
        }

    }

先运行接收端,然后在运行发送端,在接收端会打印以下内容:

接收到数据你好
该数据是从/127.0.0.1这台电脑发出的
端口号:57255

UDP的三种通信方式

1.单播
一台电脑给一台发送信息,发送端给一个接收端
2.组播
一台电脑给多个发送信息,发送端为一个,接收端为一组
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址
3.广播
一台电脑给局域网所有发送信息,发送端给局域网中所有发送数据。
广播地址:255.255.255.255

TCP通信程序

TCP通信协议时一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生IO流来进行网络通信。
客户端:
1.创建客户端的Socket对象与指定服务端连接
Socket(String host,int port)
2.获取输出流,写数据
OutputStream getOutputStream()
3.释放资源
void close()
服务器:
1.创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
2.监听客户端连接,返回一个Socket对象
Socket accept()
3获取输入流,读数据
InputStream getInputStream()
4.释放资源
void close()
服务端代码:

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

public class Demo {
    public static void main(String[] args) throws IOException {
        //创建对象ServerScoket
        ServerSocket ss=new ServerSocket(10000);
        //监听客户端连接
        Socket socket= ss.accept();
        //从连接通道中获取输入流数据
        InputStream in=socket.getInputStream();
        DataInputStream da=new DataInputStream(in);
        while (true){
            try {
                System.out.println(da.readUTF());
            }catch (EOFException e){
                da.close();
                in.close();
                socket.close();
                ss.close();
                break;
            }
        }
    }
}

客户端:

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

public class Test {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        //如果连接不上,代码会报错
        Socket socket=new Socket("127.0.0.1",10000);
        //可以从连接通道中获取输出流
      OutputStream os=socket.getOutputStream();
      DataOutputStream da=new DataOutputStream(os);
        da.writeUTF("你好");
        da.writeUTF("我很好");
        da.close();
        os.close();
        socket.close();
    }
}

启动服务端后,服务端会一直在accept()方法处死等,只有客户端建立连接后,才会进行之后的代码。

TCP通信程序(三次握手)

在这里插入图片描述

TCP通信程序(四次挥手)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值