我是 java 网络编程
的新手。
我尝试通过 UDP 发送名为 Packet 的 object
的多个实例。
发送方:将 String 更改为 charArray,然后在 object
中发送每个字符。
Receiver:接收Datagrampacket,readObject打印出来。
发送方没问题,但接收方只获取对象的第一个实例,并打印与 charArray 长度一样多的次数。这是我的代码:
接收器
public class Receiver {
public static void main(String args[]) throws Exception
{
DatagramSocket rcvSocket;
DatagramPacket rcvPacket;
ByteArrayInputStream bis;
ObjectInputStream ois;
byte[] rcvData;
Packet SnWPacket;
rcvSocket = new DatagramSocket(7777);
rcvData = new byte[1024];
rcvPacket = new DatagramPacket(rcvData, rcvData.length);
while(true)
{
rcvSocket.receive(rcvPacket);
byte[] in = rcvPacket.getData();
bis = new ByteArrayInputStream(in);
ois = new ObjectInputStream(bis);
SnWPacket = (Packet) ois.readObject();
System.out.println("RECIEVED: " + SnWPacket);
ois.close();
bis.close();
}
}
}
发件人
public class Sender {
public static void main(String args[]) throws Exception
{
DatagramPacket sndPacket;
DatagramSocket sndSocket;
ByteArrayOutputStream bos;
ObjectOutputStream oos;
InetAddress addr;
Scanner sc;
char[] charArray;
int seqNo = 0;
byte sndData[];
Packet SnWPacket;
addr = InetAddress.getByName("localhost");
sndSocket = new DatagramSocket();
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
sc = new Scanner(System.in);
System.out.println("Input: ");
String in = sc.nextLine();
charArray = in.toCharArray();
for (int i = 0; i < charArray.length; i++) {
SnWPacket = new Packet("data", seqNo, charArray[i]);
oos.writeObject(SnWPacket);
oos.flush();
sndData = bos.toByteArray();
bos.flush();
sndPacket = new DatagramPacket(sndData, sndData.length, addr, 7777);
sndSocket.send(sndPacket);
System.out.println("SENT: " + SnWPacket);
seqNo += 1;
}
oos.close();
bos.close();
sndSocket.close();
}
}
数据包
public class Packet implements Serializable{
private String type;
private int seqNo;
private char data;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getSeqNo() {
return seqNo;
}
public void setSeqNo(int seqNo) {
this.seqNo = seqNo;
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public Packet(String type, int seqNo, char data)
{
this.type = type;
this.seqNo = seqNo;
this.data = data;
}
public Packet()
{
this.type = "";
this.seqNo = 0;
this.data = ' ';
}
@Override
public String toString() {
return "Packet: \tType: " + this.type + "\tseqNo: " + this.seqNo + "\tdata: " + this.data;
}
}
假设我发送:“abc”
发件人:
SENT: Packet: Type: data seqNo: 0 data: a
SENT: Packet: Type: data seqNo: 1 data: b
SENT: Packet: Type: data seqNo: 2 data: c
接收者:
RECIEVED: Packet: Type: data seqNo: 0 data: a
RECIEVED: Packet: Type: data seqNo: 0 data: a
RECIEVED: Packet: Type: data seqNo: 0 data: a
问题是接收器打印三个“a”。请帮我弄清楚。谢谢!
最佳答案
要调试这类事情,使用 tcpdump
或类似工具来跟踪网络上实际发生的事情会有所帮助:
$ tcpdump -i lo port 7777
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
19:53:20.818460 IP zoo.59305 > zoo.7777: UDP, length 83
19:53:20.822292 IP zoo.59305 > zoo.7777: UDP, length 100
19:53:20.822410 IP zoo.59305 > zoo.7777: UDP, length 117
这告诉您您正在发送您期望的 3 个数据包,但每个数据包比前一个数据包大 17 个字节(而不是所有数据包的大小都相同)。仔细检查您的发送代码可以解释这一点——您使用单个 ObjectOutputStream 来构造数据包,并且您没有在 Packet 对象之间重置它,因此发送的第一个数据包包含第一个 Packet 对象,而第二个包含 TWO 数据包对象(第一个的副本,然后是第二个),第三个包含所有三个。
在接收方,您只解码接收到的数据包中的第一个 Packet 对象并打印它,所以您将第一个对象打印 3 次...
关于java - 通过 UDP 发送对象的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31690061/