Задать вопрос
@Kamikadze1024

Как игнорировать при приеме широковещательные сообщения от самого себя?

Класс умеет отправлять широковещательные udp сообщения. Как сделать так, чтобы он не принимал отправленные самим собой сообщения?
package com.company.Network;

import java.io.*;
import java.net.*;
import java.util.LinkedList;

import Old.Message.Message;
import Tubes.Tube;

/**
 * @class Network
 * класс-поток для работы с сетью
 */

public class Network implements Runnable {
    private Tube m_in;
    private Tube m_out;

    private final int       m_port = 1300;
    private DatagramSocket  m_socket;

    public Network() {

    }

    public void setTubes(Tube in, Tube out) {
        m_in  = in;
        m_out = out;
    }

    ///отправить сообщение в сеть
    private void sendData(byte [] data) throws Exception {
        if(m_socket == null) {
            return;
        }

        DatagramPacket dp = new DatagramPacket(data, data.length,
                InetAddress.getByName("255.255.255.255"),
                m_port);
        m_socket.send(dp);
    }

    ///сериализовать
    public byte[] serialize (Message msg) throws Exception {
        ByteArrayOutputStream baos =
                new ByteArrayOutputStream();

        ObjectOutputStream oos =
                new ObjectOutputStream(baos);

        oos.writeObject(msg);

        return baos.toByteArray();
    }

    ///десериализовать
    public Message deSerialize(byte[] serialized) throws Exception {
        ByteArrayInputStream bais =
                new ByteArrayInputStream(serialized);

        ObjectInputStream ois =
                new ObjectInputStream(bais);


        return (Message)ois.readObject();
    }

    ///принять данные из сети
    private void receiveData() {
        DatagramPacket dp;
        byte [] data = new byte[1024];
        dp = new DatagramPacket(data, data.length);
        try {
            m_socket.receive(dp);
            m_in.enqueue(deSerialize(data));
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    ///основнойметод потока
    @Override
    public void run() {
        //открытие сокета
        try {
            m_socket = new DatagramSocket(m_port);
        } catch (Exception e) {
            System.out.println(e.toString());
            m_socket.close();
            return;
        }

        //чтение полученных сообщений
        while (true) {
            //есть что отправлять
            if(!m_out.isEmpty()) {
                try {
                    sendData(serialize(m_out.dequeue()));
                } catch(Exception e) {
                    System.out.println(e.toString());
                }
            }

            //получить данные
            receiveData();
        }
    }
}
  • Вопрос задан
  • 379 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Neuroware
@Neuroware
Программист в свободное от работы время
Пока ты не получил сообщение нельзя понять адресовано оно тебе или нет, максимум можно поиграться с маршрутизацией на роутере или что там используется.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Kamikadze1024 Автор вопроса
Я получил сообщение и понял, что оно от меня. Т.е. методов нет?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы