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("로그","텍스트 수정");         //★★★★★★★로그켓
      
     
      }     
      
      
      
      
      
     
    });
      }
     }
    }
}

profile

 

 

────────────────────── Android.Park

KOPS Co.,Ltd Technical R&D Center / Researcher
───────────────────────────────