我在《JavaSE项目之聊天室swing版》中通过遵守TCP协议的ServerSocket与Socket实现了聊天室的群聊窗口。同时,在介绍OSI与TCP/IP参考模型时,也曾提及TCP与UDP(全称User Datagram Protocol,用户数据报协议)。
总的来说,TCP与UDP的区别有:
1.TCP与UDP的基本区别:
(1)TCP基于连接,UDP基于无连接;
(2)TCP要求系统资源较多,UDP则较少;
(3)UDP程序结构较简单;
(4)流模式(TCP)与数据报模式(UDP);
(5)TCP保证数据正确性,UDP可能丢包;
(6)TCP保证数据顺序,UDP不保证。
2.UDP应用场景主要有:
(1)面向数据报方式;
(2)网络数据大多为短消息;
(3)拥有大量Client;
(4)对数据安全性无特殊要求;
(5)网络负担非常重,但对响应速度要求高。
3.具体编程时的区别:
(1)套接字Socket的参数不同;
(2)UDP不需要调用listen和accept;
(3)UDP收发数据分别用send()和receive()方法;
(4)TCP:地址信息在connect和accept时确定;
(5)UDP:在send()和receive()方法中每次均需指定地址信息。
我接下来通过代码演示UDP协议。我写了两个类,分别是UDPA和UDPB,通过UDPA给UDPB发送信息。
UDPA.java中的代码如下:
package com.itszt.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * UDPA要给UDPB发信息 */ public class UDPA { public static void main(String[] args) throws IOException { byte[] bs = "我是A,给B发信息".getBytes();//要发的信息内容 //UDPA与UDPB的ip均为本机ip,故设置不同的端口号 InetAddress desIp = InetAddress.getLocalHost(); //数据报包,UDPB的端口为10010 DatagramPacket p = new DatagramPacket(bs, bs.length, desIp, 10010); //创建数据报套接字,UDPA的端口设置为10086 DatagramSocket socket_A = new DatagramSocket(10086); //UDPA给UDPB发送数据报 socket_A.send(p); //关闭socket_A套接字 socket_A.close(); } }
UDPB.java中的代码如下:
package com.itszt.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * UDPB接收来自UDPA的信息 */ public class UDPB { public static void main(String[] args) throws IOException { //用数组接收数据报包 byte[] bs = new byte[500]; DatagramPacket p = new DatagramPacket(bs, bs.length); //创建数据报套接字 DatagramSocket socket_B = new DatagramSocket(10010); //接收数据报包 socket_B.receive(p); System.out.println(new String(bs, 0, p.getLength())); //关闭套接字 socket_B.close(); } }
在程序运行时,先运行UDPB,等着接收UDPA发来的信息,然后再运行UDPA,则UDPB接收到UDPA的信息如下:
我是A,给B发信息