본문 바로가기
Study/JAVA

JAVA SWING echo server

by Answer Choi 2015. 2. 12.
반응형



server(TCP/IP)

 

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

인기글