首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带回传N的Java传输

带回传N的Java传输
EN

Stack Overflow用户
提问于 2015-03-06 03:15:45
回答 2查看 2.3K关注 0票数 0

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

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

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

有可能这样做吗?我该怎么做改变呢?我试图创建两个套接字,以便在同一个端口号上发送和接收,但我总是收到以下错误:

代码语言:javascript
复制
  java.net.BindException: Address already in use

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

添加代码:发件人:

代码语言:javascript
复制
    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);
    }
}

同样适用于接收机

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-06 04:08:06

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-03-06 04:04:33

首先,为什么要在客户端创建两个套接字,以便在可以使用相同的socket_client进行发送和接收时进行发送和接收。您可以通过创建两个线程来做到这一点,一个线程用于发送,另一个线程用于使用相同的socket_client接收。

代码:就像这样

代码语言:javascript
复制
 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"); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28891803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档