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

자바 비동기 소켓통신 클라이언트 부분인데요.. 에러가 납니다..;

0 추천
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Locale;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.widgets.Menu;



public class TEST {

 protected Shell shell;
 private Text txtDiecasprogram;
 private Text txtStatusfine;
 private int connect_flag =0;

 /**
  * Launch the application.
  * @param args
  */


 public static void main(String[] args) 
 {  


  try {
   TEST window = new TEST();
   window.open();


  } catch (Exception e) {
   e.printStackTrace();
  }

 }

 /**
  * Open the window.
  */
 public void open() 
 {
  Display display = Display.getDefault();
  createContents();
  shell.open();
  shell.layout();
  while (!shell.isDisposed())
  {
   if (!display.readAndDispatch())
   {
    display.sleep();
   }
  }
 }

 /**
  * Create contents of the window.
  */
 private void createContents() {
  shell = new Shell();
  shell.setSize(450, 300);
  shell.setText("DIECAS");

  final Button btnNewButton = new Button(shell, SWT.NONE);

  btnNewButton.setBounds(163, 89, 104, 41);
  btnNewButton.setText("클라이언트 접속.");

  txtDiecasprogram = new Text(shell, SWT.BORDER | SWT.CENTER);
  txtDiecasprogram.setText("DIECAS_PROGRAM");
  txtDiecasprogram.setBounds(104, 42, 226, 21);

  txtStatusfine = new Text(shell, SWT.BORDER);
  txtStatusfine.setText("STATUS:FINE");
  txtStatusfine.setBounds(104, 171, 226, 81);

  btnNewButton.addSelectionListener(new SelectionAdapter() 
  {

   @Override

   public void widgetSelected(SelectionEvent e)
   { 


    if(connect_flag==0)
    {
     btnNewButton.setText("접속완료");

     try
     {
      Socket socket = new Socket("192.168.0.37", 1470);

      // 입력 스트림
      // 서버에서 보낸 데이터를 받음
      while(true)
      {
       BufferedReader in = new BufferedReader(new InputStreamReader(
         socket.getInputStream()));

       // 출력 스트림
       // 서버에 데이터를 송신
       OutputStream out = socket.getOutputStream();

       String line = in.readLine();
       System.out.println("서버로 부터의 응답 : "+line);


       //현재시간 계산
       long time = System.currentTimeMillis(); 
       SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
       String real_time = dayTime.format(new Date(time));
       System.out.println(real_time);

       //파일 쓰기

       BufferedWriter out1 = new BufferedWriter(new FileWriter("C:/APM_Setup/htdocs/index.html")); //파싱데이터 가져오는부분
       BufferedWriter out2 = new BufferedWriter(new FileWriter("C:/APM_Setup/htdocs/database-sensor.txt",true)); //데이터베이스용 자료 



       out1.write(line); 
       out1.newLine();

       out2.write(line);
       out2.write(" - ");
       out2.write(real_time);
       out2.newLine();


       out1.close();
       out2.close();

      }
     }
     catch(IOException e1)
     { 
      System.out.println("입출력오류");
     }        
    }
    else if(connect_flag==1)
    {
     connect_flag--;
     btnNewButton.setText("클라이언트 접속종료.");

    }

   }
  });

 }

}


자바 클라이언트 소스를 만들어서 GUI에 붙여서

 

버튼을 클릭해서 서버에 접속시키는 프로그램을 만들었는데요..

 

GUI프로그램을 통해 접속까지는 잘되지만.

 

그이후에 화면이 멈춰서 일련의 동작을 할 수가없습니다..

 

하지만 멈춘상태에서 서버에서 클라이언트로 메시지를 보내주면 그 값을 잘 받아옵니다..;

 

화면이 무슨 이유때문인지 멈춰있는거같은데..

 

소스를 봐도 해결이안되네요;;

 

혹시 아시는분 답변부탁드립니다.!

 

제가 보기에는.. 무한루프부분인데;; 도저히 머리가 안돌아갑니다 ㅠㅠ;

 

이게 비동기로 짜여진건지.. 아니면 잘못짜서 그런지좀 확인부탁드려요..

 

 

백돈 (220 포인트) 님이 2014년 11월 14일 질문

2개의 답변

0 추천
우선 비동기 처리부분이 없어 보이네요.

 

최소한 소켓통신 부분은 Thread를 통해서 별도로 동작하도록 하셔야 비동기 처리가 될거라고 보여지구요.

 

메인함수가 있는 클래스에 콜백용 메소드를 하나 만들어 두고 스레드에서 처리한 데이터에 대한

화면 갱신처리를 해주셔야 할것 같습니다.

 

안드로이드에서도 그렇지만 UI표현을 하는 프로그램의 경우 메인 클래스가 동작하는 스레드에서

과도한 동작을 수행시키게되면 UI표현을 못하게 됩니다.

 

더구나 무한루프가 돌고있으니 UI갱신을 못하고있을겁니다.

무한루프내에서 통신을 하기 때문에 데이터 받아오는 동작은 잘 될겁니다.

 

데이터 통신기능만 동작하고있을테니까요.

 

우선 widgetSelected 내부의 기능들을 스레드로 분리를 시키시고

콜벡메소드를 통해 데이터를 전달받아 처리하도록 하세요.
이라슈 (8,770 포인트) 님이 2014년 11월 14일 답변
0 추천

버튼 클릭시 동작되는 부분이 while문을 통해 무한 루프라.. 화면을 그리지 못하는 듯 합니다. 

widgetSelected 시 동작되는 코드를   다른 쓰레드에서 동작되게 변경해주세요. 

사악미소 (65,330 포인트) 님이 2014년 11월 14일 답변
...