현재 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);
}
};