我想发送和接收数据(unicode utf-8字符串通过udp套接字,DatagramSocket
。我一直在寻找SO的答案,但只能找到使用InputStream
进行TCP传输的解决方案等。
UDP有类似的方法吗?
UDP客户端
package testsocket;
import java.io.IOException;
import java.net.*;
public class TestSocketSender {
private DatagramSocket sock;
public static void main(String[] args) {
new TestSocketSender();
}
public TestSocketSender(){
try {
sock = new DatagramSocket();//, Inet4Address.getLocalHost());
sendData("Hello World\u00A9");
} catch (SocketException ex) {
ex.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
}
private void sendData(String data) throws IOException{
DatagramPacket datagram = new DatagramPacket(data.getBytes("utf-8"), data.length(), InetAddress.getLocalHost(), 5060);
sock.send(datagram);
}
}
UDP服务器
package testsocket;
import java.io.IOException;
import java.net.*;
public class TestSocketListerner {
private DatagramSocket sock;
public static void main(String[] args) {
new TestSocketListerner();
}
public TestSocketListerner(){
try {
sock = new DatagramSocket(5060);//, Inet4Address.getLocalHost());
while(true){
System.out.println(recvData());
}
} catch (SocketException ex) {
ex.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
}
private String recvData() throws IOException{
byte[] data = new byte[100];
DatagramPacket datagram = new DatagramPacket(data , data.length);
sock.receive(datagram);
return new String(datagram.getData(),datagram.getOffset(),datagram.getLength(),"utf-8");
}
}
答案 0 :(得分:1)
UDP是一种基于数据报的协议。这意味着您只能发送固定数量的数据,而不保证所交付的数据。数据包可能会丢失,内部数据可能已损坏,因为即使CRC在UDP中不是强制性的,甚至更糟糕 - 您发送的数据包可能会在接收端重新排序,因为数据包的路径上有多个路由器。
使用UDP通道实现看起来像Stream的东西并非易事,但肯定是可能的。你必须将数据分成小部分(系统的MTU),用一些恢复信息打包它们,为每个数据包分配序列号,并提供一些机制来重新捕获在途中丢失的数据包。
答案 1 :(得分:-1)
首先发送长度。
让您的发件人首先打包字节,然后发送长度,然后发送字符串。我建议你把它打包成四个字节。
让读者读取4个字节,然后重新构建长度,然后读取字符串。
然后您可以处理数据未到达和超时等问题......