Проблема отправки данных через UDP-сокеты - PullRequest
0 голосов
/ 15 сентября 2011

Это своего рода продолжение вопроса, который у меня был вчера.У меня было домашнее задание на отправку и получение данных через соединение сокета клиент / сервер TCP.Я хотел бы сделать версию с использованием UDP.Идея состоит в том, что я могу перенаправить стандартный ввод-вывод и отправить потоки, используя UDP.Например, если я наберу:

 server: java UDPServer 5555 < file1.txt
 client: java UDPClient localhost 5555 > file2.txt

Он должен отправить данные из file1.txt с сервера в файл file2.txt клиента.Когда я запускаю пару клиент / сервер в отдельных терминалах, создается файл file2.txt, но данные никогда не отправляются.Вместо этого кажется, что я застрял в бесконечном цикле, где я не могу ничего ввести в терминал, пока я не убью приложение.

Код сервера:

public static final int BUF_SIZE = 256;

public static void main(String[] args) throws IOException{

    port = Integer.parseInt(args[0]);

    DatagramSocket serverSocket = new DatagramSocket(port);

    BufferedInputStream input = new BufferedInputStream(System.in);
    BufferedOutputStream output = new BufferedOutputStream(System.out);

    byte[] receiveData = new byte[BUF_SIZE];
    byte[] sendData = new byte[BUF_SIZE];
    byte[] buf = new byte[BUF_SIZE];
    String sentence;

    if(System.in.available() > 0) {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        InetAddress address = receivePacket.getAddress();
        int bytesRead = 0;
        while((bytesRead = input.read(buf, 0, BUF_SIZE)) != -1) {
            sentence = new String(buf, 0, bytesRead);
            sendData = sentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
            serverSocket.send(sendPacket);
        }
    } else {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        sentence = new String(receivePacket.getData());
        output.write(sentence.getBytes());
    }

    serverSocket.close();
    input.close();
    output.close();
}

И код клиента:

public static final int BUF_SIZE = 256;

public static void main(String[] args) throws IOException{

    String hostName = args[0];
    port = Integer.parseInt(args[1]);

    DatagramSocket clientSocket = new DatagramSocket();
    InetAddress address = InetAddress.getByName(hostName);

    BufferedInputStream input = new BufferedInputStream(System.in);
    BufferedOutputStream output = new BufferedOutputStream(System.out);

    byte[] sendData = new byte[BUF_SIZE];
    byte[] receiveData = new byte[BUF_SIZE];
    byte[] buf = new byte[BUF_SIZE];
    String sentence;

    if(System.in.available() > 0) {
        int bytesRead = 0;
        while((bytesRead = input.read(buf, 0, BUF_SIZE)) != -1) {
            sentence = new String(buf, 0, bytesRead);
            sendData = sentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
            clientSocket.send(sendPacket);
        }
    } else {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        sentence = new String(receivePacket.getData());
        output.write(sentence.getBytes());
    }

    clientSocket.close();
    input.close();
    output.close();
}

Я все еще новичок в программировании сокетов, поэтому я опираюсь на примеркод в моем учебнике.Есть ли какая-то явная ошибка, которую я совершаю, которая препятствует передаче данных?Большое спасибо за ваше терпение и помощь!

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Вам не хватает всего, что вам нужно сделать, чтобы сделать эту работу.Где код, чтобы сделать время передачи, повторные передачи, подтверждения, переупорядочение и так далее?Если вы хотите использовать UDP, вы должны сделать все, что делает для вас TCP.

См., Например, RFC 1350 для примера протокола передачи файлов, расположенного поверхUDP.

0 голосов
/ 15 сентября 2011

Первая проблема, с которой вы столкнулись, заключается в том, что client.main не запускается из-за неправильной команды оболочки.По какой-то причине с Java вы не можете перенаправить вывод, как это обычно делается.Вы можете просто поместить несколько операторов print в начало client.main , чтобы увидеть, что ничего не выполняется.Попробуйте это:

java UDPClient localhost 5555 | tee file2.txt

См. перенаправление вывода Java .

Другая проблема, с которой вы столкнулись, заключается в том, что и клиент, и сервер ждут получения дейтаграммы.У вас в коде сервера:

if(System.in.available() > 0) {
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);

И у вас в коде клиента:

else {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        sentence = new String(receivePacket.getData());
        output.write(sentence.getBytes());
        }

Обратите внимание, что оператор else всегда будет выполняться, потому что System.in.available всегда будет возвращать 0. Помните, что вы не перенаправляли ввод на клиент, поэтому в System.in ничего нет.Чтобы это исправить, необходимо сначала отправить клиентскую дейтаграмму, чтобы сервер мог ответить с содержимым file2.txt .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...