UDP/IP与TCP/IP协议

1.首先,我们知道,现在的网络系统的两大基本架构B/S,C/S结构。也就是所谓的浏览器(Brower)/服务器端(Server),和客户端(Client)/服务端(Server)无论是B/S,还是C/S结构,最基本的用户交互都需要数据传输。B/S结构的应用层现在是使用的HTTP协议,也就是超文本传输协议。由于这一优点,服务器厂商不用关心浏览器的开发,只需要专注服务端。C/S结构需要厂商开发客户端和服务端,可以不遵循HTTP协议(也就是说协议可以自己指定),但是这无疑增加了负担。今天我们就来关注一下http协议的底层实现.

2.数据通信协议并非就是简单的http协议,http协议只是一个顶层的应用层协议。在它下边还有三层,一层一层的封装起来,http协议就是封装了他们。我们来关注一下http的下一层实现:TCP/IP,UDP/IP协议。

3.首先我们来实现UDP/IP。这个协议有点类似与我们发信息,如果我们给别人发送信息,无论对方的手机有没有开启,我们都是可以发出去的。但是信息有可能会丢失。这就是UDP协议的特点:高效,非面向连接,但是不安全。实现写个协议我们需要构建Client和Server下边我们分别构建他们

(1).我们首先构建服务端,让他在特定的端口侦听。构建服务端分为六个步骤:

       

package UDP_IP;
import java.io.IOException;
import java.net.*;
public class Mysever {
/*
 * 1.创建服务端+端口
 * 2.准备接受容器
 * 3.封装成包
 * 4.接收数据
 * 5.分析数据
 * 6.释放资源
 */
    //创建服务端加端口号
    public static void main(String[]args) throws IOException {
        //创建服务端以及端口
        DatagramSocket server=new DatagramSocket(8899);
        //构造接收器
        byte container[]=new byte[1024];
        //使用构造器打包
        DatagramPacket packet=new DatagramPacket(container, container.length);
        //接收数据
        server.receive(packet);
        //分析数据
        byte b[]=packet.getData();
        int len=packet.getLength();
        String s=new String(b,0,len);
        System.out.println(s);
        server.close();
    }
}


创建完毕之后我们运行起来,让他在端口监听

(2)接下来创建客户端,对应的五个步骤

package UDP_IP;
import java.io.IOException;
import java.net.*;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Myclient {
/*
 * 1.创建客户端加端口
 * 2.准备数据
 * 3.打包发送到指定的端口
 * 4.发包
 * 5.释放
 * UDP传输非面向连接,即使服务器开启,消息依然可以发出去,但是不报错,数据此时丢失
 */
    public static void main(String[]args) throws IOException {
        //1.创建客户端端口
        DatagramSocket client=new DatagramSocket(6666);
        //2.准备数据
        double a=89.12;
        String message="你好,服务器";
        byte[]b=message.getBytes();
        //3.打包发送
        DatagramPacket packet=new DatagramPacket(b,b.length,new InetSocketAddress("localhost",8899));
        //4.发送
        client.send(packet);
        //5.释放
        client.close();
    }
}

运行起来,那么message就会被打包发送到服务端,服务端接受到数据,拆包分析,显示到控制台。如果我们关闭服务端,运行客户端,依然可以成功。但是此时并没有消息显示。说明即使在服务端不开启的情况下,基于这种协议的依然可以执行,但是数据会丢失。注意:数据传输的过程中,必须使用字节数组。

4.TCP/IP。TCP协议类似于我们打电话.必须建立连接才能通信,否则通信失败!建立TCP协议与UDP协议类似。但是也有小的区别。在UDP中,对于客户端我们需要给它指定端口,让它在特定的端口发送消息(这里需要注意一下,端口号最好使用1024以上的,因为1024以下的预留给系统),但是在TCP中我们对于客户端不用指定端口,这个端口不是说没有,而是由系统自动分配。而且,在UDP中,客户端可服务器端都是使用同一个类来构建,但是TCP中,使用ServerSocket和Socket来分别构建服务端和客户端。

    (1)我们还是首先构建服务端,让它在端口等待:

package TCP_IP;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class Mysever {
/*
 *
 *
 */
    public static void main(String[]args) throws UnknownHostException, IOException
    {
               //1.建立服务器指定端口,服务器在端口侦听请求
                ServerSocket server=new ServerSocket(8899);
                //2.接受外部请求
                Socket s=server.accept();
                System.out.println("客户端建立连接");
                String message="欢迎使用!";
                byte []b=message.getBytes();
                DataOutputStream data=new DataOutputStream(s.getOutputStream());
                data.writeUTF(message);
                data.flush();
    }
        
    }

(2)构建客户端:

  package TCP_IP;
/*Socket编程*/
import java.net.*;
import java.io.*;
public class Myclient {
/*1.基于TCP协议,面向连接。必须先连接才能通信,相对比较安全,但是效率低
 * request/response.请求/响应式。
 * B/S架构
 * 服务端使用 ServerSocket
 * 客户端使用Socket
 * 需要指定服务器的端口,但是客户端的端口不需要指定,二者之间有一个管道的关系。

*每一个客户端只需要不同的管道即可。
 * 不同的协议端口可以重复使用,同一个协议不能重复使用端口
 *
 */
    public static void main(String[]args) throws IOException
    {
        Socket s=new Socket("localhost",8899);
        DataInputStream in=new DataInputStream(s.getInputStream());
        String echo=in.readUTF();
        System.out.println(echo);
    }
}

以上就是UDP/IP与TCP/IP的基本实现。但是,我们知道,TCP/Ip的实现仅仅是实现了一个客户端的连接,这是不符合实际的,实际情况下服务器一般都是有多个客户端的连接。这也很好解决,我们只需要在服务器端加一个循环,对于每一次来自客户端的请求,服务器端的Accept()方法都会返回一个Socket对象,这样就实现了多个连接。

猜你喜欢

转载自blog.csdn.net/weixin_41863129/article/details/81213584