socket与tcp udp两种协议的关系

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

  • UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包

应用:

  TCP:java.net.ServerSocket     

  UDP:java.net.DatagramSocket

这样就很简单了,用什么协议就用对应的接口。

这里写个使用udp的小例子

 DatagramSocket ds=new DatagramSocket(8888);//创建接收端,确立端口,与发送端建立关系
        DatagramPacket dp=new DatagramPacket(new byte[1024],1024);//创建数据包,用于接收长度为1024的数据
        ds.receive(dp);//接收数据,将DatagramSocket的数据搬运到DatagramPacket里
        byte[] date = dp.getData();//获取数据,把数据包里的数据拆出来,装到byte字节数组
        int len=dp.getLength();//获取数据包里数据长度
        log.info(new String(date,0,len));
        ds.close();
 String str="你好呀,我是你mama介绍的";
        DatagramSocket ds=new DatagramSocket();//创建发送端
        DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByName("127.0.0.1"),8888);//创建数据包,将数据拆分,打包
     //getByName参数可以写目标主机名、也可以写目标ip地址      
     ds.send(dp);//发送 ds.close();

 例子二:

 DatagramSocket ds = new DatagramSocket(6666); // 监听指定端口
        for (;;) { // 无限循环
            // 数据缓冲区:
            byte[] buffer = new byte[1024];
            System.out.println(1);
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            System.out.println(2);
            ds.receive(packet); // 收取一个UDP数据包.阻塞等待客户端请求
            System.out.println(3);
            // 收取到的数据存储在buffer中,由packet.getOffset(), packet.getLength()指定起始位置和长度
            // 将其按UTF-8编码转换为String:
            String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);
            System.out.println(s);
            // 发送数据:
            byte[] data = "ACK".getBytes(StandardCharsets.UTF_8);
            packet.setData(data);
            ds.send(packet);
 DatagramSocket ds = new DatagramSocket();
        ds.setSoTimeout(1000);
        ds.connect(InetAddress.getByName("localhost"), 6666); // 连接指定服务器和端口
// 发送:
        byte[] data = "Hello".getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length);
        ds.send(packet);
// 接收:
        byte[] buffer = new byte[1024];
        packet = new DatagramPacket(buffer, buffer.length);
        ds.receive(packet);
        String resp = new String(packet.getData(), packet.getOffset(), packet.getLength());
        System.out.println("服务器返回数据:"+resp);
        ds.disconnect();//close()是完全关闭资源,disconnect()不是真正地断开连接,它只是清除了客户端DatagramSocket实例记录的远程服务器地址和端口号,
这样,DatagramSocket实例就可以连接另一个服务器端

 

posted on 2021-02-20 17:08  刀锋93  阅读(314)  评论(0编辑  收藏  举报

导航