美文网首页
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)

    基础 目标: 了解七层模型的每层,用来做什么 TCP三次握手和四次挥手 OSI七层网络模型 物理层:物理媒体部分 ...

  • Java socket应用—通信

    ** |Java socket应用—通信|** 1、网络基础简介 ...

  • Java内存模型分析

    在学习Java内存模型之前,先了解一下线程通信机制。 1、线程通信机制 在并发编程中,线程之间相互交换信息就是线程...

  • Java多线程的使用通信和控制

    Java多线程的使用通信和控制 1. Java多线程的使用和通信 实现多线程有两种方式 1. 继承Thread父类...

  • 大连滕泰科技学习笔记2020-07-02

    1,ajax的原生j是编写? 1,1 什么是ajax?异步通信异步java scirpt xml 通信。网页访问的...

  • 第一篇 Java网络编程

    本篇主要从学习角度整理java的几个网络模型,包括: BIO通信模型 伪异步通信模型 NIO通信模型 NIO2.0...

  • Java内存模型&Volatile

    1.Java内存模型 1.1 Java内存模型(JMM) Java线程间的通信由Java内存模型(JMM)控制,J...

  • Socket 通信 知识梳理

    1.socket是网络通信的一项技术,android的socket通信其实使用的是java的socket通信技术。...

  • 并发编程

    (1)JAVA内存模型(JMM) #java当中的线程通讯和消息传递(通信) http://www.cnblogs...

  • Java NIO原理图文分析及代码实现

    目录:一.java NIO 和阻塞I/O的区别1. 阻塞I/O通信模型2. java NIO原理及通信模型二.ja...

网友评论

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

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