socket 통신으로 받는 stream을 swt에 출력.

rjswn42의 이미지

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();
		}
	}
 
 
}
shint의 이미지

말씀하신 내용을 해석해보니... 책보시면 도움이 될것 같습니다.

지나와 함께 배우는 자바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

tom5079의 이미지

마지막에

while(!shell.isDisposed) {
    if(!display.readAndDispatch()) {
        display.sleep();
    //여기에 코드를 추가
}

하면 되지 않을까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.