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

안드로이드 1:1 채팅 구현(<서버>단말기 - <클라>단말기) 수신 스레드 문제

+1 추천

안녕하세요.

안드로이드 공부하면서 앱을 하나하나 만들어 보려 합니다.

지금 일대일 채팅 앱을 만드는 중인데

송신부분은 구현이 되었는데 수신부분을

스레드로 돌렸는데도 계속  죽습니다.

소스 점 봐주시길 부탁드려요.

1.수신 스레드를 어느시점에서 실행시켜야 할지......

-onCreate에서 돌렸더니 죽어버려서

연결 버튼 누를 때 실행시켰는데 그래도 죽더라구요

어느시점에서 실행해야 하는지 왜 그런지도 궁금합니다.

 

2.수신된 값이 있을때만 그 값을 화면에 뿌려주게 구현......

-

if(in.read(arr) == 0){

 

}
else{
}
수신 스레드에 이렇게 적어서 else일 경우에만 화면에 글을 뿌려주도록 하는게 맞는지요?
 
 
ㅜ0ㅜ 도움을 청합니다~~!
 
아래는 서버부분의 소스입니다.

package com.example.testchatserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
public TextView view;
public EditText input;
public Button connectBtn;
public Button send;
ServerSocket serverSocket;
Socket socket;
ProgressDialog loadDialog;
InputStream in;
OutputStream out;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

view = (TextView)findViewById(R.id.textView1);
input = (EditText)findViewById(R.id.editText1);
connectBtn = (Button)findViewById(R.id.button1);
connectBtn.setOnClickListener(this);
send = (Button)findViewById(R.id.button2);
send.setOnClickListener(this);

serverSocket = null;//서버소켓 생성
socket = null;//연결 후 사용할 소켓 생성
}//onCreate



@Override
public void onClick(View arg0) {


if(arg0.equals(connectBtn))//연결 버튼을 눌렀을 때
{
loadDialog = ProgressDialog.show(this, "연결 대기중", "잠시 기다려 주세요.", true, false);//대기중 다이어로그 출력
Thread thread = new Thread(new Runnable(){

@Override
public void run() {
try {
serverSocket = new ServerSocket(8000);
} catch (IOException e) {
e.printStackTrace();
}
try {
socket = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
loadDialog.dismiss();//연결 후 대기중 다이어로그 제거


}//run
});//thread
thread.start();//연결 스레드 실행
}//connect btn click


else if(arg0.equals(send))//전송 버튼을 눌렀을 때
{
try{//에디트박스에 써있는 문자를 str에 옮긴 후 바이트로 변환하여 전송, 전송된 문자를 화면에도 출력, 에디트박스 초기화
out = socket.getOutputStream();
String str = input.getText().toString();
out.write(str.getBytes());
Log.d("send", str);
view.append(str + "\n");
input.setText("");
}
catch(Exception e){
//System.out.println(e.getMessage());
}
finally{
try{
// socket.close();
}
catch(Exception ignored){}
try{
// serverSocket.close();
}
catch(Exception ignored){}
}
}// send btn click

}//onClick

// receiveThread.start();//수신 스레드 실행
Thread receiveThread = new Thread(){//수신스레드.
public void run(){

while(true){

byte arr[] = new byte[100];
try {
in.read(arr);
} catch (IOException e) {
e.printStackTrace();
}

Message msg = new Message();
Bundle data = new Bundle();
data.putByteArray("data", arr);
msg.setData(data);
mHandler.sendMessage(msg);//수신된 값인 arr을  화면에 출력하기위해 핸들러로 보냄(ui 관련 부분이므로)

//view.append(new String(arr));
Log.d("why", new String(arr));
}//while
}//run
};//receiveThread


Handler mHandler = new Handler(){
  public void handleMessage(Message msg){
          super.handleMessage(msg);
          byte arr[] = new byte[100];
          arr = msg.getData().getByteArray("data");
          view.append(new String(arr) + "\n");//arr을 받아서 출력
  }
};

}//end
Androidevice (330 포인트) 님이 2013년 3월 9일 질문
수신 스레드를 사용하는 부분이 없어보이는데요?
그리고 죽는다면 로그가 있어야 알아볼 수 있지 않아보일까요
로그를 보세요.
개발의 기본은 뭐가 잘못된것인지 파악하는 것부터 인것 같습니다.
로그부터 보세요.
수신 스레드 돌리니 계속 죽어서 일단 빼놨어요 .ㅜ
로그 보는 것부터 공부해야 할까요?
로그 보는것도 어려운것 같아요;;
널 익셉션밖에 안보여요..ㅜ
다들 말씀 감사합니다.
로그 공부 좀 하고 다시 해야겠어요 ㅎ

2개의 답변

+1 추천
오래된 책에서 발췌하신 소스 같습니다.

 

허니컴 이상 api에서는

UI스레드에서 네트워크관련 동작하지 못하게 바뀌었습니다.

 

네트워크 스레드 부분을 분리하여 별개 클래스로 만들어서 사용하시면 됩니다.

핸들러도 구현하셨으니 서로 바인드하는것도 문제없으실것 같구요
Noizbuster (11,970 포인트) 님이 2013년 4월 3일 답변
–2 추천
와 저도 이거 해보려고 붙잡고 있는데

영 아는게 없으니까 힘드네여...

그냥 자바 서버파일을 안드로이드로 적용시키는것조차 안되네요... 흐메...
익명사용자 님이 2013년 4월 2일 답변
...