마스터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월 14일 질문
alhung47님이 2015년 12월 14일 수정
아.. 지금 보니깐 접속은 되고 메세지 입력해서 보내니깐 can not send 라고 뜨네요.. 이건 문자가 입력 안되었을때일텐데.. 왜이럴까요

답변 달기

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