2012-03-01 3 views
2

DHCP와 몇 대의 PC가있는 로컬 네트워크가 있습니다. 이 중 하나는 내 서버이어야하며 다른 모든 클라이언트 (클라이언트)와 자동으로 연결되어야합니다. 내 생각은 이것이었다 : 먼저 서버 (SClient)에서 클라이언트 programm를 수신하는 모든 클라이언트 (CServer)에 서버를 만듭니다. SClient가 CServer에 연결되면 SClient는 CServer에게 자신의 IP를 전송하므로이 IP에 서버가 있다는 것을 알게됩니다. 그런 다음 IP 범위 (예 : 192.168.1.xxx)에있는 모든 IP를 시도한 후 실제 서버를 시작하고 모든 클라이언트가 알려진 서버 IP에 연결합니다. 하지만 다음과 같이 해보면 SClient는 192.168.1.0에 연결할 때 첫 번째 IP에서 고정됩니다. SClient가 실패한 연결을 끊고 192.168.1.1로 진행할 수있는 타임 아웃 또는 비슷한 것을 어떻게 정의 할 수 있습니까?새 소켓을 만들 때 시간 초과 추가

import java.lang.*; 
import java.io.*; 
import java.net.*; 

class SClient { 
    public SClient() { 
     for(int i = 120; i < 125; i++){ 
      try{ 
       InetAddress addr = InetAddress.getLocalHost(); 
       String addrs = addr+""; 
       String ip = addrs.substring(addrs.indexOf("/")+1); 
       Socket s1 = new Socket("192.168.1." + i, 1254); 

       OutputStream s1out = s1.getOutputStream(); 
       DataOutputStream dos = new DataOutputStream (s1out); 
       dos.writeUTF(ip); 
       dos.close(); 
       s1out.close(); 
       s1.close(); 
      }catch(IOException e){} 
     } 
    } 
} 

import java.lang.*; 
import java.io.*; 
import java.net.*; 

class CServer { 
    public CServer() throws IOException{ 
     ServerSocket s = new ServerSocket(1254); 

     while(true){ 
      Socket s1=s.accept(); 
      InputStream s1In = s1.getInputStream(); 
      DataInputStream dis = new DataInputStream(s1In); 
      String st = new String (dis.readUTF()); 
      System.out.println(st); 
      dis.close(); 
      s1In.close(); 
      s1.close(); 
    } 
} 

}

+1

192.168.1.0로 시작했기 때문일 수 있습니다. 올바르게 기억한다면 IP 주소는 0으로 끝나지 않을 것입니다. 단지 서브넷 마스크가됩니다. 1시에 시작하여 더 잘 작동하는지 확인하십시오. 그것은 그것이 존재하지 않는 IP로가는 경우 상당히 빨리 시간을 초과해야합니다. 이 경우 –

+0

이 192.168.1.120으로 시작했는데, 123에 존재하는 IP가 있다는 것을 알고 있기 때문에 시간이 초과되지 않습니다. –

답변

15

내 문제에 대한 해결책을 찾았습니다. 그냥하지

Socket s1 = new Socket("192.168.1." + i, 1254); 

으로 어쨌든

Socket s1 = new Socket(); 
s1.setSoTimeout(200); 
s1.connect(new InetSocketAddress("192.168.1." + i, 1254), 200); 

감사와 소켓을 초기화했다!

+2

이것이 문제를 해결하면 자신의 대답을 수락하십시오. 당신은 그것을위한 어떤 포인트도 얻지 못할 것입니다 (물론!). 그러나 그것은 그것이 해결책이라는 것을 알기 때문에 다른 사람들이이 질문을 읽는데 도움이됩니다. –

+1

나는 내 자신의 대답을 받아들이고 싶었지만 16 시간을 더 기다려야했다. 그럼 내가 할거야. –

1

그것은 UDP와 함께이 작업을 수행하는 것이 훨씬 쉽다. 일반적인 논리는 다음과 같습니다

  1. 은 '발견'
  2. 시작 응답이 해당 메시지에 수신되지 않는 경우 '쿼리 마스터 서버'메시지
  3. 을 보내는 모든 컴퓨터에 대해 잘 알려진 포트를 식별 시간 프레임 내에서 정의한 경우 서버는 자동으로 을 서버로 지정합니다.
  4. 이제부터, 자사의 IP 주소와 서버에 '통신 포트'새 컴퓨터에서
  5. 연결에 함께 마스터에서 다시 응답을 얻을 것이다 '쿼리 마스터 서버' 메시지를 보내는 모든 시스템 통신 포트 및 메시지 보내기를 시작하십시오.

두 개 이상의 서버가이 시나리오에서 마스터라고 생각하는 상황이 발생할 수 있으며 충돌 해결 프로세스가 필요하지만 개요를 통해 작업 할 수있는 프로세스에 대한 일반적인 아이디어를 얻을 수 있습니다 너를 위해서.

+0

경쟁 조건을 위해 멀티 캐스트 및 계정을 수행해야합니다. –

+0

예, 실제로 멀티 캐스트를 사용해야합니다. 어떤 경쟁 조건을 언급합니까? – Perception

+0

두 대의 컴퓨터가 서로 몇 초 안에 나 오면 둘 다 마스터에 대한 쿼리를 보내고 마스터가 없습니다 (아직 마스터가 아닙니다). 각각의 이름은 마스터입니다. 이제 2 명의 마스터가 생겼습니다. 나는 당신이 멀티 캐스트 포트를 먼저 열어서 결정할 수 있고, 결정적, 절대적, 전 이적적인 선거 알고리즘을 사용하여 두 가지 (또는 그 이상) 마스터 문제를 다룰 수 있다고 생각합니다.기존 마스터 대 새로운 마스터 이슈는 어떻습니까? 원래의 질문은 하나의 마스터와 많은 클라이언트 (모두 DHCP를 사용하는 시나리오)에 관한 것이었기 때문에 특히 심한 일이었습니다. –