안녕하세요 다름이 아니라 라즈베리파이에서 서버를 만들어 열어놓고 그 서버에 문자를 보내는 앱을 만들어보고 있는데요
앱 구현해서 전송했다고 뜨긴하는데 서버(구글로 열고)들어가서 콘솔로그 창을 살펴보면 아무 기록도 없더군요
아래는 제가 책보면서 만들어본 문자보내기 앱입니다.
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라는 버튼 누르면 로그가 저렇게 뜹니다..
그런데 서버쪽에서 데이터를 받을 수 있도록 뭔가 설정을 해줘야하지 않을까요?