[JAVA Network] TCP를 이용한 Server와 Client(ServerSocket class, Socket class)
programming/JAVA_JSP 2015. 4. 15. 23:21[JAVA Network] TCP를 이용한 Server와 Client(ServerSocket class, Socket class)
http://sstory100.tistory.com/entry/JAVA-Network-TCP를-이용한-Server와-ClientServerSocket-class-Socket-class
※ ServerSocket class는 Server에서 Client 접속을 기다리기 위해 필요한 클래스다.
----------------------------------------------------------
ServerSocket(int port) : Client 요청을 받을 Port 번호를 생성.
Sokcet accept() : Client 요청을 받은 후 Socket 반환
Void close() : ServerSocket닫기
----------------------------------------------------------
※ Socket class는 Server와 Client 사이에 데이터를 통신하기 위해서 필요한 클래스다.
----------------------------------------------------------
Socket(String host, int port) : 접속할 Server IP번호와 접속할 port번호
Socket(InetAddress addr, int port) : 접속할 서버의 InetAddress객체와 port번호
InputStream getInputStream() : Socket과 관련된 InputStream 반환
OutputStream getOutputStream() : Socket과 관련된 OutputStream 반환
void close() : Socket닫기
InetAddress getInetAddress() : 연결된 컴퓨터의 InetAddress반환
InetAddress getLocalAddress() : 연결된 지역 컴퓨터의 InetAddress반환
int getPort() : 연결된 컴퓨터의 port 번호 반환
int getLocalPort() : 연결된 지역 컴퓨터의 port번호 반환
----------------------------------------------------------
※ 다음은 Client가 전송해 주는 message를 다시 Client에게 되돌려 주는 기능의 Server, Client Program 입니다.
- Server class
import java.io.*;
import java.net.*;
class Server
{
ServerSocket server = null;
Socket client = null;
static final int port = 3000; //상수값으로 port 번호 설정
//입력용 Stream
InputStream is;
ObjectInputStream ois;
//출력용 Stream
OutputStream os;
ObjectOutputStream oos;
String receiveData;
Server()
{
try
{
server = new ServerSocket(port); //port 번호: 3000으로 ServerSocket 생성
System.out.println("***** Server Program이 Clinet 접속을 기다립니다. *****");
//*** Clinet 접속이 있을 때까지 대기: 접속하는 순간 Socket을 반환 ***//
client = server.accept();
//*** 접속이 되면 Clinet로부터 IP 정보를 얻어 출력 ***//
System.out.println(client.getInetAddress()+"로부터 연결요청");
//*** Clinet로 부터 수신받은 message를 읽기 위한 입력 Stream ***//
is = client.getInputStream();
ois = new ObjectInputStream(is);
//Clinet로 부터 수신받은 message를 다시 보내기 위한 출력 Stream ***//
os = client.getOutputStream();
oos = new ObjectOutputStream(os);
//*** Clinet가 보내온 message를 Server가 읽은 후 다시 Clinet에게 전송함 ***//
while ((receiveData = (String)ois.readObject()) != null) //ObjectInputStream.readObject() 호출
{
if (receiveData.equals("quit")) //"quit" 입력시 종료
{
break;
}
oos.writeObject("→ "+receiveData); //ObjectOutputStream.writeObject() 호출
oos.flush(); //버퍼의 데이터를 효율적으로 전송하기 위한 method
}
is.close();
ois.close();
os.close();
oos.close();
}
catch (Exception e)
{
System.out.println("통신 Error !!");
System.exit(0);
}
}
public static void main(String[] args)
{
new Server();
}
}
- Client class
import java.io.*;
import java.net.*;
class Client
{
Socket client = null;
String ipAddress; //접속을 요청할 Server의 IP 주소를 저장할 변수
static final int port = 3000; //접속을 요청할 Server의 port 번호와 동일하게 지정
BufferedReader read;
//입력용 Stream
InputStream is;
ObjectInputStream ois;
//출력용 Stream
OutputStream os;
ObjectOutputStream oos;
String sendData;
String receiveData;
Client(String ip)
{
ipAddress = ip; //생성자의 IP Address를 ipAddress 맴버변수에 저장
try
{
System.out.println("***** Clinet가 Server로 접속을 시작합니다 *****");
//*** 접속할 Server의 IP Address와 port 번호 정보가 있는 Socket 생성 ***//
client = new Socket(ipAddress,port);
//*** Clinet Socket이 생성되면, Server의 accept()가 수행된다 ***//
//*** 키보드로부터 message를 읽어올 입력 Stream ***//
read = new BufferedReader(new InputStreamReader(System.in));
//*** Server로 message를 송신하기 위한 출력 Stream ***//
os = client.getOutputStream();
oos = new ObjectOutputStream(os);
//*** Server로 보낸 message를 수신받기 위한 입력 Stream ***//
is = client.getInputStream();
ois = new ObjectInputStream(is);
System.out.print("입력 →");
//*** 키보드로부터 message를 입력 받아 Server로 전송한 후 다시 받아서 출력 ***//
while ((sendData = read.readLine()) != null)
{
oos.writeObject(sendData); //ObjectOutputStream.writeObject() 호출
oos.flush(); //버퍼의 데이터를 효율적으로 전송하기 위한 method
if (sendData.equals("quit")) //"quit" 입력시 종료
{
break;
}
receiveData = (String)ois.readObject(); //ObjectInputStream.readObject() 호출
System.out.println(client.getInetAddress()+"의 message ECHO: "+receiveData);
System.out.print("입력 →");
}
is.close();
ois.close();
os.close();
oos.close();
client.close(); //Socket 닫기
}
catch (Exception e)
{
System.out.println("통신 Error !!");
System.exit(0);
}
}
public static void main(String[] args)
{
new Client("localhost"); //Server Program이 실행되는 컴퓨터의 IP Address를 입력
}
}