Mutlicast сервер и клиенты подтверждают, отправляя объекты - PullRequest
0 голосов
/ 09 января 2012

Я реализую сервер многоадресной рассылки, который отправляет свой IP-адрес группе многоадресной рассылки, и клиенты в группе, получив IP-адрес сервера, отправляют ему объект.И это делается через равные промежутки времени.

Таким образом, первое соединение - один ко многим, а второе - один к одному.Я реализовал отдельные части, т.е. многоадресную рассылку, правильно отправляю объекты через сокеты, но при запуске его в целом возникает ошибка.

Вот код для: MulticastServer:

public class MulticastServer {
public static void main(String[] args) throws java.io.IOException {
new MulticastServerThread().start();
}
}

MulticastServerThread:

public class MulticastServerThread extends QuoteServerThread {
public void run() {
while (true) {
  try {
    byte[] buf = new byte[256];

    // construct quote
    String dString = InetAddress.getLocalHost().toString();
    buf = dString.getBytes();
InetAddress group = InetAddress.getByName("230.0.0.1");
    DatagramPacket packet = new DatagramPacket(buf, buf.length,
                                               group, 4446);

    // server join group。
    socket.send(packet);

    // sleep for a while
    try {
      sleep((long)(Math.random() * FIVE_SECONDS));
    } catch (InterruptedException e) { }

  } catch (IOException e) {
    e.printStackTrace();
    moreQuotes = false;
  }
}

socket.close();
//Sending the object
 try {
    ServerSocket ss = new ServerSocket(port);
    Socket s = ss.accept();
    InputStream is = s.getInputStream();
    ObjectInputStream ois = new ObjectInputStream(is);
    Object to = (Object)ois.readObject();
    if (to!=null){System.out.println(to.a);}
    System.out.println((String)ois.readObject());
    is.close();
    s.close();
    ss.close();
}catch(Exception e){System.out.println(e);}
}
}

QuoteServerThread:

public class QuoteServerThread extends Thread {
protected DatagramSocket socket = null;
protected BufferedReader in = null;
protected boolean moreQuotes = true;
private static int TTL = 128;
int port=2002;
//Code which returns the IP of the server
}
}

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

public class MulticastClient {
public static void main(String[] args) throws IOException {
MulticastSocket socket = new MulticastSocket(4446);
InetAddress address = InetAddress.getByName("230.0.0.1");
socket.joinGroup(address);

DatagramPacket packet;

// get a few quotes
boolean Condition=true;
while(Condition) {
  byte[] buf = new byte[256];
  packet = new DatagramPacket(buf, buf.length);
  socket.receive(packet);

  String received = new String(packet.getData());
  System.out.println("IP of controller" + received);

  Socket s=new Socket("localhost",2002);
  ObjectOutputStream os=(ObjectOutputStream) s.getOutputStream();
  ObjectOutputStream oos=new ObjectOutputStream(os);
  Object to=new Object();
  oos.writeObject(to);
  oos.writeObject(new String("another object from client"));
  oos.close();
  os.close();
  s.close();
}

socket.leaveGroup(address);
socket.close();
}

Я получаю исключение в потоке "main" java.net.ConnectException: Соединение отклонено по адресу java.net.PlainSocketImpl.socketConnect (собственный метод) на стороне клиента, который указывает на создание сокета на стороне клиента.

Может кто-нибудь помочь мне?Спасибо!

1 Ответ

0 голосов
/ 09 января 2012

Похоже, что сервер не открывает сокет сервера для входящих соединений, пока многоадресный цикл не завершится, что он - afaict - никогда не выполнит из-за "while (true)".

Вы должнызапустите один поток для многоадресной рассылки и (как минимум) один для входящих соединений, чтобы они могли работать отдельно.

...