반응형
객체 직렬화
- 객체를 일렬로 늘어선 바이트의 흐름으로 만드는 기술
서버와 클라이언트는 약속이 되어 있어야한다. 받는 버퍼의 크기라든지, 타입이 동일해야한다.
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를 추가하여 긴급메세지, 단체쪽지를 추가하라.
반응형
'(Before)BitSchool' 카테고리의 다른 글
2014/05/28 JSP - servlet, get방식, post방식 (0) | 2014.05.28 |
---|---|
2014/05/27 JSP (0) | 2014.05.27 |
2014/05/23 java network - 쓰레드, Thread (0) | 2014.05.23 |
2014/05/22 TCP/IP, 유틸리티API (0) | 2014.05.22 |
2014/05/21 javanetwork - 네트워크의 개요 (0) | 2014.05.21 |