Как отправить список массивов через UDP-сервер / клиент - PullRequest
0 голосов
/ 18 июля 2011

Я создаю лабораторию для своего университета и должен использовать UDP для передачи некоторого arrayList через клиент на сервер с помощью сокетов. У меня так много поисков, но я все равно не могу заставить их работать.

До сих пор у меня на стороне клиента

ArrayList <Integer> arr = new ArrayList<Integer>();
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutput oo = new ObjectOutputStream(bStream); 
//here i add some code to fill the array..
oo.writeObject(arr);
byte [] buf=bStream.toByteArray();
upd.sendPacket(buf, clientSocket); //this is a method for sending packets

И на стороне сервера я получил

            ByteArrayInputStream baos;
            ObjectInputStream oos;

$ это где реализовать код

 else if (str.equals("max")) {
System.out.println("waitng for object to come");
upd.receivePacket(serverSocket, receiveData); //here i receive the datagram packet 
baos = new ByteArrayInputStream(receiveData);
oos = new ObjectInputStream(baos);
ArrayList<Integer> arr = (ArrayList<Integer>)oos.readObject();                                                  
    System.out.println(arr);
}

Я был бы очень признателен, если бы вы могли дать мне подсказку или просто немного рассказать о логике того, как это сделать.

PS. Пожалуйста, не говорите мне об использовании RMI или любого другого метода для этого, мне нужно сделать это только с использованием UDP. Спасибо

Ответы [ 2 ]

1 голос
/ 18 июля 2011

UDP основан на сообщениях, а не на потоках, как TCP.UDP не гарантирует доставку.Это не гарантирует, что получатель получает сообщения (дейтаграммы) в том же порядке, в котором они были отправлены.Предполагается, что вы должны разделить свои данные на порции и правильно их упорядочить, чтобы получатель мог снова собирать порции в то, что отправляется.Это упражнение, вероятно, представляет собой пример того, как TCP обрабатывает все эти детали:)

Максимальный размер дейтаграммы UDP составляет 64 КБ, хотя все практические приложения пытаются ограничить размер пакета максимум MTU (1500 для Ethernet минус)20 байтов заголовка IPv4 минус 8 байтов заголовка UDP = 1472)

При этом, возможно, вы захотите добавить небольшой заголовок к каждой дейтаграмме, чтобы указать размер полезной нагрузки данных и ее порядок в потоке приложения".

Я не работаю в Java, поэтому я отсылаю вас к примерам для использования API.

0 голосов
/ 18 июля 2011

Шаблон на стороне сервера выглядит примерно так:

    byte[] buf = new byte[1024];
    DatagramSocket s = new DatagramSocket(1234);
    DatagramPacket p = new DatagramPacket(buf, buf.length);
    s.receive(p);

и на стороне клиента:

    DatagramSocket c = new DatagramSocket();
    InetSocketAddress addr = new InetSocketAddress("hostname",1234);
    DatagramPacket newPacket = new DatagramPacket(buf, 0, buf.length, addr);
    c.send(newPacket);

Конечно, вам нужно позаботиться о том, как кодировать ваши данные и убедиться, что они завершены на принимающей стороне, потому что UDP не заботится об этом! Это означает, что вам нужно реализовать собственный протокол согласованности. Передающая сторона никогда не может быть уверена, если данные были получены и на другом конце. Для передачи данных, таких как ArrayLists, я бы предпочел использовать связь через сокет TCP. Также обратите внимание, что размер пакета ограничен. Подробности смотрите в DatagramPacket # setSendBufferSize (int size).

...