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

我正在完成我的任务,使用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
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,但只能在一定程度上提高可靠性。