ServerSocket, Socket



ServerSocket은 java에서 서버 프로그램을 개발할 때 쓰이는 클래스이다. 해당 클래스를 이용해서 서버를 개발 하는 방법에 대해 알아보겠다. Socket 클래스는 client에서 서버로 접속하거나 Server에서 accept 하는데 필요한 클래스다. 이 설명을 이해 하려면 TCP/IP 접속 송수신 과정이해가 선행 되어야 한다.


 

소켓 송수신 과정 설명



ServerSocket, Socket 클래스를 이용한 서버-클라이언트 프로그램을 이해하려면 다음과 같이 TCP/IP 송수신 과정을 이해 해야한다.


 서버

 방향

 클라이언트

 클라이언트의 요청을 받기 위한 준비를 한다.(ServerSocket)

 

 

 클라이언트의 요청을 받아 들인다. (accept)

 <-

 서버에 접속 요청을 한다. (Socket)

 클라이언트가 보낸 데이터를 출력 한다. (BufferedReader)

 <-

 서버에 메시지를 보낸다. ( BufferedWriter )

 클라이언트에 메시지를 보낸다. ( BufferedWriter )

 ->

 서버가 보낸 메시지를 출력한다. ( BufferedReader )

 종료 한다. ( socket.close() )

 

 종료 한다. ( socket.close() )



[서버]

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;


public class Server {

    public static void main(String[] args ) {

        try {

            //서버 생성

            ServerSocket serverSocket = new ServerSocket(9000);

            //client 접속 accept

            Socket socket = serverSocket.accept();

            

            //client가 보낸 데이터 출력

            BufferedReader bufReader =

              new BufferedReader( new InputStreamReader( socket.getInputStream()));

            String message = bufReader.readLine();

            System.out.println("Message : " + message );

            

            //client에 데이터 전송

            BufferedWriter bufWriter = 

              new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));

            bufWriter.write("hello world");

            bufWriter.newLine();

            bufWriter.flush();

            

            socket.close();

            serverSocket.close();

            bufReader.close();

            bufWriter.close();

            

          }

          catch( Exception e ){

            e.printStackTrace();

          }

            

     }

}

  


9000번 port로 설정해 서버를 생성

 ServerSocket serverSocket = new ServerSocket(9000);


클라이언트 요청을 받아 들인다.

 Socket socket = serverSocket.accept();


[클라이언트]

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;


public class Client {

    public static void main(String[] args ) {

        try {

            //서버 접속

            Socket socket = new Socket("127.0.0.1", 9000);

            

            //Server에 보낼 데이터 

            BufferedWriter bufWriter = 

              new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));

            bufWriter.write("hello world");

            bufWriter.newLine();

            bufWriter.flush();

            

            //Server가 보낸 데이터 출력

            BufferedReader bufReader =

              new BufferedReader( new InputStreamReader( socket.getInputStream()));

            String message = bufReader.readLine();

            System.out.println("Message : " + message );

            

            socket.close();

            bufReader.close();

            bufWriter.close();

          }

          catch( Exception e ){

            e.printStackTrace();

          }

            

          }

}



127.0.0.1 (localhost) 9000번 서버에 접속

 Socket socket = new Socket("127.0.0.1", 9000);



소켓에서 데이터를 읽을 때 

( 예제 기준으로 서버인 경우 클라이언트의 요청을 받는다. 반대로 클라이언트는 서버의 응답을 받는다. )

BufferedReader bufReader =

              new BufferedReader( new InputStreamReader( socket.getInputStream())));


소켓에서 데이터를 쓸 때 

( 예제 기준으로 서버인 경우 클라이언트에 응답을 한다. 반대로 클라이언트는 서버의 요청을 한다. )

 BufferedWriter bufWriter = 

              new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())));




반응형

'프로그램 > Java' 카테고리의 다른 글

[java] sleep 사용법  (0) 2018.05.23
[java] printf 와 지시자  (0) 2018.05.22
[java] 다중 반복문 탈출 방법  (0) 2018.05.21
[java] do~while문 사용법  (0) 2017.12.15
[java] while문 사용법  (0) 2017.12.11

다중 반복문 탈출



프로그램 작성 하는 중 2중 혹은 그 이상 다중으로 반복문( while, for 등 )을 사용하는 경우가 있다. 여러 반복문을 탈출 하기 위해서는 각 반복문 마다 break를 해야만 빠져나올 수 있어 번거롭고 코드 보기도 복잡하다. Java에서 다중 반복문을 탈출 하는 방법을 알아보자.

 

구구단 예문으로 2중 for문 탈출 예제



아래와 같이 구구단을 출력하는 프로그램이 있다.


public class calcMath{

public static void main(String[] args){

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

                for( int j = 2; j < 10; j++){

                   System.out.println( i + "X" + j + "=" + (i*j));                   

                }

             }

}

}


여기서 2번째 for 문에서 한 번에 빠져 나가는 방법을 알아보자.


