JAVA基础 day15 网络编程

网络可分为局域网,城域网,广域网

OSI

Open System interconnection
开放式互联系统
在这里插入图片描述

TCP/IP模型

在这里插入图片描述

传输层协议

TCP协议: Transmission Control Protocol 传输控制协议
• 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连 接的过程需要三次握手,断开连接的过程需要四次挥手。

• UDP协议: User Datagram Protocol 用户数据报协议
• 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小 64KB。

网络层协议

IP协议 Internet Protocol Address
互联网协议地址/网际协议地址 • 分配给互联网设备的数字标签(唯一标识)。
• IP地址分为两种:

IPV4:4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,
每8位 整数可以转换为一个0-255的十进制整数。
格式:D.D.D.D 例如:255.255.255.255

IPV6:16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每16 位整数可以转换为一个0~65535的十进制数。
格式:X.X.X.X.X.X.X.X 例如:FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF

Port端口号

端口号:在通信实体上进行网络通讯的程序的唯一标识
一个端口号只能被一个程序使用,一个程序可以占用多个端口号
在这里插入图片描述

常用端口号
MySql3306
Oracle1521
Tomcat8080
SMTP25
Web服务器80
FTP服务器21

InetAddress

一个域名可对应多个IP,一个IP可对应多个域名

				//(1)本机地址(推荐使用前两种)
                InetAddress ia1=InetAddress.getLocalHost();
                System.out.println(ia1.getHostAddress()+"---"+ia1.getHostName());
                InetAddress ia2=InetAddress.getByName("10.0.139.195");
                System.out.println(ia2.getHostAddress()+"---"+ia2.getHostName());

                InetAddress ia3=InetAddress.getByName("localhost");
                System.out.println(ia3.getHostAddress()+"---"+ia3.getHostName());

                InetAddress ia4=InetAddress.getByName("127.0.0.1");
                System.out.println(ia4.getHostAddress()+"---"+ia4.getHostName());

                //(2)局域网
                InetAddress ia5=InetAddress.getByName("10.0.139.119");
                System.out.println("三秒内是否可达"+ia5.isReachable(3000));
                System.out.println(ia5.getHostAddress()+"---"+ia5.getHostName());

                //(3)外网地址
                //getByName 获得一个
                InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
                for (InetAddress address : allByName) {
                        System.out.println(address.getHostAddress()+"---"+address.getHostName());
                }

Socket

分为客户端Socket与服务器ServerSocket

使用流放松或接收数据

通信要求:IP地址 + 端口号。

基于TCP的服务器端

服务端步骤:
1.创建服务器套接字,并绑定端口号
2.监听客户连接,返回Socket,阻塞方法
3.获取输出,输出流
到网卡 输入
出网卡 输出
4.处理数据
5.关闭资源

		//1.创建服务器套接字,并绑定端口号
        ServerSocket serverSocket=new ServerSocket(13579);
        //2.镇定客户连接,返回Socket,阻塞方法,直到客户端连接
        Socket accept = serverSocket.accept();
        //3.获取输入流
        InputStream inputStream = accept.getInputStream();
        BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
        //4.处理数据
        System.out.println(br.readLine());
        //5.关闭
        br.close();
        serverSocket.close();
        accept.close();

客户端步骤

1.创建客户端套接字Socket,并制定服务的地址和端口号
2.获取输入,输出流
3.处理数据
4.关闭资源

		//1.创建客户端套接字Socket,并制定服务的地址和端口号,自动建立三次握手
        Socket socket = new Socket("10.0.139.119", 8888);
        //2.获取输入流
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
        //3.处理数据
        bw.write("chichi yyds");
        bw.newline();//发送时要添加换行符,避免读取时readLine()方法卡死
        bw.flush();
        //4.关闭数据
        bw.close();
        socket.close();

当接收到空值时,时服务器或者客户端某个关了

Java的socket是一个全双工套接字,任何的输入流或输出流的close()都会造成Socket关闭。

创建一个多线程的TCP服务器,有以下几步:
1.创建ServerSocket对象
2.调用该对象的accept方法,以获取客户端连接。该方法返回一个Socket对象
3. 利用返回的对象,创建一个新线程
4.在新线程中完成读写操作
5. 在线线程中调用Socket对象的close方法

返回对应客户端的socket

 while (true) {
            Socket accept = serverSocket.accept();
            Transform transform = new Transform(accept);
            new Thread(transform).start();
        }

UDP

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

不区分服务器与客户端,每个端口即是服务器又是事客户端

UDP协议的发送方

1.创建DatagranSocket,可以不提供端口号,自动分配端口号
2.创建DatagramPacket,发送数据包
3.发送
4.关闭

public class Sender {
    public static void main(String[] args) throws Exception{
        // 1.创建DatagramSocket,可以不提供端口号,自动分配端口号
        DatagramSocket ds=new DatagramSocket();
        // 2.创建DatagramPacket,发送数据包
        byte[] bytes = "chichi yyds".getBytes();
        DatagramPacket dp=new DatagramPacket(bytes, bytes.length, InetAddress.getByName("10.0.139.195"),8888);
        // 3.发送
        ds.send(dp);
        // 4.关闭
        ds.close();
    }
}

UDP协议的接收方

1.创建DatagramSocket,指定端口号
2.创建DatagramPacket,接受数据包
3.接收 recieive阻塞犯法,接收到输出才返回
4.处理数据
5.关闭

public class Receiver {
    public static void main(String[] args) throws Exception{
        // 1.创建DatagramSocket,指定端口号
        DatagramSocket ds = new DatagramSocket(8888);
        // 2.创建DatagramPacket,接受数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        // 3.接收 receive阻塞犯法,接收到输出才返回
        System.out.println("接收方已准备好");
        ds.receive(dp);
        // 4.处理数据
       String s = new String(dp.getData(), 0, dp.getLength());//若用缓冲区输出,可能会包含大量空值
        System.out.println(s);
        // 5.关闭
        ds.close();
    }
}

接收数据的先运行

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值