티스토리 뷰

개발/Java

자바 tcp/ip 소켓통신

Beemo_ 2021. 2. 6. 14:33

소켓 : 두 프로그램이 네트워크를 통해 서로 통신할 수 있도록 양쪽에 생성되는 링크의 단자

소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있음 

 

 

서버 클라이언트
socket() socket()
bind()  
listen()  
  connect()
accept()  

 

 

서버, 클라이언트는 각각 socket을 생성하고 서버는 bind에서 포트번호를 할당한다

그 후에 listen()을 호출하여 클라이언트의 접속을 기다린다.

 

클라이언트는 connect()를 통해 서버에 접속을 시도한다.

클라이언트 요청이 오면 accept() 함수를 호출에 연결한다.

 

소켓이 연결되면 recv() / send() 함수를 통해 데이터를 전달하고

마지막에 close()를 호출하여 소켓을 종료한다.

 

C프로그래밍에서는 socket() -> bind() -> listen() 함수를 코드에서 직접 호출해줘야 된다.

자바에서는 socket.accept() 메서드만 호출하면 Socket클래스 내부에서 socket() -> bind() -> listen()을 호출해준다.

 

간단한 소켓통신 예제

서버 Class

public class SocketServer {

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(11111);

            Socket socket = serverSocket.accept();
            //socket -> bind -> listen socket 클래스 내부에 구현되어있음

            System.out.println("connect");
            OutputStream outputStream = socket.getOutputStream();
            for (int i = 0; i < 10; i++) {
                String sendString = "hello";
                outputStream.write(sendString.getBytes());
            }
            outputStream.write("exit".getBytes());
            serverSocket.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

클라이언트 Class

public class SocketClient {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost",11111);
            InputStream inputStream = socket.getInputStream();
            while (true) {
                byte[] bytes = new byte[100];
                inputStream.read(bytes);
                String receive = new String(bytes);
                System.out.println(receive);
                if(receive.equals("exit")) {
                    break;
                }

            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


소켓통신으로 간단한 채팅만
들기

서버 Class

public class SocketServer2 {

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(11111);

            while(true) {
                Socket socket = serverSocket.accept();

                ReceiveClass receiveClass = new ReceiveClass();
                receiveClass.setSocket(socket);
                SendClass sendClass = new SendClass();
                sendClass.setSocket(socket);

                receiveClass.start();
                sendClass.start();
            }



        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

서버 ReceiveThread

public class ReceiveClass extends Thread {

    private Socket socket;
    @Override
    public void run() {
        super.run();

        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String receiveString;

            while(true) {
                receiveString = bufferedReader.readLine();
                if (receiveString == null) {
                    System.out.println("disconnect");
                    socket.close();
                    break;
                } else {
                    System.out.println("상대방 : " + receiveString);
                }
            }
            SocketServer2.main(null);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}

 

서버 SendThread

public class SendClass extends Thread {

    private Socket socket;
    @Override
    public void run() {
        super.run();

        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
            String sendString;
            while (true) {
                sendString = bufferedReader.readLine();
                printWriter.println(sendString);
                printWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}

 

클라이언트 Class

public class SocketClient {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost",11111);
            ReceiveClientClass receiveClientClass = new ReceiveClientClass();
            receiveClientClass.setSocket(socket);
            SendClientClass sendClientClass = new SendClientClass();
            sendClientClass.setSocket(socket);

            sendClientClass.start();
            receiveClientClass.start();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

클라이언트 ReceiveThread

public class ReceiveClientClass extends Thread {

    private Socket socket;
    @Override
    public void run() {
        super.run();

        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String receiveString;

            while(true) {
                receiveString = bufferedReader.readLine();
                System.out.println("상대방 : " + receiveString);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}

 

클라이언드 SendThread

public class SendClientClass extends Thread {

    private Socket socket;
    @Override
    public void run() {
        super.run();

        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
            String sendString;
            while (true) {
                sendString = bufferedReader.readLine();
                if(sendString.equals("exit")) {
                    break;
                }
                printWriter.println(sendString);
                printWriter.flush();
            }
            bufferedReader.close();
            printWriter.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}

'개발 > Java' 카테고리의 다른 글

Effective Java 3/E - 싱글턴을 만드는 방법  (0) 2021.01.16
Effective Java 3/E - 정적 팩터리 메서드  (0) 2021.01.14
자바 스트림 -2  (0) 2021.01.01
자바 스트림 -1  (0) 2020.12.26
자바 람다식  (0) 2020.12.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함