안드로이드 용 socket 통신 어플을 개발중인데요.
SocketChannel 의 넌블커킹모드 동작이 안되서 문의드립니다.
pc 에서 자바로 개발된 client 샘플소스를 안드로이드로 포팅해서 사용해보았는데요.
안드로이드 통신어플에서 서버쪽으로 나가는 데이터는 잘나가는데요.
서버에서 안드로이드 통신어플로 들어오는 데이터가 수신이 안됩니다.
특이한것은, pc 자바용으로 된 샘플( javac 로 컴파일한 버전 )은 서버에서 데이터 수신을 잘합니다.
안드로이드로 포팅한 어플은 데이터 수신을 못합니다. 아마도, 뭔가를 잘못한것 같은데요...
클리이언트 소스를 올립니다. ( 첨부로 올립니다. ) 죄송하지만, 소스좀 봐줄수 있읍니까?
뭐가 잘못되었는지 모르겠네요.
넌블러킹모드로 select()를 사용하고자 하는것이 제목적입니다.
첨부로 코드를 올렸지만, 참고로, Thread 부분만 별도로, 아래 적어보았읍니다.
private Thread SimpleThread = new Thread() {
private SocketChannel sc = null;
CServerSocket ServerSocket = CServerSocket.getInstance();
public void run() {
try{
while(true){
ServerSocket.selector.select();
Iterator it = ServerSocket.selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKey key = (SelectionKey)it.next();
if(key.isReadable()){
read(key);
}
it.remove();
}
}
}catch(Exception e){
}
}
};
제가 좀더 조사해보니 Key.isReadable() 이 동작이 이상한것 같읍니다.
즉, register 해서, SelectionKey.OP_READ 를 설정했는데도,
key.isReadable()을 찍어보면, flase 값이 찍힙니다.
결국, 서버로부터 데이터가 도착해도, readble 한상태로 안되니까,
read 함수로 들어오지 못하는것 같읍니다.
이것에 대한 힌트를 주실분 계신가요?
logcat은 별다른것이 표시됮 않고 있는데요,,
myselector = Selector.open();
mysc = SocketChannel.open(new InetSocketAddress(CPalmInfo.GetServerIP(),CPalmInfo.GetServerPort()));
mysc.configureBlocking(false);
key = mysc.register(myselector, SelectionKey.OP_READ);
if ( key.isReadable())
i = 1;
else
i = 0;
int readops;
readops = key.readyOps();
if (readops != 0 )
i = 1;
else
i = 0;
제가 구글링하다가, 한가지 알아낸 일이 있읍니다. 어느 외국인이, 글을 써놓았는데,
저와 꼭같은 현상을 격은것 같읍니다. 그런데, 답은 안달려있네요
제목은 "SocketChannel is not ready" 입니다.
그리고 다음과 같은 글이 있읍니다. "
Hey,
again i have got a problem with socket programming in Android. My Problem is Selector.select() returns zero that there are no SocketChannels ready for writing. And again the same code works in normal Java but does not work in Android. Here is my code:
즉, java 프로그그램(pc)에서는 잘도는것이, 안드로이드에 포팅을 해놓으니, selector.select()가 항상 0를 리턴한다고 하는군요...
제가 격고 있는 문제와 꼭 같읍니다.
국내의 여러분들, 제문제에 답좀 달아주세요. 피해가는 방법이 없나요?
서버에서 데이타를 보내도, 안드로이드 어플에서 select()를 이용하여, read 할수가 없네요.. -.-
다음은 외국사람이 써놓은 글입니다.
http://stackoverflow.com/questions/4081594/socketchannel-is-not-ready




매니페스트의 권한 미추가로 인한 문제일 가능성이 강하게 느껴집니다. 소스보다 로그가 더 중요한 힌트가 될 것 같네요.