제목에서 알 수 있듯이, Java 프로젝트에서 약간의 문제가 있습니다. 내가하고 싶은 것은 이것이다 :피어 투 피어 (Peer to Peer) LAN상의 발견
- 나는 응용 프로그램이 X
- 는 또한 사이의 연결을 설정하기 위해 응용 프로그램 Y를 이
내가 뭘해야 할 것은 실행하는 다른 세 개의 컴퓨터를 실행하는 두 컴퓨터를 예를 들어, 누군가 X를 실행하는 컴퓨터를 사용하고 discovrey 프로세스가 끝나면 Y 앱을 실행하는 컴퓨터 목록과 IP 및 그 반대로 돌아갑니다.
나는 이것을 UDP 브로드 캐스팅을 사용하여 수행했지만 때로는 실패합니다. 컴퓨터는 기본적으로 라우터를 통해 WiFi를 통해 연결됩니다. 많은 경우에 X 컴퓨터는 UDP 검색 방법을 통해 Y 패킷을 볼 수 있지만 때때로 수동으로 IP를 지정하지 않는 경우도 있습니다. 심지어
private void start_Discovery() throws Exception {
//Keep a socket open to listen to all the UDP trafic that is destined for this port
socket = new DatagramSocket(2005, InetAddress.getByName("0.0.0.0"));
socket.setBroadcast(true);
while (true) {
// System.out.println(getClass().getName() + ">>>Ready to receive broadcast packets!");
//Receive a packet
byte[] recvBuf = new byte[15000];
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
socket.receive(packet);
//Packet received
// System.out.println(getClass().getName() + ">>>Discovery packet received from: " + packet.getAddress().getHostAddress());
// System.out.println(getClass().getName() + ">>>Packet received; data: " + new String(packet.getData()));
//See if the packet holds the right command (message)
String message = new String(packet.getData()).trim();
if (message.equals("DISCOVER_ANDROID_SERVER_REQUEST")) {
byte[] sendData = "DISCOVER_ANDROID_SERVER_RESPONSE".getBytes();
//Send a response
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, packet.getAddress(), packet.getPort());
socket.send(sendPacket);
// System.out.println(getClass().getName() + ">>>Sent packet to: " + sendPacket.getAddress().getHostAddress());
}
}
}
때로는 서로를 볼 수없는 이유 : 내 "서버"
public static ArrayList<InetAddress> searchComputer() {
ArrayList<InetAddress> targets = new ArrayList<InetAddress>();
try {
c = new DatagramSocket();
c.setBroadcast(true);
byte[] sendData = "DISCOVER_PC_SERVER_REQUEST".getBytes();
try {
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 2005);
c.send(sendPacket);
} catch (Exception e) {}
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface) interfaces.nextElement();
if (networkInterface.isLoopback() || !networkInterface.isUp()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
InetAddress broadcast = interfaceAddress.getBroadcast();
if (broadcast == null) {
continue;
}
try {
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 8888);
c.send(sendPacket);
} catch (Exception e) { }
}
}
byte[] recvBuf = new byte[15000];
DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
if (useInstant) {
c.setSoTimeout(500);
}
else {
c.setSoTimeout(4000); //EXECUTE THE WHILE FOR 4 SECONDS, THEN RETURN WHATEVER THE RESULTS ARE.
}
while (true) {
c.receive(receivePacket);
String message = new String(receivePacket.getData()).trim();
if (message.equals("DISCOVER_PC_SERVER_RESPONSE")) {
// return receivePacket.getAddress();
targets.add(receivePacket.getAddress());
}
}
// c.close();
} catch (IOException ex){}
return targets;
}
을 그리고 여기에 있습니다 : 여기
는 특정 포트에서 수신 대기 서버를 발견하기위한 코드입니다 그들이 동일한 라우터에 연결되어 있다면? EXTRA : 특별한 경우가 있습니까, X 컴퓨터가 LAN을 통해 연결되어 있고 Y 컴퓨터가 WiFi를 통해 연결되어 있습니까?
정보를 제공해 주셔서 감사합니다.하지만 패킷을 5-6 회 보내면 어떻게 될까요? 나는 약 5 번 패킷을 보내고 매번 답을 찾을 수 있도록 코드를 수정했다. 그러나이 방법이 신뢰할 수 없다면, 내가 사용할 수있는 것이 무엇이든 효율적입니까? 아니면 단순히 더 많은 성공률로? 그리고 하나의 질문입니다. IP를 255.255.255.255 및 0.0.0.0에서 브로드 캐스트 IP로 변경하면 어떻게됩니까? 마찬가지로 192.168.1.255 (미리 계산 됨) – KiralyCraft
'멀티 캐스팅 '은 클래스 C 주소를 사용하여 이루어지며 UDP 서비스를 사용하여 수행됩니다. 매번 패킷을 폴링/전송하는 것 외에는 아무 것도 할 수 없습니다. 또한 조금 넓은 의미이기 때문에 질문에 대답 할 수 없습니다. 192.168.1.255를 사용하여 방송에 대한 도움말과 관련하여 새롭고/새로운 질문을하십시오! –
고마워, 곧 클래스 C 브로드 캐스팅에 대한 새로운 질문을 던질 것입니다. D – KiralyCraft