如何在Java中接收多个UDP数据报数据包?
问题描述:
我创建了一个小的演示,其具有的功能是:
- 在UDPClient:
+用户输入的两句话:sentenceA和sentenceB
+比它们传递到UDPServer
- 在UDPServer:
+那些两句话将 资本
+通过这两个句子资本回UDPClient
的问题是,当我通过两句话从UDPClient到UDPServer
例如:“AA”和“BB”。所以,在UDPServer中,我可以准确地获得“aa”和“bb”。但是当我返回大写的句子:从UDPServer到UDPClient的“AA”和“BB”时,我只能得到“AA”。在处理后,我如何在UDPClient中准确地同时获得“AA”和“BB”?
这里是我的代码:
UDP客户:
如何在Java中接收多个UDP数据报数据包?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
public class UDPClient extends Thread {
static int port = 1234;
public UDPClient() {
}
@Override
public void run() {
super.run();
while (true) {
try {
DatagramSocket clientSocket = new DatagramSocket(5678);
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] sendData1 = new byte[1024];
byte[] receiveData = new byte[1024];
System.out.println("\nInput sentenceA : ");
String sentence = inFromUser.readLine();
System.out.println("Input sentenceB : ");
String sentence1 = inFromUser.readLine();
sendData = sentence.getBytes();
sendData1 = sentence1.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 1234);
clientSocket.send(sendPacket);
DatagramPacket sendPacket1 = new DatagramPacket(sendData1, sendData1.length, IPAddress, 1234);
clientSocket.send(sendPacket1);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentenceA = new String(receivePacket.getData());
String modifiedSentenceB = new String(receivePacket.getData());
System.out.println("FROM SERVER : " + " sentenceA : " + modifiedSentenceA + ", sentenceB : " + modifiedSentenceB);
clientSocket.close();
} catch (SocketException ex) {
System.out.println(ex);;
} catch (UnknownHostException ex) {
System.out.println(ex);;
} catch (IOException ex) {
System.out.println(ex);
}
}
}
public static void main(String[] args) throws SocketException {
Thread t = new UDPClient();
t.start();
}
}
UDPServer:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer extends Thread{
public UDPServer(){
}
@Override
public void run() {
super.run(); //To change body of generated methods, choose Tools | Templates.
try {
DatagramSocket serverSocket = new DatagramSocket(1234);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
byte[] sendData1 = new byte[1024];
while(true){
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
String sentence1 = new String(receivePacket.getData());
System.out.println("RECEIVED " + sentence + " sentence1 : " + sentence1);
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
String b = sentence1.toUpperCase();
sendData = capitalizedSentence.getBytes();
sendData1 = b.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
DatagramPacket sendPacket1 = new DatagramPacket(sendData1, sendData1.length, IPAddress, port);
serverSocket.send(sendPacket1);
}
} catch (SocketException ex) {
System.out.println(ex);;
} catch (IOException ex) {
System.out.println(ex);;
}
}
public static void main(String[] args){
Thread serverThead = new UDPServer();
serverThead.start();
}
}
答
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentenceA = new String(receivePacket.getData());
String modifiedSentenceB = new String(receivePacket.getData());
您的客户端只执行一个接收。您正在打印接收到的数据包两次,但它是同一个数据包。
我尝试在客户端声明2个数据包,然后从这2个数据包中获取数据,但没有任何更改。 –
不,你*不是*宣布接收两个数据包。您正在声明两个数据包,它们是*发送的,*未接收的,并且您不会从它们接收任何数据:您发送它。你正在声明*一个*包,并且你一次接收*,然后打印两次。两张照片之间为什么会发生变化?你看起来并不理解你自己的代码。 – EJP