我有一个简单的工作程序,可以用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);
}
}同样适用于接收机
发布于 2015-03-06 04:08:06
端口号是嵌入在网络数据包中的数字。一旦计算机的操作系统处理入站网络数据包,它就需要“知道”将包作为输入传递给哪个程序。端口号用于在接收操作系统的端口到程序表中查找程序。
这就是为什么不能从同一个端口读取两个程序的原因,因为这大致使操作系统无法确定应将数据包发送给哪个程序作为输入。
请注意,这不是获得端口冲突的唯一方法。您也可以在同一台机器上运行两个程序副本。
发布于 2015-03-06 04:04:33
首先,为什么要在客户端创建两个套接字,以便在可以使用相同的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"); https://stackoverflow.com/questions/28891803
复制相似问题