Пишу приложение для широковещательной рассылки сообщений через UDP. Сервер может только посылать сообщения, клиенты только принимать.
На сервере использую DatagramSocket, на клиенте - MulticastSocket. На компе, подключенном к локальной сети, все работает нормально. А вот из дома - комп подключен к интернету без локальной сети, - клиент сообщения не принимает.
Код сервера:
Код | import java.io.*; import java.net.*;
public class Server {
private BufferedReader in = null; private String str = null; private byte[] buffer; private DatagramPacket packet; private InetAddress address; private DatagramSocket socket;
public Server() throws IOException { System.out.println("Sending messages"); // Создается объект DatagramSocket, чтобы // принимать запросы клиента socket = new DatagramSocket(); // Вызов метода transmit(), чтобы передавать сообщение всем // клиентам, зарегистрированным в группе transmit(); }
public void transmit() { try { in = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("Введите строку для передачи клиентам: "); str = in.readLine(); buffer = str.getBytes(); address = InetAddress.getByName("233.0.0.1"); // Посылка пакета датаграмм на порт номер 1502 packet = new DatagramPacket( buffer, buffer.length, address, 1502); //Посылка сообщений всем клиентам в группе socket.send(packet); } } catch (Exception e) { e.printStackTrace(); } finally { try { // Закрытие потока и сокета in.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
public static void main(String arg[]) throws Exception { // Запуск сервера new Server(); } }
|
Код клиента:
Код | import java.net.*;
public class Client { private static InetAddress address; private static byte[] buffer; private static DatagramPacket packet; private static String str; private static MulticastSocket socket;
public static void main(String arg[]) throws Exception { System.out.println("Ожидание сообщения от сервера"); try { // Создание объекта MulticastSocket, чтобы получать // данные от группы, используя номер порта 1502 socket = new MulticastSocket(1502);
address = InetAddress.getByName("233.0.0.1");
// Регистрация клиента в группе socket.joinGroup(address); while (true) { buffer = new byte[256]; packet = new DatagramPacket(buffer, buffer.length); // Получение данных от сервера socket.receive(packet); str = new String(packet.getData()); System.out.println( "Получено сообщение: " + str.trim()); } } catch (Exception e) { e.printStackTrace(); } finally { try { // Удаление клиента из группы socket.leaveGroup(address); // Закрытие сокета socket.close(); } catch (Exception e) { e.printStackTrace(); } } } }
|
Искал в интернете - пишут что, для подключений не LAN надо как то по другому писать, а как именно не нашел. Причем необходимо сделать с использованием именно multicastsocket - задание лабораторной.
|