프로그래밍/JAVA
[Java] 소켓 통신(socket)
하와이블루
2022. 8. 15. 14:20
728x90
들어가기 앞서 관련 용어 정리
네트워크(Network) : 컴퓨터들이 통신 기술을 이용하여 그물망처럼 연결된 통신 이용형태
인터넷(Internet) : 컴퓨터로 연결하여 TCP/IP 프로토콜을 이용하여 정보를 주고 받는 네트워크
IP(internet protocol) : 인터넷의 연결되어있는 모든 장치를 식별할 수 있도록 장비에게 부여되는 고유주소
포트(Port) : 컴퓨터나 통신장비에서 다른 장치에 물리적으로 접속되는 특정한 통로
소켓(socket) : 두 호스트 사이 연결, 어떠한 방식으로 통신을 할지 정해주는 것
버퍼(buffer) : 입출력을 수행하는데 있어 속도차이를 극복하기 위해 사용하는 임시 저장 공간. 프로그래밍이나 운영체제에서 CPU와 보조기억장치 사이에서 사용되는 임시 저장 공간을 뜻함
Socket 통신 일련의 절차
- server 측에서 port를 열고 client의 접속을 기다한다.
- client 측에서 server의 ip 주소와 port 번호를 통해 server 소켓에 접근한다.
- server 소켓은 client 가 접속을 했는지 체크하는 용도로만 사용한다.
client 접속 server
서버 ip, port -----> 서버 소켓
소켓 생성 방법
서버 소켓 생성
ServerSocket 참조변수 = new ServerSocket(포트번호);
클라이언트 소켓 생성
Socket 참조변수 = new Socket("아이피주소", 포트번호)
client가 server로 접근하는 코드를 작성해보면,
// server
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
public static void main(String[] args) {
int port = 9999;
try{
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("클라이언트를 기다리고 있습니다.");
while(true){
// 새로운 클라이언트가 접속시 클라이언트 소켓을 생성
Socket socket = serverSocket.accept();
System.out.println("클라이언트가 접속했습니다.");
System.out.println("Client ip : " + socket.getInetAddress());
}
}catch (IOException e){
e.printStackTrace();
}
}
}
먼저 server가 server소켓을 생성하여 client의 접근을 기다리게된다. while 문을 통해 client의 접근을 확인한다.
접근 확인이 되면 Socket을 생성한다.
// client
import java.io.IOException;
import java.net.Socket;
public class Client1 {
public static void main(String[] args) {
try{
Socket socket = new Socket("127.0.0.1", 9999);
// 서버 포트번호와 일치하면 연결
System.out.println("서버와 접속이 되었습니다.");
}catch (IOException e){
e.printStackTrace();
}
}
}
client는 server의 ip과 port 번호를 이용하여 연결이 확인되면 소켓을 생성한다. 그렇지 않다면 예외처리된다.
// 실행결과(server)
클라이언트를 기다리고 있습니다.
클라이언트가 접속했습니다.
Client ip : /127.0.0.1
// 실행결과(client)
서버와 접속이 되었습니다.
client - server 간 메세지 보내기
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server2 {
public static void main(String[] args) {
try{
ServerSocket serverSocket= new ServerSocket(9999);
System.out.println("서버 소켓 생성됨");
Socket socket = serverSocket.accept();
System.out.println("클라이언트가 접속 했습니다.");
System.out.println("Client ip : " + socket.getInetAddress());
// client로 부터 전송받은 데이터을 저장
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String data = br.readLine(); // client로 전송받은 데이터를 읽어 data에 저장
if(data.equals("Q") || data.equals("q")){ // 전송받은 데이터 중 Q,q 가 있을 시 프로그램 종료
System.out.println("프로그램 종료");
break;
}
System.out.println("Client 메시지 : " + data); // 클라이언트가 보낸 데이터 출력
}
br.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.Socket;
public class Client2 {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1" , 9999);
// 서버로 보내는 역할
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
// 키보드로 읽어들임
BufferedReader key = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.print("메시지 입력 : ");
String data = key.readLine(); // 키보드로 입력 받은 값을 읽어 data에 저장
if(data.equals("Q")|| data.equals("q")){
System.out.println("채팅 종료");
break;
}
pw.println(data); // 서버로 data 값 보내기
pw.flush(); // 항상 Writer 는 flush()로 버퍼 내 데이터 비우기
}
pw.close();
socket.close();
key.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
// 실행결과(server)
서버 소켓 생성됨
클라이언트가 접속 했습니다.
Client ip : /127.0.0.1
Client 메시지 : 안녕하세요
Client 메시지 : 반갑습니다.
// 실행결과(client)
메시지 입력 : 안녕하세요
메시지 입력 : 반갑습니다.
메시지 입력 : q
채팅 종료
728x90