안드로이드를 클라이언트로 해서 서버랑 통신하는 프로그램을 구현하고 있습니다
1. 클라이언트에서 정보를 서버로 보내면 2. 서버에서 정보를 받아 결과값을 생성하고
3. 그 결과값을 다시 클라이언트에게 보내면 클라이언트가 그것을 받아 setText에서 결과값을 보여주는 구조입니다
1번은 그냥 쓰레드로 하고 3번은 통신쓰레드에서는 UI를 못 건드린다고 하여 AsyncTask를 사용해 구현을 했는데요
3번이 안되네요 ㅠㅠ 에러는 안나는데 결과값을 받아오질 못하는 것 같습니다
AsyncTask 부분 코드 첨부합니다 조언 부탁드려요 ㅠㅠ
class OTPreceiver extends AsyncTask<Void, Void, Void>{
Socket socket;
static DataInputStream in;
static String answer;
InetAddress serverAddr;
static String ID;
static int n;
static byte[] temp;
static String OTPc;
static String[] str = new String[3]; //str[0]=Seed, str[1]=n, str[2]=OTP
static String time;
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
serverAddr = InetAddress.getByName(MainActivity.serverIP);
socket = new Socket(serverAddr, 9999);
in = new DataInputStream(socket.getInputStream());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(in!=null) {
try {
answer = in.readUTF(); //서버 결과값 받아와서 저장
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
protected void onPostExecute(){ //UI셋팅부분
super.onPostExecute(null);
if(answer.startsWith("A")){ //서버에서 전송한 것의 앞부분이 A면 클라이언트 창에 보이게 셋팅
MainActivity.result.setText(answer.substring(1));
MainActivity.OTPcState.setText(" ");
MainActivity.OTPsState.setText(" ");
}
else if(answer.startsWith("?")){ //TOTP
str = answer.split(":");
str[0] = str[0].substring(1); //앞에 붙혔던 ?빼고 저장
GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmm"); //분단위까지, 1분마다 OTP가 바뀌게 설정
Date d = gc.getTime();
time = sf.format(d); //time = 시간정보
try {
MessageDigest sh = MessageDigest.getInstance("SHA-256");
temp = MainActivity.Tpw.getText().toString().concat(str[0]).concat(time).getBytes();
//입력한 pass + 서버로부터 받은 seed + time(시간정보) 를 temp에 넣는다
n = Integer.parseInt(str[1]);
for(int i=0; i<n; i++){
sh.update(temp);
temp = sh.digest();
}
StringBuffer sd = new StringBuffer();
for(int j=0; j<temp.length; j++){
sd.append(Integer.toString((temp[j]&0xff) + 0x100,16).substring(1));
}
OTPc = sd.toString();
if(OTPc.equals(str[2])){
MainActivity.result.setText("인증이 완료되었습니다."); //토스트
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
else{
MainActivity.result.setText("인증에 실패하였습니다."); //토스트
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
}catch(Exception e) {
System.err.println(e);
}
}
else { //not TOTP
str = answer.split(":");
try {
MessageDigest sh = MessageDigest.getInstance("SHA-256");
temp = MainActivity.Tpw.getText().toString().concat(str[0]).getBytes();
//입력한 pass + 서버로부터 받은 seed 를 temp에 넣는다
n = Integer.parseInt(str[1]);
for(int i=0; i<n; i++){
sh.update(temp);
temp = sh.digest();
}
StringBuffer sd = new StringBuffer();
for(int j=0; j<temp.length; j++){
sd.append(Integer.toString((temp[j]&0xff) + 0x100,16).substring(1));
}
OTPc = sd.toString();
if(OTPc.equals(str[2])){
MainActivity.result.setText("인증이 완료되었습니다.");
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
else{
MainActivity.result.setText("인증에 실패하였습니다.");
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
}catch(Exception e) {
System.err.println(e);
}
}
}
}