안드로이드 개발 질문/답변
(글 수 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
───────────────────────────────