【问题标题】:Java UDP transmission with Go back N使用 Go back N 进行 Java UDP 传输
【发布时间】:2015-03-06 03:15:45
【问题描述】:

我有一个简单的工作程序,可以使用 UDP 传输文件。但是对于每个客户端和服务器,我有两个套接字,它们在一个端口发送数据并在不同的端口接收数据。

比如我的客户端socket_out在9000端口发送数据包,用socket_in接收数据,socket_in在9001端口监听。我的服务器socket_in在9000端口监听,在9001端口发送ACK数据包。

现在我想简化设计,在每个客户端和服务器上只使用一个端口号来接收和发送消息。例如,客户端和服务器程序都在 9000 端口发送和接收数据。

有可能做到吗?我应该如何做出改变?我试图在同一个端口号创建两个用于发送和接收的套接字,但我总是得到这个错误:

  java.net.BindException: Address already in use

我用谷歌搜索发现两个套接字不能共享相同的端口号。

添加代码: 发件人:

    public FileSender(String fileName, int unrelPort, String rcvFileName) {
    DatagramSocket socket_out_client, socket_in_client; 
    System.out.println("Start Sending " + fileName + " through port " +unrelPort + " as " + rcvFileName + ".");
    try {
        // create sockets
        socket_out_client = new DatagramSocket();
        socket_in_client = new DatagramSocket(unrelPort);

        // create input file

        File inputFile = new File(fileName);

        if (!inputFile.exists()) {
            System.err.println("Input file does not exist");
            System.exit(-1);
        }

        // create threads to process data
        InThread th_in = new InThread(socket_out_client,socket_in_client);
        OutThread th_out = new OutThread(socket_in_client, unrelPort, inputFile, rcvFileName);
        th_in.start();
        th_out.start();

    } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
    }
}

接收器也一样

【问题讨论】:

  • 使用同一个socket读写。
  • 你能详细说明一下吗?

标签: java sockets udp


【解决方案1】:

端口号是嵌入在网络数据包中的数字。一旦计算机的操作系统处理了入站网络数据包,它就需要“知道”将数据包作为输入传递给哪个程序。端口号用于在接收操作系统的端口到程序表中查找程序。

这就是为什么不能让两个程序从同一个端口读取的原因,因为这大致使操作系统无法确定数据包应该作为输入发送到两个程序中的哪一个。

请注意,这不是导致端口冲突的唯一方法。您也可以在同一台机器上运行该程序的两个副本。

【讨论】:

    【解决方案2】:

    首先,当您可以使用相同的socket_client 发送和接收时,为什么要在客户端创建两个套接字用于发送和接收。您可以通过使用相同的socket_client 创建两个线程,一个用于发送,一个用于接收。

    代码:类似这样的东西

     DatagramSocket sock = new DatagramSocket();
     new Thread(new Runnable() {
    
                    @Override
                    public void run() {
       try{
         //create packet
         //your logic 
         sock.send(packet); 
        }
       }catch(Exception e){}
    
                 }       
                }).start();
    System.out.println("Debug :: "+"thread 1 started");
    
    new Thread(new Runnable() {
    
                    @Override
                    public void run() {
       try{
            //your logic
            sock.receive(packet)
        }
       }catch(Exception e){}
    
                 }       
                }).start();
    System.out.println("Debug :: "+"thread 2 started"); 
    

    【讨论】:

    • 嗨,我已将代码添加到此问题中。我创建了两个套接字,一个用于发送,一个用于接收。我创建了两个线程,一个用于传入消息,一个用于传出消息
    • 你的意思是我只需要创建一个socket?我只需要构造 socket_in_client = new DatagramSocket(unrelPort);是这个意思吗?
    • 是的,正是因为两个套接字不能在同一个本地端口绑定,这就是你得到那个异常的原因
    • 好,我先试试!
    • 只使用其中的一个等等,我将添加一个简单的程序结构来展示给您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多