멀티 캐스트에서 문자열 수신에 문제가 있습니다. Java에서 UDP 멀티 캐스트를 사용하는 것은 처음입니다.UDP 멀티 캐스트에서 문자열을받을 수 없습니다.
LAN을 통해 다중 클라이언트 응용 프로그램을 만들고 있습니다. 그래서 로컬 IP 주소를 사용하고 있습니다. 데이터, 요청 등을 보낼 수 있도록 서버의 IP 주소를 찾기 위해 클라이언트가 필요합니다.
서버가 자신의 IP가있는 멀티 캐스트를 5 초마다 문자열로 보냈습니다. 클라이언트가이를 수신 할 수 있어야합니다. 문제는 아무것도받지 못한다는 것입니다. 2 개의 장치로 테스트 중이므로 localhost를 사용할 필요가 없습니다.
여기 내 코드의 일부는 다음과 같습니다 서버 측 :
MulticastIpSender 내가 메인 클래스에서이 방법을 넣어 {private String serverIp;
private int port;
private String multicastAddress;
private long WAITING_TIME = 5000; // 5 seconden
private DatagramSocket socket;
public MulticastIpSender(String serverIp, int port, String multicastAddress) throws SocketException {
super();
this.serverIp = serverIp;
this.port = port;
this.multicastAddress = multicastAddress;
socket = new DatagramSocket(port);
}
public void run() {
while(true){
try {
byte[] buf = new byte[256];
buf = serverIp.getBytes();
InetAddress group = InetAddress.getByName(multicastAddress);
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
socket.send(packet);
System.out.println("sent IP("+serverIp+") to group("+group+") on port "+port);
sleep(WAITING_TIME);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
스레드 확장
공용 클래스 :
private void sendIpAddressToListeners() {
try {
multicastIpSender = new MulticastIpSender(serverIp,PORT,"230.0.0.1");
multicastIpSender.run();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
나는이 같은 serverip로 얻을 :이 장치
String hostName = InetAddress.getLocalHost().getHostName();
InetAddress addrs[] = InetAddress.getAllByName(hostName);
if (!addr.isLoopbackAddress() && addr.isSiteLocalAddress()) {
myIp = addr.getHostAddress();
}
}
System.out.println ("\nIP = " + myIp);
return myIp;
그것이 나에게주는
클라이언트 측 192.168.1.2 :
multicastSocket = new MulticastSocket(PORT);
InetAddress address = InetAddress.getByName(MULTICAST_ADDRESS);
multicastSocket.joinGroup(address);
DatagramPacket serverIpPacket;
byte[] buf = new byte[256];
serverIpPacket = new DatagramPacket(buf, buf.length);
while(receivedIp ==null){
multicastSocket.receive(serverIpPacket);
receivedIp = new String(serverIpPacket.getData(), 0, serverIpPacket.getLength());
System.out.println("received server ip: " + receivedIp);
}
을! PORT = 4445 (서버 및 클라이언트 모두)
누군가가이 문제를 해결할 수 있거나 더 나은 방법을 설명 할 수 있기를 바랍니다.
패킷에 ip를 명시 적으로 보낼 필요는 없습니다. 클라이언트는 패킷이 보낸 패킷을 확인하고 그에 응답 할 수 있어야합니다. – Wug
제공된 모든 네트워킹 조언은 정확합니다. 또한 multicastIpSender.start()를 사용하는 것이 좋습니다. 실제 멀티 스레딩을하고 있다면. run()을 호출하면 호출하는 스레드에서 run() 메서드를 수행하는 반면 start() 메서드는 스레드를 처리 할 새 스레드를 생성합니다. 귀하의 경우에는 중요하지 않을 수 있습니다. – mfrankli
글쎄, 난 여전히 해결책을 찾지 못했지만 방화벽 때문에 차단 될 수 있습니까? 그건 내 로컬 네트워크에만있어 ... – dumazy