마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

소켓 통신에 대해서 질문드립니다.

0 추천

안녕하세요 다름이 아니라 라즈베리파이에서 서버를 만들어 열어놓고 그 서버에 문자를 보내는 앱을 만들어보고 있는데요

앱 구현해서 전송했다고 뜨긴하는데 서버(구글로 열고)들어가서 콘솔로그 창을 살펴보면 아무 기록도 없더군요

아래는 제가 책보면서 만들어본 문자보내기 앱입니다.

package c14.tcpsocket;





import android.app.Activity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.StrictMode;

import android.util.Log;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;




import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;




public class MainActivity extends Activity {

    EditText mEditAddr;

    EditText mEditPort;

    EditText mEditSend;

    TextView mTextMessage;

    Socket mSock = null;

    BufferedReader mReader = null;

    BufferedWriter mWriter = null;

    String mRecvData = "";

    CheckRecv mCheckRecv = null;







    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);




        mEditAddr = (EditText)findViewById(R.id.editAddr);

        mEditPort = (EditText)findViewById(R.id.editPort);

        mEditSend = (EditText)findViewById(R.id.editSend);

        mTextMessage = (TextView)findViewById(R.id.textMessage);







        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);




    }







    private class ConnectTask extends AsyncTask<String,String,String>{

        @Override

        protected String doInBackground(String... arg){

            try{




                int nPort = Integer.parseInt(arg[1]);




                mSock = new Socket(arg[0],nPort);




                mWriter = new BufferedWriter(

                        new OutputStreamWriter(mSock.getOutputStream()));




                mReader = new BufferedReader(

                        new InputStreamReader(mSock.getInputStream()));

                mCheckRecv = new CheckRecv();

                mCheckRecv.start();

            } catch (Exception e) {

                Log.d("tag", "Socket connect error.");

                return "Connect Fail";

            }

            return "Connect Succeed";

        }




        protected void onPostExecute(String result){

            mTextMessage.setText(result);

        }




    }




    public void onBtnConnect() {

        if( mSock != null )

            return;




        String serverAddr = mEditAddr.getText().toString();

        String strPort = mEditPort.getText().toString();




        new ConnectTask().execute(serverAddr, strPort);

    }




    private class CloseTask extends AsyncTask<String,String,String> {

        @Override

        protected String doInBackground(String... arg) {

            try {

                if( mSock != null ) {




                    mSock.close();

                    mSock = null;

                    mCheckRecv.destroy();

                    mCheckRecv = null;

                }

            } catch (Exception e) {

                Log.d("tag", "Socket close error.");

                return "Close Fail";

            }

            return "Closed";

        }




        protected void onPostExecute(String result) {

            mTextMessage.setText(result);

        }




    }




    public void onBtnClose() {

        if( mSock == null )

            return;




        new CloseTask().execute();




    }




    private class SendTask extends AsyncTask<String,String,String> {

        @Override

        protected String doInBackground(String... arg) {

            if( mWriter != null )

                return "Can not Send";




            try {




                PrintWriter out = new PrintWriter(mWriter, true);

                out.println(arg[0]);

            } catch (Exception e) {

                Log.d("tag", "Data send error.");

                return "Send Fail";

            }

            return "Send Succeed";

        }




        protected void onPostExecute(String result) {

            mTextMessage.setText(result);

        }




    }




    public void onBtnSend() {




        String strSend = mEditSend.getText().toString();

        mEditSend.setText("");




        new SendTask().execute(strSend);

    }










    public void onClick(View v){

        switch ( v.getId() ) {

            case R.id.btnConnect :




                onBtnConnect();

                break;




            case R.id.btnClose :




                onBtnClose();

                break;




            case R.id.btnSend :




                onBtnSend();

                break;

        }

    }







    Handler mReceiver = new Handler() {

        public void handleMessage(Message msg) {

            mTextMessage.setText(mRecvData);

        }

    };







    public class CheckRecv extends Thread {

        public void run() {

            try {

                while( !Thread.currentThread().isInterrupted() ) {

                    mRecvData = mReader.readLine();

                    mReceiver.sendEmptyMessage(0);

                }

            } catch (Exception e) {

                Log.d("tag", "Receive error");

            }

        }

    }




}

 

디바이스 실행해서 들어가지긴하는데 무슨 문제인지 잘 모르겠네요 소켓통신이란것도 처음해봐서 난감합니다.

 

아래는 안드로이드 로그 창인데요

12-14 07:47:21.993  15827-15827/? I/art﹕ Not late-enabling -Xcheck:jni (already on)
12-14 07:47:21.993  15827-15827/? I/art﹕ Late-enabling JIT
12-14 07:47:21.996  15827-15827/? I/art﹕ JIT created with code_cache_capacity=2MB compile_threshold=1000
12-14 07:47:22.090  15827-15827/? W/System﹕ ClassLoader referenced unknown path: /data/app/c14.tcpsocket-2/lib/x86
12-14 07:47:22.121  15827-15847/? D/OpenGLRenderer﹕ Use EGL_SWAP_BEHAVIOR_PRESERVED: true
12-14 07:47:22.182  15827-15827/? D/﹕ HostConnection::get() New Host Connection established 0xabf3fc80, tid 15827
12-14 07:47:22.191  15827-15840/? I/art﹕ Debugger is no longer active
12-14 07:47:22.255  15827-15847/? D/﹕ HostConnection::get() New Host Connection established 0xb3f881c0, tid 15847
12-14 07:47:22.261  15827-15847/? I/OpenGLRenderer﹕ Initialized EGL, version 1.4
12-14 07:47:22.299  15827-15847/? W/EGL_emulation﹕ eglSurfaceAttrib not implemented
12-14 07:47:22.299  15827-15847/? W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xad711480, error=EGL_SUCCESS

앱 실행하면 이렇게 뜨면서 실행되고

12-14 07:48:16.796  15827-15847/c14.tcpsocket W/EGL_emulation﹕ eglSurfaceAttrib not implemented
12-14 07:48:16.796  15827-15847/c14.tcpsocket W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xad711700, error=EGL_SUCCESS
12-14 07:48:17.670  15827-15847/c14.tcpsocket E/Surface﹕ getSlotFromBufferLocked: unknown buffer: 0xab790e30
12-14 07:48:51.039  15827-15854/c14.tcpsocket D/tag﹕ Socket close error.

서버 접속버튼 누르고 센드 보내고 close라는 버튼 누르면 로그가 저렇게 뜹니다..

 

그런데 서버쪽에서 데이터를 받을 수 있도록 뭔가 설정을 해줘야하지 않을까요?

alhung47 (160 포인트) 님이 2015년 12월 15일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...