반응형

[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를 입력
   }
 }

 

 

 

 

반응형
Posted by 공간사랑
,