Java UDP客户端/服务器对象传输帮助
我正在尝试使用UDP协议将ArrayList从客户端传输到服务器 传输从“max”if语句开始。 服务器端也一样 这是客户:Java UDP客户端/服务器对象传输帮助,java,sockets,udp,Java,Sockets,Udp,我正在尝试使用UDP协议将ArrayList从客户端传输到服务器 传输从“max”if语句开始。 服务器端也一样 这是客户: public class UdpClient { protected DatagramPacket sendPacket; protected DatagramPacket receivePacket; public static void main(String args[]) throws IOException, ClassNotFoundExce
public class UdpClient {
protected DatagramPacket sendPacket;
protected DatagramPacket receivePacket;
public static void main(String args[]) throws IOException,
ClassNotFoundException {
UdpClient upd = new UdpClient();
ArrayList<Integer> arr = new ArrayList<Integer>();
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
DatagramSocket clientSocket = new DatagramSocket();
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutput oo = new ObjectOutputStream(bStream);
ByteArrayInputStream baos;
ObjectInputStream oos;
System.out
.println("Commands: Time, Date, Weather, Sum-number, Max-number, Exit");
while (true) {
String fromUsr = inFromUser.readLine();
if (fromUsr.equals("bye")) {
break;
} else if (fromUsr.equals("weather")) {
sendData = fromUsr.getBytes();
upd.sendPacket(sendData, clientSocket);
System.out
.println("Please select a ctiy: Lund, Malmo, Stockholm");
String weather = inFromUser.readLine();
sendData = weather.getBytes();
upd.sendPacket(sendData, clientSocket);
upd.receivePacket(clientSocket, receiveData);
} else if (fromUsr.equals("max")) {
sendData = fromUsr.getBytes();
upd.sendPacket(sendData, clientSocket);
String max = inFromUser.readLine().trim();
upd.nums(max, arr);
oo.writeObject(arr);
byte[] buf = new byte[bStream.toByteArray().length];
buf = bStream.toByteArray();
upd.sendPacket(buf, clientSocket);
System.out.println(arr);
} else {
// send data that of the user
sendData = fromUsr.getBytes();
upd.sendPacket(sendData, clientSocket);
upd.receivePacket(clientSocket, receiveData);
}
String fromServer = new String(upd.getData());
System.out.println("Message from server:\n" + fromServer);
}
}
private void sendPacket(byte[] sendData, DatagramSocket clientSocket)
throws IOException {
InetAddress IPAddress = InetAddress.getByName("ericman-PC");
sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,
9876);
clientSocket.send(sendPacket);
}
private void receivePacket(DatagramSocket serverSocket, byte[] receiveData)
throws IOException {
byte[] rData = new byte[1024];
receiveData = rData;
receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
}
这就是我在服务器端遇到的错误
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00000000
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at UdpServer.main(UdpServer.java:54)
如果你能帮我解决为什么会发生这个错误?塔克斯 您的代码会创建大量数组,并立即丢弃。我将使用调试器逐步完成代码,以便您了解它在做什么
private void receivePacket(DatagramSocket serverSocket, byte[] receiveData)
throws IOException {
// create a new array
byte[] rData = new byte[1024];
// throw away the orignal array so the new array will be update.
receiveData = rData;
// copy into the new array, not the old one.
receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
}
在这种情况下,原始的receiveData
不会被修改,因此它将包含大量0
字节
这将创建三个阵列,而您只需要一个阵列。创建第一个数组
bStream.toByteArray()
,只是为了确定它的长度。创建长度相同但为空的第二个数组,并将其放入buf
最后丢弃第二个数组,并将其替换为第一个数组的副本。如果数据很容易超过1024字节,则读取前1024字节是正确的。private void receivePacket(DatagramSocket serverSocket,byte[]receiveData)抛出IOException{//创建一个新数组字节[]rData=新字节[1024];//丢弃原始数组以便更新新数组。receiveData=rData;//复制到新数组,而不是旧数组。receivePacket=新DatagramPacket(receiveData,receiveData.length);serverSocket.receive(接收数据包);}
我就是这样做的,因为如果我一次又一次地使用该方法,它会保留以前接收到的部分字节。您是否建议使用其他方法,以使接收字节的方法始终保持为空,从而不包含以前的字节?为什么包含以前的字节很重要?Java是按值传递的,因此您无法更改ge呼叫者引用。例如,如果在第一个命令中我询问时间,服务器会向我发送时间,然后如果我询问天气,该字节仍然包含一些时间数字,这取决于天气信息的大小,在我的情况下,天气信息是晴朗的。这就是我所做的,因此每次我从服务器我的缓冲区是空的。所以如果我没有这样做,我会从我以前的请求中得到打印的信息
baos = new ByteArrayInputStream(buf);
oos = new ObjectInputStream(baos);
private void receivePacket(DatagramSocket serverSocket, byte[] receiveData)
throws IOException {
// create a new array
byte[] rData = new byte[1024];
// throw away the orignal array so the new array will be update.
receiveData = rData;
// copy into the new array, not the old one.
receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
}
byte[] buf = new byte[bStream.toByteArray().length];
buf = bStream.toByteArray();