2014-04-06 2 views
0

Java 소켓에 문제가 있습니다.@ Java/Android Socket 메시지를 읽지 못했습니다.

로컬 네트워크를 통해 서버와 클라이언트를 연결해야하며 라우터에 두 개 이상의 장치가 연결될 수 있으므로 클라이언트는 서버의 주소를 알아야합니다.

이 문제를 해결하는 유일한 방법은 클라이언트 IP (v4) 주소의 세 번째 숫자를 가져와 254 개의 다른 가능한 IP를 모두 루프하는 것입니다. (이 방법은 매우 느리고 많은 문제가 발생할 수 있음을 알고 있습니다. 대체 방법을 알고 있다면 기꺼이 것입니다).

실제로 클라이언트는 안드로이드 스마트 폰이므로 DHCP-Info를 얻을 수 있습니다.

문제는 장치가 서버인지 확인하기위한 읽기 명령이 영원히 지속된다는 것입니다.

일부 코드가 필요한 경우 여기를 클릭하십시오.
코드 :
에서 onCreate :

final WifiManager manager = (WifiManager) super.getSystemService(WIFI_SERVICE); 
    final DhcpInfo dhcp = manager.getDhcpInfo(); 
    final String address = intToIp(dhcp.ipAddress); 
    String addresspart=address.substring(0, address.lastIndexOf('.')+1); 
    ArrayList<HashMap<String, String>> l = null; 
    Log.d("Keyboard","initiating search"); 
    try { 
     l = new checkConnections().execute(addresspart).get(); 
    } catch (InterruptedException e1) { 
     e1.printStackTrace(); 
    } catch (ExecutionException e1) { 
     e1.printStackTrace(); 
    }  

checkConnections :

ArrayList<HashMap<String,String>> l=new ArrayList<HashMap<String,String>>(); 
     for(int i=1;i<=255;i++){ 
     try { 
      worksocket=new Socket(addresspart[0]+i,61927); 
      workout=new BufferedOutputStream(worksocket.getOutputStream()); 
      workin=new BufferedInputStream(worksocket.getInputStream()); 
      byte[] buffer=new byte[6]; 
      workin.read(buffer);//at this point the app freezes until you stop the serverside program 
      String answer=new String(buffer,"UTF-8"); 
      Log.i("Keyboard","Welcome Message: "+answer); 
      if(answer.equalsIgnoreCase("sdk on")){ 
       HashMap<String,String> hm=new HashMap<String,String>(); 
       hm.put("address",addresspart[0]+i); 
       l.add(hm); 
       workout.write(intToBytes(8)); 
       workout.write("closing".getBytes("UTF-8")); 
       worksocket.close(); 
       continue; 
      } 
      else{ 
       Log.d("Keyboard","No SDK-Programm detected"); 
       worksocket.close(); 
       continue; 
      } 
     } catch (UnknownHostException e) { 
      Log.d("Keyboard",addresspart[0]+i+" doesn't exists"); 
      continue; 
     } catch (InterruptedIOException e){ 
      Log.w("System.warn",e.getCause()+e.getLocalizedMessage()); 
      Log.d("Keyboard","timeout"); 
      continue; 
     } catch (IOException e) { 
      Log.d("Keyboard",addresspart[0]+i+" doesn't exists"); 
      e.printStackTrace(); 
      continue; 
     } 
     } 
     return l; 

서버의 코드 :

ServerSocket serverSocket = new ServerSocket(61927); 
     System.out.println("Socket initiated"); 
     Socket client = serverSocket.accept(); 
     BufferedInputStream in=new BufferedInputStream(client.getInputStream()); 
     BufferedOutputStream out=new BufferedOutputStream(client.getOutputStream()); 
     System.out.println("client found"); 
     byte[] buffer=new byte[11]; 
     out.write("sdk on".getBytes("UTF-8")); 
     in.read(buffer); 
     String s=new String(buffer,"UTF-8"); 
     if(!s.equals("got info")){ 
      System.out.println("No SDK Client"); 
      client.close(); 
      serverSocket.close(); 
      new Main(); 
    } 
+0

Bro는 서버가 실행 루프에서 무언가를 보내고 받도록해야합니다. – ecle

+0

Java에서 서버를 만드는 방법은 tutorials.jenkov.com/java-multithreaded-servers/index.html을 참조하십시오. 안드로이드에 적용 할 수 있으며, 안드로이드에서 사용할 수있는 Java 클래스를 알고있는 한) – ecle

+0

멀티 스레딩에 대해 알고 있지만 서버가 한 번에 하나의 클라이언트 만 받아들이 길 원합니다. PC가 서버 인 키보드 앱이어야하며 키보드가 두 개 이상이면 역효과가 난다. – A13XI5

답변

0

어, 나는 방송-IP를 핑 (ping)에 대한 답변을 수신해야한다고 생각 대신 ...
Android의 Linux 런타임을 사용하면 어떤 IP에서 답이 나오는지 읽어보십시오.

관련 문제