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();
}
Bro는 서버가 실행 루프에서 무언가를 보내고 받도록해야합니다. – ecle
Java에서 서버를 만드는 방법은 tutorials.jenkov.com/java-multithreaded-servers/index.html을 참조하십시오. 안드로이드에 적용 할 수 있으며, 안드로이드에서 사용할 수있는 Java 클래스를 알고있는 한) – ecle
멀티 스레딩에 대해 알고 있지만 서버가 한 번에 하나의 클라이언트 만 받아들이 길 원합니다. PC가 서버 인 키보드 앱이어야하며 키보드가 두 개 이상이면 역효과가 난다. – A13XI5