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
实例就可以连接另一个服务器端