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

안드로이드(클라이언트)-C(서버) 소켓 통신 readbye 질문입니다.

0 추천

현재  C(리눅스 서버)-안드로이드(클라이언트) 통신을 하고 있습니다. 서버가 C를 써야 하는 상황이기에 readbyte로 한 글자씩 읽어야 합니다만 어째서인가 신호를 주고 한 박자씩 늦게 신호를 받게 되네요. 안드로이드간, 서버간 통신은 실시간으로 되었는데...

예를 들어 원래대로라면

클라이언트 1 전송->서버 27 전송

클라이언트 2 전송->서버 28전송

이어야 하는데 현재는

클라이언트 1 전송 -> 서버 공백 전송

클라이언트 2 전송 ->서버 27 전송

이런식으으 됩니다. 실시간으로 서버의 메세지를 확인해야 하기에 tread를 사용해야 하고, thread에서 직접 액티비티를 다루면 자꾸 오류가 나서 못하겠네요... 제발 도와주세요.ㅠㅡ

String input_buffer=""; //현제 읽고있는 글자 표시

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TCP_Client tc; 
tc  =   new TCP_Client();
tc.execute();

findViewById(R.id.butt_j).setOnClickListener(
new Button.OnClickListener(){   
public void onClick(View v){
ImageView img= (ImageView)findViewById(R.id.butt_j);
try{
tc.WriteSocket("1"+pn); //서버로 신호를 주는 부분
if(input_buffer="27") Log.d("TCP", "HEY");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
);


class TCP_Client extends AsyncTask{
Socket sock;
MessageReciver mr;
DataOutputStreamoutput;
DataInputStream input;
@Override
protected Object doInBackground(Object... params) {
try {
Log.d("TCP","server connecting");
InetAddress serverAddr = InetAddress.getByName("xxx.xxx.xxxx");
sock = new Socket(serverAddr,0000);
input = new DataInputStream(sock.getInputStream());
output  =   new DataOutputStream(sock.getOutputStream());
Log.d("TCP","server connect end");
 mr = new MessageReciver();
 mr.start();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
return null;
}

public void WriteSocket(String tex) throws IOException{
byte[] buf=tex.getBytes();
output.writeBytes(tex+"\n");
output.flush();

}

//바이트 받는 부분
public class MessageReciver extends Thread {
public void run() {
byte received;
byte[] datafile = null;
input_buffer="";
 byte [] login = new byte[1];
  try {
while (true) {
while((received=input.readByte())>0){
login[0]=received;
String p = new String(login, "UTF-8");
input_buffer = input_buffer+p;
}
Log.d("TCP","therad"+input_buffer);

}
} catch (IOException e) {
e.printStackTrace();
}
 Message message = handler.obtainMessage(1, input_buffer);
 handler.sendMessage(message);
}
}
 Handler handler = new Handler() {
public void handleMessage(Message message) {
   super.handleMessage(message);
}
 };

 

리얼리스트 (150 포인트) 님이 2014년 12월 8일 질문

1개의 답변

0 추천
 
채택된 답변
전 일단 AsyncTask 안에서 또 왜 Thread를 돌리시는지 모르겠네요.

AsyncTask가 스레드인데 말이죠..?

 

AsyncTask만 돌리시고 AsyncTask에서 액티비티를 건드리고 싶다면

onProgressUpdate를 이용하세요.
익명사용자 님이 2014년 12월 8일 답변
리얼리스트님이 2014년 12월 8일 채택됨
그렇군요... AsyncTask의 개념을 제대로 이해 못해서 햇갈렸네요...
그러면 doInBackground에서 While을 쓰면 되겠군요.

이렇게 되면 Write용은 별도로 만들어야 하나요? Asynctask를 이용한 소켓 통신 자료가 적어서 했갈리네요;ㅅ;
...