zoukankan      html  css  js  c++  java
  • TCP/UDP是如何传输的?

    一、网络模型:

      OSI参考模型

      TCP/IP参考模型

    二、网络通讯要素

    1. IP地址:
      1. 网络中设备的标识
      2. 不易记忆,可用主机名
      3. 本机回环地址:127.0.0.1 主机名: localhost
    2. 端口号:
      1. 用于标识进程的逻辑地址,不同进程的标识
      2. 有效端口: 0~65535,其中0~1024系统使用或者保留端口
    3. 传输协议: 
      1. 通讯的规则 
      2. 常见的协议: TCP、 UDP

    三、Socket

        就是为了网络服务提供的一种机制;通信的两端都有Socket;网络通信其实就是Socket间的通信;数据在两个Socket间通过IO传输。

    四、TCP和UDP

      TCP: 建立连接、在连接中进行传输、通过三次握手完成连接(是可靠协议)、效率会稍低

          Socket和ServerSocket

         传输步骤:

           1、建立客户端和服务器端

           2、建立连接后,通过Socket中的IO流进行数据的传输

           3、关闭socket

        ————客户端和服务器端是两个独立的运行程序

           客户端:通过Socket建立对象并指定要连接的服务端主机以及端口

    Socket s = new Socket(“192.168.1.1”,9999);
    OutputStream out = s.getOutputStream();
    out.write(“hello”.getBytes());
    s.close();

           服务器端:建立服务端需要监听的一个端口

    ServerSocket ss = new ServerSocket(9999);
    Socket s = ss.accept ();
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int num = in.read(buf);
    String str = new String(buf,0,num);
    System.out.println(s.getInetAddress().toString()+”:”+str);
    s.close();
    ss.close();

      UDP:不需要建立连接、将数据及源和目的封装成包(限制在64K内)、不可靠协议、速度快

         DatagramSocket与DatagramPacket

         传输步骤:

            1、建立发送端,接收端;

            2、建立数据包;  

            3、调用Socket的发送接受方法;

            4、关闭Socket

        ————发送端和接受端是两个独立的运行程序

            发送端:

    DatagramSocket ds = new DatagramSocket();
    byte[] by = “hello,udp”.getBytes();
    DatagramPacket dp = new DatagramPacket(by,0,by.length,
    InetAddress.getByName(“127.0.0.1”),10000);
    ds.send(dp);
    ds.close();

            接受端:

    DatagramSocket ds = new DatagramSocket(10000);
    byte[] by = new byte[1024];
    DatagramPacket dp = new DatagramPacket(by,by.length);
    ds.receive(dp);
    String str = new String(dp.getData(),0,dp.getLength());
    System.out.println(str+"--"+dp.getAddress());
    ds.close();

        小练习:

          UDP聊天程序:1.通过键盘录入获取要发送的信息;2.将发生和接受分别封装到两个线程中。

     ~~~~~问题分析:

         Tcp传输最容易出现的问题:1、客户端连接上服务端,两端都在等待,没有任何数据传输; 2、因为read方法或者readLine方法是阻塞式。《解决办法》1.自定义结束标记 2.使用shutdownInput, shutdownOutput方法。  

       Test:

        1、建立一个群聊服务器端。

        2、客户端向服务端上传一个图片。

        3、客户端向服务端发送用户名请求登录,服务端通过验证,返回“欢迎光临”,未通过则返回“用户不存在”。

  • 相关阅读:
    JS在ff和ie区别(未完,待续...)
    得出一年中已过的天数
    div高度随浏览器变化
    offsetTop,offsetLeft
    完美的DIV三行三列自适应高度布局
    YUI Compressor
    Android repo 出现error.GitError: manifests revlist ('^12303f87b9f90c07bf4aec4c4353ba514ee70c8a', 'HEAD', ''): fatal: bad revision 'HEAD'
    1、ECharts(中国地图篇)的使用
    2012年新浪微博用户密码泄露漏洞(图片解析)
    铁道部购票网站可能造成另一次的密码危机(转)
  • 原文地址:https://www.cnblogs.com/jesonjason/p/5232462.html
Copyright © 2011-2022 走看看