컴퓨터네트워크

[JAVA] server, client 프로그램 - 소켓통신

begong 2023. 1. 8. 17:10
반응형

소켓통신 프로그래밍

소캣 생성 및 기본 연결

Client

public class client{
    static final String IPADDRESS = "127.0.0.1";
    static final int PORTNUM = 8000;

    public static void main(String[] args) throws IOException {
        try(Socket socket = new Socket(IPADDRESS, PORTNUM)){
                System.out.println("서버연결완료");
        } 
    }                                    
}
  • ip와 port를 통하여 서버와 연결

Server

public class server{
    //8000번 포트로 서버오픈
    public static void main(String[] args) throws IOException{
        try(ServerSocket serverSocket = new ServerSocket(8000)){
            System.out.println("server open complete");
            //클라이언트 연결
            //계속 클라이언트 연결 요청을 받음.
            while(true){
                try(Socket socket = serverSocket.accept()){
                    System.out.println("client connected");
                }
            }
        }
    }
}
  • 8000번 포트로 서버오픈


메시지 주고받기

Client

        //server로 메시지 보냄
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("client message")
        printWriter.flush(); //flush를 해줘야 전송이 됨.

Server

        //client에서 메시지 받기
        InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        System.out.println(bufferedReader.readLine());
  • Client에 PrintWrite를 추가해 메시지 전송
  • Server에 받기위해서 Server에 InputStreamReader, BufferReader추가

Client

        //Server에서 메시지 받아옴
        InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        System.out.println(bufferedReader.readLine());

Server

        //Client로 메시지 전송
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("server message");
        printWriter.flush(); //flush를 해줘야 전송이 됨.
  • Client에서 메시지를 받고 읽기위해서 Client에 InputStreamReader, BufferReader추가
  • Server에 PrintWrite를 추가해 메시지 전송

  • 양방향 통신이 잘 되는 것을 볼 수 있음.

java.util.Scanner 를 사용해 간단한 채팅 프로그램 생성

        //server와  client의 메시지 전송 부분에 scanner추가하여 채팅 가능
        Scanner scanner = new Scanner(System.in); 
        String request = scanner.next();
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println(request);
        scanner.close();
        printWriter.flush();
  • Client <-> Server간 메시지를 주고 받는 모습
  • Client에 반복문을 추가하면 계속해서 서버와 통신할 수 있음.


채팅 구현까지 소스코드

Client

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class client{
    //Local host 사용
    static final String IPADDRESS = "127.0.0.1";
    static final int PORTNUM = 8000;

    public static void main(String[] args) throws IOException {
        try(Socket socket = new Socket(IPADDRESS, PORTNUM)){
            System.out.println("서버연결완료");

            //server로 메시지 보냄
            //Scanner를 통해 사용자 메시지 입력
            Scanner scanner = new Scanner(System.in);
            String request = scanner.next();
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
            printWriter.println(request);
            scanner.close();
            printWriter.flush();


            //Server에서 메시지 받아옴
            InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            System.out.println(bufferedReader.readLine());
        }
    }
}

Server

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class server{
    //8000번 포트로 서버오픈
    public static void main(String[] args) throws IOException{
        try(ServerSocket serverSocket = new ServerSocket(8000)){
            System.out.println("server open complete");
            //클라이언트 연결

            while(true){
                try(Socket socket = serverSocket.accept()){
                    System.out.println("client connected");

                    //Client에서 메시지 받아옴
                    InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    System.out.println(bufferedReader.readLine());

                    //Client로 메시지 전송
                    //Scanner를 통해 사용자 메시지 입력
                    Scanner scanner = new Scanner(System.in);
                    String request = scanner.next();
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                    printWriter.println(request);
                    scanner.close();
                    printWriter.flush();

                }
            }
        }
    }
}
반응형