public class calcMath{

public static void main(String[] args){

             forout : 

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

                for( int j = 2; j < 10; j++){

                   if( i == 3 )

                      break forout;

                   System.out.println( i + "X" + j + "=" + (i*j));                   

                }

             }

}

}



위와 같이 반복문이 실행 되기 전에 반복문 이름을 forout 이라고 짓는다. 

그리고 2 번 째 for문에서 break 반복문 명인 forout을 지정해주면 해당 반복문을 빠져 나올 수 있다.

 반복문 명 지정 :

  for( ... ){

     for( ... ) {

         break 반복문 명;

     }

  }



반응형

'프로그램 > Java' 카테고리의 다른 글

[java] printf 와 지시자  (0) 2018.05.22
[java] ServerSocket, Socket  (0) 2018.05.21
[java] do~while문 사용법  (0) 2017.12.15
[java] while문 사용법  (0) 2017.12.11
[java] switch문 사용법  (0) 2017.12.10

FILE 구조체를 이용해 파일을 읽어보자


FILE 구조체를 이용해 파일 생성 읽기, 쓰기가 가능하다.

파일을 생성, 읽기, 닫기 3가지를 배워보겠다.


파일을 일단 읽어보자


[예제]

#include <stdio.h>


int main(int argc, char *argv[]) 

{

char file_buffer[30] = {0,};

FILE * file = fopen("Test.txt", "rt");

fgets(file_buffer,sizeof(file_buffer), file);

printf("data[%s]",file_buffer);

fclose(file);

return 0;

}



 data[test test]

 계속하려면 아무 키나 누르십시오...



프로그램 실행 파일이  있는 곳에 Test.txt 파일이 있어야 실행이 된다.

Test.txt파일을 메모장으로 열어 test test라는 문구를 입력하자.

다른 내용을 넣어도 되지만 file_buffer 사이즈가 넘지 않도록 한다.

넘으면 파일 내용이 전부 출력 되지 않는다.


fopen 사용법은 아래와 같다.

#include<stdio.h>

FILE * fopen( const char * filename, const char * mode )


첫번째 인자(filename)는 경로를 포함한 생성할 파일 명이 넣는다. 

경로가 없으면 프로그램이 실행 된 곳에 파일이 생성 된다.

두번째 인자(mode)는 파일 생성 타입을 설정 한다.

읽기(r), 쓰기(w), 추가(a), t(텍스트모드), b(2진모드)


fgets 사용법은 아래와 같다.

#include<stdio.h>

int fgets(char * s, int size, FILE * stream)


파일에서 데이터를 읽는 함수이다.

첫 번째 인자는 파일 내용을 저장할 버퍼를 넣는다.

두 번째 인자는 읽어 들일 사이지를 지정 한다. 보통 버퍼 사이즈를 입력한다.

세 번째 인자는 읽어들일  FILE 구조체를 넣는다.


fclose 사용법은 아래와 같다.

#include<stdio.h>

int fclose(FILE * stream)


파일을 종결할 때 사용하는 함수이다.

더이상 파일 접근을 할 필요가 없으면 반드시 종결 시켜준다.




반응형

FILE 구조체를 이용해 파일을 써보자.


FILE 구조체를 이용해 파일 생성 읽기, 쓰기가 가능하다.

파일을 생성, 쓰기, 닫기 3가지를 배워보겠다.


파일을 일단 써보자


[예제]

#include <stdio.h>


int main(int argc, char *argv[]) 

{

FILE * file = fopen("Test.txt", "wt");

fputs("test text", file);

fclose(file);

return 0;

}



 계속하려면 아무 키나 누르십시오...



프로그램 실행 파일이  있는 곳에 Test.txt 파일이 생성 되어 있을 것이다.

Test.txt파일을 메모장으로 열면 test text라는 문구가 찍힌걸 확인 할 수 있다.


fopen 사용법은 아래와 같다.

#include<stdio.h>

FILE * fopen( const char * filename, const char * mode )


첫번째 인자(filename)는 경로를 포함한 생성할 파일 명이 넣는다. 

경로가 없으면 프로그램이 실행 된 곳에 파일이 생성 된다.

두번째 인자(mode)는 파일 생성 타입을 설정 한다.

읽기(r), 쓰기(w), 추가(a), t(텍스트모드), b(2진모드)


fputs 사용법은 아래와 같다.

#include<stdio.h>

int fputs(const char * s, FILE * stream)


파일에 데이터를 입력하는 함수이다.

첫 번째 인자는 입력할 내용을 적는다.

두 번째 인자는 입력한 내용을 담을 파일을 설정 해준다.


fclose 사용법은 아래와 같다.

#include<stdio.h>

int fclose(FILE * stream)


파일을 종결할 때 사용하는 함수이다.

더이상 파일 접근을 할 필요가 없으면 반드시 종결 시켜준다.





반응형

+ Recent posts