안녕하세요.
안드로이드 프로그래밍을 공부하고 있는 다른 업계 직장인입니다.
아직 잘 몰라서, 용어 사용이 서투를지 모르겠습니다...
서버와 클라이언트간 통신 기능을 구현하려고 하는데요.
서버는 일반 JAVA 프로젝트로 구현했고, 클라이언트는 안드로이드 프로젝트로 구현했습니다.
클라이언트에서 서버로 전송하는 것은 잘 되는데,
서버에서 클라이언트로 멀티캐스팅을 해줄 때, 서버에서 SEND는 정상적으로 되는데,
클라이언트에서 RECEIVE할 때, 계속 SocketTimeout Exception이 납니다.
동일한 소스로 클라이언트를 일반 JAVA프로젝트로 구현하면, 정상적으로 수신이 되고요...
원인이 뭔지 도무지 모르겠어서 10시간 동안 헤맸습니다만, 결국 못 찾겠네요.
AndroidManifest에 인터넷권한 설정은 했고요
메인쓰레드에서 네트워크기능 사용할 수 있도록 아래와 같이 설정을 했는데, 혹시 그게 문제일가요?
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
도움 주시면 감사하겠습니다.
클라이언트 소스는 아래와 같습니다.
public class MainActivity extends Activity {
Socket clientSocket;
String serverAddress = "192.168.42.221";
String messageToSend = "asd>>>12345";
MulticastSocket multicastSocket;
InetAddress multicastGroup;
public static final String MULTICAST_ADDRESS = "239.255.255.1";
public static final int MULTICAST_LISTENING_PORT = 5555;
public static final int SERVER_PORT = 12345;
public static final int MESSAGE_SIZE = 512;
TextView retMsg;
EditText sendMsg;
Button send;
String return_message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try
{
clientSocket = new Socket(InetAddress.getByName(serverAddress),SERVER_PORT);
Formatter output = new Formatter(clientSocket.getOutputStream());
output.format("%s\n", messageToSend);
output.flush();
multicastSocket = new MulticastSocket(MULTICAST_LISTENING_PORT);
multicastGroup = InetAddress.getByName(MULTICAST_ADDRESS);
multicastSocket.joinGroup(multicastGroup);
multicastSocket.setSoTimeout(5000);
byte[] buffer = new byte[MESSAGE_SIZE];
DatagramPacket packet = new DatagramPacket(buffer, MESSAGE_SIZE);
try
{
multicastSocket.receive(packet);
/////////////////////////////여기서 receive를 못합니다./////////////////////////
}
catch(SocketTimeoutException socketTimeoutException)
{
socketTimeoutException.printStackTrace();
}
catch(IOException ioException)
{
ioException.printStackTrace();
}
String return_message = new String(packet.getData());
retMsg.setText(return_message);
}
catch(IOException ioException)
{
ioException.printStackTrace();
}
retMsg = (TextView)findViewById(R.id.RETURNMSG);
sendMsg = (EditText)findViewById(R.id.SENDMSG);
send = (Button)findViewById(R.id.SENDBUTTON);
sendListener s_listener = new sendListener();
send.setOnClickListener(s_listener);
sendMsg.setText("1");
retMsg.setText("asd");
}
Logcat 내역은 다음과 같습니다.
08-14 08:58:16.577: E/Trace(689): error opening trace file: No such file or directory (2)
08-14 08:58:22.521: W/System.err(689): java.net.SocketTimeoutException
08-14 08:58:22.537: W/System.err(689): at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:558)
08-14 08:58:22.537: W/System.err(689): at libcore.io.IoBridge.recvfrom(IoBridge.java:516)
08-14 08:58:22.597: W/System.err(689): at java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:161)
08-14 08:58:22.597: W/System.err(689): at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:169)
08-14 08:58:22.597: W/System.err(689): at java.net.DatagramSocket.receive(DatagramSocket.java:253)
08-14 08:58:22.597: W/System.err(689): at com.example.chatting_appl_client.MainActivity.onCreate(MainActivity.java:67)
08-14 08:58:22.597: W/System.err(689): at android.app.Activity.performCreate(Activity.java:5008)
08-14 08:58:22.597: W/System.err(689): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-14 08:58:22.607: W/System.err(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-14 08:58:22.607: W/System.err(689): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-14 08:58:22.617: W/System.err(689): at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-14 08:58:22.617: W/System.err(689): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-14 08:58:22.617: W/System.err(689): at android.os.Handler.dispatchMessage(Handler.java:99)
08-14 08:58:22.617: W/System.err(689): at android.os.Looper.loop(Looper.java:137)
08-14 08:58:22.617: W/System.err(689): at android.app.ActivityThread.main(ActivityThread.java:4745)
08-14 08:58:22.617: W/System.err(689): at java.lang.reflect.Method.invokeNative(Native Method)
08-14 08:58:22.627: W/System.err(689): at java.lang.reflect.Method.invoke(Method.java:511)
08-14 08:58:22.627: W/System.err(689): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-14 08:58:22.627: W/System.err(689): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-14 08:58:22.647: W/System.err(689): at dalvik.system.NativeStart.main(Native Method)
08-14 08:58:22.647: W/System.err(689): Caused by: libcore.io.ErrnoException: recvfrom failed: EAGAIN (Try again)
08-14 08:58:22.668: W/System.err(689): at libcore.io.Posix.recvfromBytes(Native Method)
08-14 08:58:22.668: W/System.err(689): at libcore.io.Posix.recvfrom(Posix.java:131)
08-14 08:58:22.708: W/System.err(689): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
08-14 08:58:22.708: W/System.err(689): at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
08-14 08:58:22.708: W/System.err(689): ... 18 more
도와주세요.. ㅜㅜ