网络通信

来源:互联网 发布:js图片无缝滚动代码 编辑:程序博客网 时间:2024/04/29 02:25

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();        }    }
原创粉丝点击