CHAP 18. Android: Server/Client Programming

Client/Server Communication

4. 서버/클라이언트 통신 (p.560~): 클라우드 컴퓨팅

- 음성인식: ‘클라이언트’가 음성을 디지털 데이터로 변환하여 구글 서버로 전송

‘서버’에서 음성인식 처리 후에 스마트폰으로 결과 전송

• TCP/IP protocol

TCP

UDP

H/W

interface

IP

process

host

H/W

interface

H/W

interface

IP

gateway/router

H/W

interface

H/W

interface

IP

gateway/router

TCP

UDP

H/W

interface

IP

process

host

Internet

LAN

LAN

e.g., # ipconfig    ; IP configuration

Socket Programming

• socket: 현재 연결된 IP address와 port no.를 저장

e.g, httpd: TCP port no. (80)

e.g., # netstat -s    ; 사용가능한 프로토콜들에 대한 통계정보 확인

# netstat -a    ; 현재 생성된 소켓 연결들 확인

# netstat -an    ; Windows (http 등 확인, -an: port no.로 표시)

# netstat -o    ; 각 연결의 소유자 process ID 표시

Client PID

Server PID

<TCP/UDP Socket>

AF/PF =

IP Addr. =

Port No =

Buffer = "Message"

socket()

connect()

# netstat -a

<TCP/UDP Socket>

AF/PF =

IP Addr. =

Port No =

Buffer = "Message"

socket()

bind()

listen()

accept()

# netstat -a

TCP

UDP

TCP

UDP

IP

IP

IP Network

▪ Java Examples

- A server & a client using TCP: Server가 1에서 10까지의 정수를 Client에 보내면 Client는 이 데이터를 받아서 출력.

//------------------------------------------------

// A TCP Server: Send 10 integers to a client

// # java ServerTest server_port_no &

//------------------------------------------------

import java.io.*;

import java.net.*;

class ServerTest{

public static void main(String args[]){

try{

int END=10;

int port=Integer.parseInt(args[0]);

// InetAddress 클래스의 static method들을 사용함.

InetAddress sa=InetAddress.getLocalHost();

// Print the IP address, Host name and port no. of a server.

String saddr=sa.getHostAddress();

System.out.println("\nAddress of a server: "+saddr);

String sname=sa.getHostName();

System.out.println("Name of a server: "+sname);

// ServerSocket 객체 s1을 생성함.

ServerSocket s1=new ServerSocket(port);

int sport=s1.getLocalPort();

System.out.println("Port no of a server: "+sport);

while(true){

// Client의 요청이 발생하면 ServerSocket의 메소드를 사용하여

// 새로운 Socket 객체를 생성함.

Socket s2=s1.accept();

// 새로운 Socket 클래스의 메소드를 사용하여 InetAddress 객체를 생성함.

InetAddress ca=s2.getInetAddress();

// Print the IP address, Host name and port no. of a connected client.

String caddr=ca.getHostAddress();

System.out.println("Address of a client: "+caddr);

String cname=ca.getHostName();

System.out.println("Name of a client: "+cname);

int cport=s2.getPort();

System.out.println("Port no of a client: "+cport);

// 데이터를 출력하기 위해 Socket 객체로부터 OutputStream 객체를 생성함.

OutputStream os=s2.getOutputStream();

DataOutputStream dos=new DataOutputStream(os);

for(int i=1;i<=END;i++){

// DataOutputStream 객체의 writeInt 메소드를 사용하여 정수를 출력.

dos.writeInt(i);

System.out.println("Send to a client: "+i);

}

s2.close();

}

}

catch(Exception e){

System.out.println("Exception: "+e);

}

} // End of main.

} // End of class

//------------------------------------------------

// A TCP client: Receive & print 10 integers from a server

// # java ClientSide server_IP_addr server_port_no

//------------------------------------------------

import java.io.*;

import java.net.*;

class ClientSide{

public static void main(String args[]){

try{

String server=args[0];

int port=Integer.parseInt(args[1]);

// 지정된 IP addr.와 port no.를 사용하여 Socket 객체를 생성함.

Socket c=new Socket(server, port);

// 데이터를 입력하기 위해 Socket 객체로부터 InputStream 객체를 생성함.

InputStream is=c.getInputStream();

DataInputStream dis=new DataInputStream(is);

for(int i=1;i<=10;i++){

// DataInputStream 객체의 readInt 메소드를 사용하여 정수를 입력.

int j=dis.readInt();

System.out.println("Received from a server: "+j);

}

c.close();

}

catch(Exception e){

System.out.println("Exception: "+e);

}

} // End of main.

} // End of class