我有一个可以通过UDP传输文件的简单工作程序。但是对于每个客户端和服务器,我有两个套接字,分别在一个端口发送数据和在另一个端口接收数据。
例如,我的客户端socket_out在端口9000发送数据包,并通过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);
}
}
接收者也一样
最佳答案
端口号是嵌入在网络数据包中的数字。一旦计算机的操作系统处理了入站网络数据包,它就需要“知道”哪个程序将数据包作为输入传递给它。端口号用于在接收操作系统的端口到程序表中查找程序。
这就是为什么不能从同一端口读取两个程序的原因,因为这大致使操作系统无法确定应将数据包作为输入发送到两个程序中的哪个。
请注意,这不是发生端口冲突的唯一方法。您也可以在同一台计算机上运行该程序的两个副本。