반응형
swing을 사용하여 gui기반의 java echo server를 만들었습니다.
아래는 통신모습.(테스트 클라이언트는 docklight로~)
아래 소스는 actionlistener인데 버튼 리스너랑 비슷한 겁니다.
안드로이드에선 id명으로 switch문을 썼는데 여기선 if문으로~(상수가 아니라서)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btnServerOpen){ String getPort=portNum.getText(); if(!getPort.isEmpty()){ int port=Integer.parseInt(getPort); portOpen(port); }else{ commText.setText("Not found PORT number"); } }else if(e.getSource()==btnServerClose){ portClose(); }else if(e.getSource()==btnClear){ commText.setText(""); } } | cs |
일단 보시면 버튼 3개를 사용합니다..
server open, server close and text clear 이렇게~
일단 서버 포트를 오픈하는 소스~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void portOpen(int port) { disconnected=false; try { ss=new ServerSocket(port); server=new Thread(new tcpServer(ss)); server.start(); commText.setText("Waiting for connection."); } catch (IOException e) { System.out.println(e); e.printStackTrace(); } } | cs |
서버소켓 객체선언하고 스레드로 서버소켓을 넘깁니다.
이건 포트를 닫는부분~
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void portClose() { try { disconnected=true; ss.close(); server.interrupt(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } commText.setText("server is closed"); } | cs |
line 6은 스레드 멈추는거고요~ line4는 좀 더 효율적으로 만들어주기위한 변수.
line 7은 서버소켓을 닫는부분
그리고 스레드 부분
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | while(!serverSWT.disconnected){ try{ client=server.accept(); ip=client.getRemoteSocketAddress(); serverSWT.commText.setText(serverSWT.commText.getText()+"\n"+ip+" is connected"); is=client.getInputStream(); os=client.getOutputStream(); byte[] buffer=new byte[100]; int length; while(((length=is.read(buffer))!=-1)&&(!serverSWT.disconnected)){ System.out.println(length); String rcv=new String(buffer,0,length); System.out.println(rcv); String rcvBuf=serverSWT.commText.getText()+"\n"; serverSWT.commText.setText(rcvBuf+"client: "+rcv); os.write(buffer, 0,length); serverSWT.commText.setText(serverSWT.commText.getText()+"\nserver: "+rcv); } client.close(); }catch(Exception e){ System.out.println(e); } } | cs |
Line 3 은 클라이언트가 접속되길 기다리는 부분이고요~
접속되면 line 4 에서 ip가져옵니다.
Line 1과 Line 12에 보면 위에서 봤던 boolean 변수가 있는데 이걸 쓴 이유는 thread interrupt
로 thread를 멈췄는데도 중간에 블럭되어서 클라이언트가 보내는 패킷을 받는 어처구니없는 상황을 방지하는 겁니다.
밑에는 변수를 안썼을 때인데. 보시는 바와같이 server가 닫혔는데도 클라이언트가 보내는 패킷이 들어옵니다.
반응형
'Study > JAVA' 카테고리의 다른 글
JAVA SWING JCheckBox (0) | 2015.02.12 |
---|---|
JAVA SWING JButton (0) | 2015.02.12 |
eclipse에서 swing design tab 안보일때~ (1) | 2015.02.12 |
JAVA EXE(실행파일)로 만들기(jsmooth) (0) | 2015.02.12 |
eclipse에 JAVA swing plug-in 하기 (0) | 2015.02.12 |