美文网首页
Java学习4-socket通信(1)

Java学习4-socket通信(1)

作者: 持之以蘅 | 来源:发表于2019-06-22 20:06 被阅读0次

    基础

    • 目标:
    • 了解七层模型的每层,用来做什么
    • TCP三次握手和四次挥手

    OSI七层网络模型

    • 物理层:物理媒体部分
    • 数据链路层:数据通道
    • 网络层:将网络地址翻译成对应物理地址
      IP协议在这一层;单位:数据包
    • 传输层:通信部份最高层,用户功能的最低层;有重要的协议:TCP传输控制协议与UDP用户数据报协议;单位:数据段;
    • 会话层:在网络中两节点之间建立、维持和终止通信;
    • 表示层:对来自应用层的命令和数据进行解释,对语法赋予相应含义,按一定格式传送给会话层;
      -应用层:OSI参考模型的最高层,为用户应用程序提供网络服务;
    • 总之可以这样子说
    • 下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能, 即以节点到节点之间的通信为主;
    • 第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
    • 上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。
    • 即下四层主要完成通信子网的功能;上三层主要完成资源子网的功能;

    TCP/IP四层模型

    image.png

    TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。 TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层 (对应OSI的第四层)。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供 的网络来完成自己的需求。这4层分别为:

    • 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、 网络远程访问协议(Telnet)等。
    • 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、 用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中, 这一层负责传送数据,并且确定数据已被送达并接收。
    • 网络互连层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目 的主机(但不检查是否被正确接收),如网际协议(IP)。
    • 主机到网络层:对实际的网络媒体的管理,定义如何使用实际网络 (如Ethernet、Serial Line等)来传送数据。

    TCP/UDP区别

    IP地址

    终端的唯一标识是IP地址

    端口
    1. 用于区分不同的应用程序
    2. 端口号的范围为0-65535,其中0-1023未系统的保留端口,我们的程序尽可能别使用这些端口!
    3. IP地址和端口号组成了我们的Socket,Socket是网络运行程序间双向通信链路的终结点, 是TCP和UDP的基础!
    4. 常用协议使用的端口:HTTP:80,FTP:21,TELNET:23
    比较
    • TCP/IP是一个协议簇,包含很多协议;UDP包含其中;
    • TCP协议流程

    TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,即在收发数据线 ,都需要与对面建立可靠的链接,这也是面试经常会问到的TCP的三次握手以及TCP的四次挥手! 三次握手: 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立, 在Socket编程中,这一过程由客户端执行connect来触发,具体流程图如下:


    image.png
    • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server, Client进入SYN_SENT状态,等待Server确认。
    • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位 SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求 ,Server进入SYN_RCVD状态。
    • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK 置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则 连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以 开始传输数据了。
    • 四次挥手

    终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在Socket编程中,这一过程由客户端或服务端任一方执行close来触发,具体流程图如下:


    image.png
    • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入 FIN_WAIT_1状态
    • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同, 一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
    • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK 状态。
    • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。 另外也可能是同时发起主动关闭的情况:


      image.png
    • UDP

    UDP(User Datagram Protocol)用户数据报协议,非连接的协议,传输数据之前源端和终端不 建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽 的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。 相比TCP就是无需建立链接,结构简单,无法保证正确性,容易丢包


    实例

    使用socket连接到指定主机

    • net Socket类的getInetAddress()方法来连接到指定主机
      感觉好神奇,首先catch语句???
      然后是getInetAddress(),为什么感觉没有方法,就直接引用了???
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class Webping{
       public static void main(String[] args){
           try{
                 InetAddress addr;
                 Socket sock = new Socket("www.runoob.com", 80);
    addr = sock.getInteAddress();
    System.out.println("连接到“+ addr);
    sock.close();
              }catch(java.io.IOException e){
                     Sysytem.out.println("无法连接" + args[0]):
    System.out.println(e);
              }
       }
    }
    
    • 结果


      image.png

    socket实现多线程服务器程序

    import java.io.IOException;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class MultiThreadServer implements Runnable {
        Socket csocket;
        MultiThreadServer(Socket csocket) {
            this.csocket = csocket;
        }
    
        public static void main(String args[])
                throws Exception {
            ServerSocket ssock = new ServerSocket(1234);
            System.out.println("Listening");
            while (true) {
                Socket sock = ssock.accept();
                System.out.println("Connected");
                new Thread(new MultiThreadServer(sock)).start();
            }
        }
        public void run() {
            try {
                PrintStream pstream = new PrintStream
                        (csocket.getOutputStream());
                for (int i = 100; i >= 0; i--) {
                    pstream.println(i +
                            " bottles of beer on the wall");
                }
                pstream.close();
                csocket.close();
            }
            catch (IOException e) {
                System.out.println(e);
            }
        }
    }
    
    • 结果


      image.png

    相关文章

      网友评论

          本文标题:Java学习4-socket通信(1)

          本文链接:https://www.haomeiwen.com/subject/zyivqctx.html