TCP/UDP是如何传输的?

时间:2023-03-08 15:36:18

一、网络模型:

  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、客户端向服务端发送用户名请求登录,服务端通过验证,返回“欢迎光临”,未通过则返回“用户不存在”。