안녕하세요.
안드로이드 공부하면서 앱을 하나하나 만들어 보려 합니다.
지금 일대일 채팅 앱을 만드는 중인데
송신부분은 구현이 되었는데 수신부분을
스레드로 돌렸는데도 계속 죽습니다.
소스 점 봐주시길 부탁드려요.
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