socket 통신으로 받는 stream을 swt에 출력.
글쓴이: rjswn42 / 작성시간: 목, 2015/02/26 - 4:41오후
socket통신으로 받는 stream을 실시간으로 swt의 Text객체를 이용해서 출력하고 있습니다.
1. Text말고 출력에 특화된 객체가 따로 있는지요 같은 형식의 데이터가 한줄씩 보내집니다.
1\t10
2\t4
2\t5
2\64
이런식으로요.
2. 아래와 같은 코드로 짜여져있고, 언제 끝날지 알 수 없는 stream을 받기 때문에 새로 스레드를 생성해서 무한루프를 돌리고 interrupt는 메인UI의 스레드에서 stop을 누르면 되도록 해놨는데요.
메인 UI스레드가 있고, 이 Pipe객체의 UI스레드가 따로 있는 상태입니다.
원래 시도는 메인 스레드에서 창을 새로 띄운 뒤 그 창의 UI를 구현한 후 스레드를 하나 더 생성해서 그 스레드는 Text객체만 수정하도록 했었는데요.
swt는 여러 thread가 동시에 하나의 display를 바꾸지 못한다고해야하나 ... 그런 이유로 오류가 발생해서 구현이 안됬었고, 관련해서 syncexec, asyncexec를 찾아봤는데 이 기능 구현과 좀 맞지않는 것 같아서 이렇게 일단 구현했습니다.
text객체와 나머지 UI가 다른 thread에서 관리되는 것과 같은(원래 원했지만 실패했던) 기능을 구현할 수 있는 방법이 없을까요 ?
public class Pipe extends Thread //멀티쓰레드를 이용해서 Output 출력 { Display display; Shell shell; ServerSocket server; BufferedReader in; Socket s; int port_num; Pipe(int num) { port_num = num; } public void run() { try { display = new Display(); shell = new Shell(display); shell.setMinimumSize(new Point(640,480)); shell.setSize(450,300); InetAddress address = InetAddress.getLocalHost(); shell.setText(address.getHostAddress()+":"+(4000+port_num)); shell.setLayout(null); Text output = new Text(shell, SWT.WRAP | SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); output.setBounds(5,5, 500, 400); shell.open(); shell.layout(); display.readAndDispatch(); server = new ServerSocket(Output.port_num+port_num); s = server.accept(); System.out.println(s.getInetAddress()+":"+(Output.port_num+port_num)+ "와(과)연결되었습니다."); in = new BufferedReader(new InputStreamReader(s.getInputStream())); String inLine; while (!this.isInterrupted()) //UI의 stop버튼이 눌리기 전까지 무한히 돈다. { if (in.ready()) { inLine = in.readLine(); //System.out.println("수신: " + inLine); output.insert(inLine+"\n"); this.sleep(200); display.readAndDispatch(); //display.sleep(); } } in.close(); s.close(); server.close(); //UI.txtThisPlaceIs.insert("소켓 닫음\n"); System.out.println ("소켓 닫음"); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } //display.dispose(); //display.dispose(); } catch (IOException e) { // TODO Auto-generated catch block //UI.txtThisPlaceIs.insert("소켓통신에 문제가 있습니다.\n"); System.out.println("소켓통신에 문제가 있습니다."); e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Forums:
책보시면 도움이 될것 같습니다.
말씀하신 내용을 해석해보니... 책보시면 도움이 될것 같습니다.
지나와 함께 배우는 자바2 책보니까.
예제 소스 10장 MovePenguin2.java 는 synchronized 를 사용해서 이미지 위에 이미지를 출력하고.
예제 소스 12장 HelloServer.java 와 HelloClient.java 를 사용해서 소켓 프로그래밍을 하고 있습니다.
JBuilder 를 설치하면. 클릭만 해도 컴파일이 되니 편리합니다.
그 밖에도 다른 책이나 강의를 같이 보시는것이 좋을것 같습니다. ㅇ_ㅇ;;
밑에 글 보니. 무료 교육도 있네요...
[국비 무료 교육생 모집] 사물인터넷, 빅데이터 https://kldp.org/node/151263
예제 사이트
http://javadom.com/java/messages/8378.html
SOCKET --------------> SWT Text
1. 문자열 초기화 확인이 어떤지 모르겠습니다.
2.
Pipe Thread - loop
{
}
Main UI - interrupt Pipe STOP
Main UI - new Window UI. new Thread Text (Update)
SWT - Thread0
- Thread1
- Thread2
Multi Display Update X
syncexec, asyncexec ??
text객체와 나머지 UI가 다른 thread에서 관리되는 것과 같은(원래 원했지만 실패했던) 기능을 구현할 수 있는 방법이 없을까요 ?
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
마지막에 while(!shell.isDisposed)
마지막에
하면 되지 않을까요?
댓글 달기