java中可靠的UDP协议
我正在完成我的任务,使用java使UDP可靠。如何添加超时和重新传输来处理丢弃的数据报,并添加序列号,以便客户端可以验证回复是否针对适当的请求 这是客户端代码java中可靠的UDP协议,java,Java,我正在完成我的任务,使用java使UDP可靠。如何添加超时和重新传输来处理丢弃的数据报,并添加序列号,以便客户端可以验证回复是否针对适当的请求 这是客户端代码 import java.net.*; import java.io.*; public class EchoClient { // UDP port to which service is bound public static final int SERVICE_PORT = 7; // Max size of packet
import java.net.*;
import java.io.*;
public class EchoClient {
// UDP port to which service is bound
public static final int SERVICE_PORT = 7;
// Max size of packet
public static final int BUFSIZE = 256;
public static void main(String args[]){
if (args.length != 1)
{
System.err.println ("Syntax - java EchoClient hostname");
return;
}
String hostname = args[0];
// Get an InetAddress for the specified hostname
InetAddress addr = null;
try
{
// Resolve the hostname to an InetAddr
addr = InetAddress.getByName(hostname);
}
catch (UnknownHostException uhe)
{
System.err.println ("Unable to resolve host");
return;
}
try
{
// Bind to any free port
DatagramSocket socket = new DatagramSocket();
// Set a timeout value of two seconds
socket.setSoTimeout (2 * 1000);
for (int i = 1 ; i <= 10; i++)
{
// Copy some data to our packet
String message = "Packet number " + i ;
char[] cArray = message.toCharArray();
byte[] sendbuf = new byte[cArray.length];
for (int offset = 0; offset < cArray.length ; offset++)
{
sendbuf[offset] = (byte) cArray[offset];
}
// Create a packet to send to the UDP server
DatagramPacket sendPacket = new DatagramPacket(sendbuf, cArray.length, addr, SERVICE_PORT);
System.out.println ("Sending packet to " + hostname);
// Send the packet
socket.send (sendPacket);
System.out.print ("Waiting for packet.... ");
// Create a small packet for receiving UDP packets
byte[] recbuf = new byte[BUFSIZE];
DatagramPacket receivePacket = new DatagramPacket(recbuf, BUFSIZE);
// Declare a timeout flag
boolean timeout = false;
// Catch any InterruptedIOException that is thrown
// while waiting to receive a UDP packet
try
{
socket.receive (receivePacket);
}
catch (InterruptedIOException ioe)
{
timeout = true;
}
if (!timeout)
{
System.out.println ("packet received!");
System.out.println ("Details : " + receivePacket.getAddress() );
// Obtain a byte input stream to read the UDP packet
ByteArrayInputStream bin = new ByteArrayInputStream (
receivePacket.getData(), 0, receivePacket.getLength() );
// Connect a reader for easier access
BufferedReader reader = new BufferedReader (
new InputStreamReader ( bin ) );
// Loop indefinitely
for (;;)
{
String line = reader.readLine();
// Check for end of data
if (line == null)
break;
else
System.out.println (line);
}
}
else
{
System.out.println ("packet lost!");
}
// Sleep for a second, to allow user to see packet
try
{
Thread.sleep(1000);
}catch (InterruptedException ie) {}
}
}
catch (IOException ioe)
{
System.err.println ("Socket error " + ioe);
}
}
}
import java.net.*;
导入java.io.*;
公共类EchoClient{
//服务绑定到的UDP端口
公共静态最终int服务_端口=7;
//数据包的最大大小
公共静态最终int BUFSIZE=256;
公共静态void main(字符串参数[]){
如果(args.length!=1)
{
System.err.println(“语法-java EchoClient主机名”);
返回;
}
字符串hostname=args[0];
//获取指定主机名的InetAddress
InetAddress addr=null;
尝试
{
//将主机名解析为InetAddr
addr=InetAddress.getByName(主机名);
}
捕获(未知后异常uhe)
{
System.err.println(“无法解析主机”);
返回;
}
尝试
{
//绑定到任何自由端口
DatagramSocket套接字=新DatagramSocket();
//将超时值设置为两秒
插座.设置插座(2*1000);
对于(int i=1;i您可以做的是在UDP消息体中添加导入TCP头,如序列号、窗口,以使其更像TCP。下面是可能会帮助您的a。UDP被专门设置为不可靠。另一方面,TCP被构建为可靠的。因此,如果您想要可靠,应该使用TCP@ControlAltDel那不是我的错完全正确。人们通常通过在UDP上创建自己的服务来利用UDP中的性能增益。这很好,但我们可以向客户端添加一些功能,使其可靠,如校验和或序列号和Timeout@flkes我认为ControlAltDel是正确的,人们确实创建了类似UDP的协议,但UDP本身是设计成不可恢复的able.UDP没有选项头,这意味着没有空间在客户端和服务器端添加序列号、缓冲区和窗口支持,而这三个头是使TCP可靠的主要因素。@M.N.N,我认为您不能添加它们,因为UDP没有空间添加额外的头。您可以在两个si上添加缓冲区或创建窗口des,但只能在一定程度上提高可靠性。