网络通信

1.网络通信基础


  1. IP地址:计算机主体标识身份的地址,目前标准有IPv4、IPv6
  2. 协议:是计算机主体之间通信所要共同遵守的协议,目前应用最广泛的协议是TCP/IP
  3. 端口号:端口号是分别计算机上不同应用程序的通信的,端口号从0~65534,其中0~1023默认为系统保留(http:80;ftp:21)

2.TCP/IP协议


TCP/IP协议是一个协议簇,是多个协议的集合,TCP协议是指传输控制协议,IP协议是指网络通信协议。

2.1 网络分层模型

TCP/IP网络分层模型:5层(还有说法是4层,将物理层和链路层合为网络接口层)

TCP/IP参考模型OSI参考模型
应用层应用层
表示层
会话层
传输层传输层
网络层网络层
数据链路层数据链路层
物理层物理层

2.2 TCP报文格式

2.3 TCP的三次握手和四次挥手

2.4 TCP/IP协议体系的常见术语


  •   包是网络上的传输片段,也称分组。包是一种统称,在不同的协议不同的层次,包有不同的名字:如TCP/IP中,数据链路层的包叫帧(Frame);IP层的包称为IP数据报;TCP层的包常称TCP报文等。
      大多数的包都由包头和信息组成和信息组成:包头常常包括诸如源地址和目的地址,包的长度和类型指示符等信息;信息部分可以是原始数据也可以包含另一个包。
      
  • 封装
      不同设备的对等层之间依靠封装和解封装来实现相互间通信。
      TCP/IP也是一种计算机数据打包和寻址的标准方法。
      在通信过程中,TCP/IP每一层都让数据得以通过网络进行传输,这些层之间使用协议数据单元(Protocol Data Unit,PDU)彼此交换信息,确保网络设备之间能够通信。

3.Java中对网络通信的支持

  • InetAddress
  • URL
  • Sockets
  • Datagram

3.1 InetAddress

3.2 URL(java.net)

  统一资源定位符,Internet上某一资源的地址,URL由两部分组成(协议+资源名称)
/**
 1. URL常用方法
  */
        try {
            /**
             * 创建一个URL的实例
             * URL的构造方法有很多种
             */
            URL url = new URL("http://www.baidu.com");
            /**
             * 根据已存在的URL再创建一个URL实例
             * ?后面的是参数,#后面的是锚点
             */
            URL newurl = new URL(url,"/s?wd=http#test");
            System.out.println("协议:"+url.getProtocol());
            System.out.println("主机:"+url.getHost());
            System.out.println("端口号:"+url.getPort());
            System.out.println("文件路径:"+url.getPath());
            System.out.println("文件名:"+url.getFile());
            System.out.println("相对路径(即锚点):"+url.getRef());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
/**
 2. 使用URL读取网页内容
 3. @param args
 4. @throws MalformedURLException 
  */
    public static void main(String[] args) {
        try {
            /**
             * 创建URL实例
             */
            URL url = new URL("http://www.baidu.com");
            /**
             * 通过URL的openstram()方法获取字节输入流
             */
            InputStream in = url.openStream();
            /**
             * 将字节输入流转换为字符输入流
             */
            InputStreamReader isr = new InputStreamReader(in,"utf-8");
            /**
             * 为字符输入流添加缓冲
             */
            BufferedReader br = new BufferedReader(isr);
            /**
             * 读取数据
             */
            String data = br.readLine();
            while(data!=null){
                System.out.println(data);
                data = br.readLine();
            }
            in.close();
            isr.close();
            br.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

3.3 Socket(java.net)

socket通信模型
- 1. 建立通信
服务端:创建ServerSocket对象;调用accept()方法侦听指定端口是否有客户端链接,处于阻塞状态;侦听到客户端请求后,创建Socket对象。
客户端:创建Socket对象,并向指定服务器和端口发起请求
- 2. 建立链接之后,开始通信
通过Socket获取输入输出流,开始传输消息。
- 3. 通信结束后,关闭链接及相关资源

服务端
public static void main(String[] args) {
        try{
            /**
             * 创建ServerSocket对象,指定要绑定的端口
             */
            ServerSocket serverSocket = new ServerSocket(8088);
            /**
             * 调用accept方法开始监听,等待客户端的链接
             */
            Socket socket = serverSocket.accept();
            /**
             * 获取输入流
             */
            InputStream in = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(isr);
            /**
             * 输出客户端提交的信息
             */
            String info = br.readLine();
            while(info != null){
                System.out.println(info);
                info = br.readLine();
            }
            /**
             * 关闭输入流
             */
            socket.shutdownInput();
            /**
             * 关闭其他资源
             */
            in.close();
            isr.close();
            br.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
客户端
public static void main(String[] args) {
        try {
            /**
             * 创建客户端Socket,指定服务器地址和端口号
             */
            Socket socket = new Socket("localhost",8088);
            /**
             * 获取输出流
             */
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write("hello");
            pw.flush();
            socket.shutdownOutput();
            os.close();
            pw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

holyZhang2021

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

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

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

打赏作者

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

抵扣说明:

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

余额充值