본문 바로가기

(Before)BitSchool

2014/05/26 javanetwork - 직렬화, UDP

반응형

객체 직렬화

- 객체를 일렬로 늘어선 바이트의 흐름으로 만드는 기술


서버와 클라이언트는 약속이 되어 있어야한다. 받는 버퍼의 크기라든지, 타입이 동일해야한다.


Serialization Server

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
29
30
31
32
33
34
35
36
37
import java.io.Serializable;
 
 
public class UserData implements Serializable {
    private String Uid;
    private String Upw;
    private int Uno;
    
    public UserData(String id,String pw, int no) {
        this.Uid = id;
        this.Upw = pw;
        this.Uno = no;
        
    }
    
    
    public String getUid() {
        return Uid;
    }
    public void setUid(String uid) {
        Uid = uid;
    }
    public String getUpw() {
        return Upw;
    }
    public void setUpw(String upw) {
        Upw = upw;
    }
    public int getUno() {
        return Uno;
    }
    public void setUno(int uno) {
        Uno = uno;
    }
    
}
 


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.*;
import java.net.*;
 
 
public class Base {
    public static void P(String str){
        System.out.print(str);
    }
    
    public static void main(String[] args) {
        Socket ClientSocket;
        // Object입출력을 위한 스트림 클래스
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        
        try {
            //접속을 기다릴 서버 리슨 소켓
            ServerSocket serversocket = new ServerSocket(10001);
            P("______클라라를 기다려요______");
            ClientSocket = serversocket.accept();
            System.out.println();
            // 클라이언트 소켓을 통해 오브젝트 in, out 스트림 얻기
            oos = new ObjectOutputStream(ClientSocket.getOutputStream());
            ois = new ObjectInputStream(ClientSocket.getInputStream());
            
            Object obj = null;
            
            try {
                //클라이언트가 전송한 객체를 읽어오기
                while((obj=ois.readObject()) != null){  // 어떤타입이 될지몰라 object로 읽는다.
                    UserData user = (UserData)obj;
                    P(user.getUid());
                    P(user.getUpw());
                    P(user.getUno()+" ");
                    System.out.println();
                    
                    
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
 


Serial_Client

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.*;
import java.net.*;
 
 
public class Base {
    public static void P(String str){
        System.out.println(str);
    }
    
    public static void main(String[] args) {
        Socket socket;
        ObjectOutputStream oos;
        ObjectInputStream ois;
        
        //접속
        try {
            socket = new Socket("127.0.0.1",10001);
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            
            UserData udata = null;
            
            while(true){
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                P("ID : ");
                String id = br.readLine();
                P("PW : ");
                String pw = br.readLine();
                P("No : ");
                String No = br.readLine();
                
                int no = Integer.parseInt(No);
                
                udata = new UserData(id,pw,no);
                
                oos.writeObject(udata);
                oos.flush();
            }
            
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
 

상자에 포장해서 알맞게 보내는 것과 같은 이치라고 생각하면 쉽다.



패킷 - 서버와 클라이언트가 주고 받는 정보


UDP

빠른속도로 전송만 하고자 할때 사용

패킷에 감싸서 사용한다.


UDPServer

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.io.IOException;
import java.net.*;
 
 
public class UdpServer {
    private int port;
    private DatagramSocket socket;  // UDP소켓
    private DatagramPacket recvpacket;  // UDP 통신 패킷
    private DatagramPacket sendpacket;
    
    public UdpServer(int port){
        this.port = port;
        this.socket = null;
        this.recvpacket = null;
    }
    
    public void Run(){
        
        
        
        try {
            // 1) 데이타그램 소켓을 생성
            socket = new DatagramSocket(this.port);
            
            while(true){
                // 2) 데이타그램 패킷을 생성
                //클라이언트로 부터 전달된 패킷을 받기위한 준비
                byte[] buffer = new byte[1024];
                recvpacket = new DatagramPacket(buffer, buffer.length);
                
                //클라이언트에게 메시지가 올때까지 기다린다.
                this.socket.receive(this.recvpacket);
                
                //receive가 리턴 되었다는 이야기는...
                //메시지가 전송이 되었다는 이야기이고.. getdata로 데이타를 얻어온다.
                String msg = new String(this.recvpacket.getData());
                
                System.out.println("받은 메시지 : "+msg);
                //echo server의 형태라면 받은 데이타를 반대로 그대로 되돌려준다.
                this.sendpacket = new DatagramPacket(
                        this.recvpacket.getData(),  
                        this.recvpacket.getData().length,
                        this.recvpacket.getAddress(),
                        this.recvpacket.getPort());
                
                //send 메서드를 통해 전송
                this.socket.send((this.sendpacket));
            }
            
            
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
 


1
2
3
4
5
6
7
8
9
10
11
 
public class Base {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        UdpServer udp = new UdpServer(10001);
        udp.Run();
    }
 
}
 



UDPClient

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.io.*;
import java.net.*;
 
 
public class UdpClient {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //클라이언트에서 필요한 것들!
        //Socket, datapacket 2개 , 
        
        try {
            // 1)소켓 생성(기본생성자 이용)
            DatagramSocket socket = new DatagramSocket();
            
            // 2)메시지입력
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            InetAddress addr = InetAddress.getByName("127.0.0.1");
            String msg = null;
            
            while((msg = br.readLine())!=null){
                
                
                //send packet 생성
                DatagramPacket sendpacket = new DatagramPacket(
                        msg.getBytes() //보낼 메시지 , 바이트배열로 변환
                        , msg.length()// 메시지 길이
                        , addr //ip
                        , 10001 // port
                        );
                
                //Server에 packet전송
                socket.send(sendpacket);
                
                byte[] buffer = new byte[msg.getBytes().length];
                
                DatagramPacket Recvpacket = new DatagramPacket(buffer, buffer.length);
                
                socket.receive(Recvpacket);
                
                String echomsg = new String(Recvpacket.getData());
                
                System.out.println("["+Recvpacket.getAddress().getHostAddress()+"] "+echomsg);
                
            }
            
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
 
}
 


채팅프로그램에 UDP를 추가하여 긴급메세지, 단체쪽지를 추가하라.


반응형