안드로이드 개발 질문/답변
(글 수 45,052)
C#과 소켓통신을 하기위해 전전긍긍하고있습니다..
일단 여기저기 소스 가져와서 합쳐놓은것으로는
보내고, 보내는 순간 에코메세지 받는 것까지는 잘 나오고 되는데요...
문제는 무한대기는 못한다는겁니다..ㅠ.ㅠ
기본적인 프로젝트 구조는~
접속버튼을 처음 누르면 에디트텍스트에 적힌 순서대로 IP , 포트 를 연결하고 , 아래 내용을 전송합니다.
두번째로 접속버튼을 누르거나 전송버튼을 누르면 이미 열린 소켓으로 세번째 EditText내용을 전송합니다.
제가 스레드에 대한 이해도가 낮아서인지... 일단 보내고 에코메세지 받는데 있어서는
전혀 문제가 없는 것 같습니다만... 문제는 지금 필요한것이 접속버튼을 누르게 되면
주기적으로 수신 대기를 할 수 있었으면 하는 것입니다..
많이 어렵고 힘드네요... 도와주시면 정말 감사하겠습니다..ㅠ.ㅠ
아래는 전체 소스코드입니다..
package org.tacademy.thread;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException;
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;
public class MyThreadActivity extends Activity {
/** Called when the activity is first created. */
private Handler mHandler = new Handler(); //핸들러
private TextView tv; //텍스트뷰 정의
private TextView tv2; //텍스트뷰 정의
private EditText edit; //에디트텍스트 정의
private Button btn; //버튼 정의
private boolean click = false; //click값을 false로 지정
private Socket socket; // 소켓 정의
private ObjectOutputStream outstream; //아웃스트림 정의
private ObjectInputStream instream; // 인풋스트림 정의
private ClientThread cth; //클라이언트스레드 정의
public static String msgs; TextView text;
Handler handler;
EditText edit1,edit2,edit3; //에디트텍스트 정의
public Socket cSocket = null;
public static String server = null; // 서버 ip주소
public static int port = 0;
public static String msg; // 포트번호 public PrintWriter streamOut = null;
public BufferedReader streamIn = null;
public static String str;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById (R.id.text);
edit = (EditText) findViewById (R.id.editText3); //아이디를 미리 지정
btn = (Button) findViewById (R.id.connect);
setCth(new ClientThread(mHandler));
}
public ObjectInputStream getInstream() {
return instream;
} public void setInstream(ObjectInputStream instream) {
this.instream = instream;
} public ClientThread getCth() {
return cth;
} public void setCth(ClientThread cth) {
this.cth = cth;
} class ClientThread extends Thread implements View.OnClickListener {
private String host;
private Handler mHandler;
private String obj;
ClientThread (Handler mHandler) {
this.setmHandler(mHandler);
btn.setOnClickListener(this);
}
//송신하기위해 만든 부분
public void onClick(View v) {
if(!click) { //처음 클릭할 때
Log.i("로그","첫번째클릭"); //★★★★★★★로그켓
str = edit.getText().toString(); //str변수에 에디트텍스트값 넣음
start(); //스레드 돌림
Log.i("로그","스레드돌림"); //★★★★★★★로그켓
click = true; // 확인사살
}
else { //그게아니라면
str = edit.getText().toString(); //str에 에디트텍스트값 넣음
try {
Log.i("로그","두번째이상 클릭"); //★★★★★★★로그켓
str = edit.getText().toString(); //str변수에 에디트텍스트값 넣음
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(str);
Log.i("로그","보냄"); //★★★★★★★로그켓
//out.flush();
Log.i("로그","플러쉬 예외처리"); //★★★★★★★로그켓
} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("로그","두번째이상 클릭에서 오류"); //★★★★★★★로그켓
}
}
Button btnAchalasia2=(Button)findViewById(R.id.send);
btnAchalasia2.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("로그","이미지버튼 클릭"); //★★★★★★★로그켓
PrintWriter out;
try {
out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(),"MS949")),true); str = edit.getText().toString(); //str변수에 에디트텍스트값 넣음
out.println(str);
Log.i("로그","보냄"); //★★★★★★★로그켓
out.flush();
} catch (IOException e) {
// TODO 자동 생성된 catch 블록
Log.i("로그","보내기 오류"); //★★★★★★★로그켓
}
}
});
}
@Override //러너블 구문
public void run () {
try {
socket = new Socket("192.168.0.30", 30001);
Log.i("로그","내부스레드 서버열었음"); //★★★★★★★로그켓
} catch (UnknownHostException e1) {
Log.i("로그","내부스레드 서버열기 오류1"); //★★★★★★★로그켓
} catch (IOException e1) {
Log.i("로그","내부스레드 서버열기 오류2"); //★★★★★★★로그켓
}
while(true)
{
try { ReadThread readThread = new ReadThread();
readThread.start();
Log.i("로그","외부스레드 동작"); //★★★★★★★로그켓
start();
//socket.close();
} catch(Exception ex) {
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO 자동 생성된 catch 블록
Log.i("로그","타이머 실패"); //★★★★★★★로그켓
}
}
}
public String getHost() {
return host;
} public void setHost(String host) {
this.host = host;
} public Handler getmHandler() {
return mHandler;
} public void setmHandler(Handler mHandler) {
this.mHandler = mHandler;
}
}
class ReadThread extends Thread {
//수신하기위해 만든 부분
@Override
public void run() {
while(true)
{
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "MS949" ));
Log.i("로그","버퍼리더 정의"); //★★★★★★★로그켓
} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("로그","버퍼리더 정의 실패"); //★★★★★★★로그켓
}
try {
Log.i("로그","수신대기 준비"); //★★★★★★★로그켓
msgs = br.readLine(); // 서버에서 올 메세지를 기다린다.
Log.i("로그","수신대기 중"); //★★★★★★★로그켓
} catch (IOException e) {
Log.i("로그","수신 실패");
}
Log.i("로그","수신대기 완료"); //★★★★★★★로그켓
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO 자동 생성된 catch 블록
Log.i("로그","타이머 실패"); //★★★★★★★로그켓
}
mHandler.post(new Runnable () { //추가스레드(UI변경용)
public void run() { tv.append("\n받은 값 :"+msgs);//출력부
Log.i("로그","텍스트 수정"); //★★★★★★★로그켓
}
});
}
}
}
}
──────────────────────
KOPS Co.,Ltd Technical R&D Center / Researcher
───────────────────────────────



