java - 如何在 Java 中使用 RUDP 创建一个简单的服务器客户端应用程序?

标签 java sockets udp udpclient rudp

我正在开发一个简单的应用程序,使用 UDP 在两台机器之间传输文件,但事实证明这是有损且不可靠的,因此在互联网搜索时我发现了这个名为 Simple Reliable UDP here 的项目,但他们没有任何文档或任何示例代码。因此,如果有人可以帮助我编写这段代码,我将不胜感激,因为我是 Java 新手。我开始编写简单的服务器客户端应用程序,但我得到了地址已绑定(bind)异常。为了明确起见,我只想使用 UDP 连接,这就是我尝试实现 ReliableServerSocketReliableSocket 的原因。

  package stackoverflow;

  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import net.rudp.ReliableServerSocket;
  import net.rudp.ReliableSocket;

  /**
  *
  * @author Nika
  */
  public class udpServer implements Runnable{
  ReliableServerSocket rss;
  ///ocket rs;
  ReliableSocket rs;
  public udpServer() throws IOException {
  rss= new ReliableServerSocket(9876);
  }
  public void run(){
  while (true){
    try {
        rs=(ReliableSocket)rss.accept();
        System.out.println("Connection Accepted");
        System.out.println(""+rs.getInetAddress());
        BufferedReader  inReader = new BufferedReader (new InputStreamReader (rs.getInputStream()));
    //BufferedWriter  outReader = new BufferedWriter (new OutputStreamWriter (rs.getOutputStream()));

        String str= ""+inReader.readLine();

        if(str.contains("UPLOAD")){
            System.out.println("Client wants to upload file");
        }else if(str.contains("D1")){
            System.out.println("Client wants to download file");
       }



    } catch (IOException ex) {
        Logger.getLogger(udpServer.class.getName()).log(Level.SEVERE, null, ex);
    }

  }

  }

      public static void main(String args[]) throws Exception  
   {
      System.out.println("UDP Server Executed");
     Thread t= new Thread( new udpServer());
             t.start();
   }


 }

此处为客户端代码

      package stackoverflow;

      import java.io.BufferedWriter;
      import java.io.IOException;
      import java.io.OutputStreamWriter;
      import net.rudp.ReliableSocket;

      /**
      *
      * @author Nika
      */
     public class UdpFileClient {

     BufferedWriter outReader;
     ReliableSocket server;

    public UdpFileClient(boolean b1, boolean b2) throws IOException {

    if (b1) {
        server = new ReliableSocket("127.0.0.1", 9876);

        outReader = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
        outReader.write("D1");
        System.out.println("Download Req Sent From Client");
        server.close();
        outReader.flush();
        outReader.close();
    }

    if (b2) {
        server = new ReliableSocket("127.0.0.1", 9876);
        outReader = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
        outReader.write("UPLOAD");
        System.out.println("Upload Req Sent From Client");
        server.close();
        outReader.flush();
        outReader.close();
    }

}

public static void main(String args[]) throws Exception {
    System.out.println("UDP CLient Executed");
    new UdpFileClient(true, true);
}

}

我已经知道我可以使用 TCP/IP,但项目要求使用 UDP。如果任何其他方式使用 UDP 以良好的速度无损地发送文件也会有所帮助。

提前致谢!!

最佳答案

我尝试了 RUDP,发现我没有打印我的输出,我知道这是一个愚蠢的错误。

UDP客户端 封装UDPClient;

  import java.io.IOException;
  import java.io.InputStream;
  import java.net.InetSocketAddress;
  import net.rudp.ReliableSocket;

  /**
  *
  * @author Nika
  */
  public class UDPtestc {
  ReliableSocket server;
   public UDPtestc() throws IOException {
     server = new ReliableSocket();
            server.connect(new InetSocketAddress("127.0.0.1", 9876));
    byte[] buffer = new byte[1024];
    int count,progress=0;
    InputStream in = server.getInputStream();
    while((count=in.read(buffer)) >0){
    progress+=count;
    System.out.println(""+progress);
    }
    server.close();            
    }

    public static void main(String[] args) throws IOException {
    new UDPtestc();
    }

    }

UDP服务器

  package UDPServer;

  import java.io.FileInputStream; 
  import java.io.IOException;
  import java.io.OutputStream;
  import java.io.RandomAccessFile;
  import java.net.Socket;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import net.rudp.ReliableServerSocket;
  import net.rudp.ReliableSocket;

  /**
  *
  * @author Nika
  */
  public class UDPtests implements Runnable {

  ReliableServerSocket rss;
  ReliableSocket rs;
  String file;

  FileInputStream bin;

  public UDPtests() throws IOException {
    rss = new ReliableServerSocket(9876);
    Thread serverthread = new Thread(this);
    serverthread.start();

   }

   public void run() {
    while (true) {
        try {
            rs =  (ReliableSocket)rss.accept();
            System.out.println("Connection Accepted");
            System.out.println("" + rs.getRemoteSocketAddress());

              file = "";
        Long size=0L;
             file += "10MB.txt";
                size+=10*1024*1024;

        RandomAccessFile r1= new RandomAccessFile(file,"rw");
        r1.setLength(size);
        byte[] sendData = new byte[1024];

        OutputStream os = rs.getOutputStream();
        //FileOutputStream wr = new FileOutputStream(new File(file));
        bin= new FileInputStream(file);
        int bytesReceived = 0;
        int progress = 0;
        while ((bytesReceived = bin.read(sendData)) > 0) {
            /* Write to the file */
            os.write(sendData, 0, bytesReceived);
            progress += bytesReceived;
            System.out.println(""+progress);
        }



        } catch (IOException ex) {
            Logger.getLogger(udpServer.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

public static void main(String[] args) throws IOException {
    new UDPtests();
}

}

如果可能的话,很快我将发布有关 RUDP 的其他评论。

关于java - 如何在 Java 中使用 RUDP 创建一个简单的服务器客户端应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983298/

相关文章:

java - 无法创建 AndroidViewModel 子类的实例

java - j2me中有没有可用的API可以让我们检测金属?

python发送csv数据到spark streaming

sockets - 在UDP套接字上即时更改SOL_SOCKET,SO_RCVBUF的可预期行为是什么?

java - Java 7 和 8 中方法的最大大小

java - 通过for循环将节点添加到面板时出错

c - 无法设置套接字选项 IPV6 多播 : No such device error

python - 捕获套接字超时异常

c++ - UDP 多播不适用于 linux Debian

error-handling - UDP协议(protocol)是否有一些错误检测?