1. 네트워크 쓰레드 / TCP 소켓 프로그래밍 / socket / serversocket / 소켓프로그래밍절차 / 소켓 객체 생성

Welcome to Seoyun Dev Log·2021년 12월 12일
0

java_chapter06

목록 보기
1/1

목차
1. TCP 소켓 프로그래밍
2. IP주소
3. TCP 소켓 프로그래밍 절차

  • 소켓 객체 생성 (stream 활용)

1. TCP 소켓 프로그래밍
:1:1 소통 프로그램인 echo프로그램을 만들었다.(개인간 p2p, 사용자의 컴퓨터를 이용하는것)
이후 다자간 형태의 프로그램 제작 예정

*다자간 : 중간에서 데이터를 받아서 뿌려주는 형태
서버 혹은 클라이언트에서 데이터를 보내면 다이렉트로 상대방에게 전달되는것이 아닌,
통신망(소켓)에 연결되어 서버 -> 소켓 -> 클라이언트 형태로 받아서 뿌려주는 형태이다.

특징:

  • 스트림(Stream) 통신 프로토콜
  • 양쪽의 소켓이 연결된 상태에서 통신 가능(연결지향 프로토콜)
  • 신뢰성 있는 데이터 통신
  • 한 번 연결이 되면 연결이 끊어 질때까지 송신한 데이터는 '차례대로'(선입선출) 목적지의 소켓에 전달
  • TCP 관련 클래스를 자바에서 제공(serversocket, socket)
  • 서버/클라이언트 두개의 클래스 정의(★각각의 프로그램으로 생각해야한다.)
  • 인터넷은 전부 소켓프로그램을 사용하고있다.
  • 메인 프로그램이 두개이다.

2. IP주소

IP주소

  • 모든 컴퓨터가 다 가지고 있다.
    클라이언트가 찾아올 수 있도록 주소를 만들어 주는 것과 같다.
  • IP주소는 정해져있다. 무한정 줄 수 없음
  • 가상아이피 (내부에서 아이피를 쪼개서 사용하는 것)

IP주소 확인

  • cmd창에서 ipconfig 검색

3. TCP 소켓 프로그래밍 절차

형태 01전체 : main프로그램이 두개인것

1. 서버 클래스 생성(서버 프로그램)
2. 클라이언트 클래스 생성(클라이언트 프로그램)

★각각의 프로그램으로 생각해야한다. 

특징 :

  • IP주소와 PORT번호를 알아야한다.

형태 02서버 :

package echo.ex01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) throws IOException {
		// 한국
		// 1. 예외처리 해줘야함 ! (통신이 안될 수 있는 상황)
		ServerSocket serverSocket = new ServerSocket();

		// 2. IP 192.168.219.100 Port 10001
		serverSocket.bind(new InetSocketAddress("192.168.219.100", 10001));

		// -----------접속 확인-------------------
		System.out.println("서버시작");
		System.out.println("연결을 기다리고 있습니다");
		// ------------------------------------
		// 5. 대기하고 있다가 누가 오면 실행(연결)
		Socket socket = serverSocket.accept();

		System.out.println("클라이언트가 연결되었습니다");
		
		//6. 메세지 '받을' 준비 (빨대 꼽기)
		InputStream is = socket.getInputStream();//socket으로 연결해서 소통하는 것 생각
		InputStreamReader isr = new InputStreamReader(is, "UTF-8");
		BufferedReader br = new BufferedReader(isr);
		
		//7. 메세지 받기 
		String msg = br.readLine(); // 한줄 받아오기 
		System.out.println("받은 메세지:"+msg);
		
		//8. 메세지 '보낼' 준비 (순서상관없음 위에 써도됨)
		OutputStream os = socket.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
		BufferedWriter bw = new BufferedWriter(osw);
		
		//9. 메세지 보내기
		bw.write(msg);
		bw.newLine();
		bw.flush();
		
		// 1. 닫기
		socket.close();
		serverSocket.close();

	}
}

형태 03클라이언트 :

package echo.ex01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {

	public static void main(String[] args) throws IOException {
		// 미국
		// 3.
		Socket socket = new Socket();

		System.out.println("클라이언트 시작");

		// 4. 서버 IP , 프로그램에서 세팅한 Port 10001
		System.out.println("클라이언트 연결요청");
		socket.connect(new InetSocketAddress("192.168.219.100", 10001));
		
		//메세지 보낼 준비 (빨대 꼽기)
		OutputStream os = socket.getOutputStream(); //주스트림
		OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");//보조스트림
		BufferedWriter bw = new BufferedWriter(osw);
		
		//5. 메세지 보내기
		String str = "안녕하세요";
		bw.write(str);
		bw.newLine();
		bw.flush(); //-> buffered 쟁반이 꽉 차야 움직이는 것인데 보내는 데이터가 적으면 null 나옴 
		//가득 채운것으로 치겠다 
		
		//10. 메세지 받을 준비 (순서 상관없음 위에 써도됨)
		InputStream is = socket.getInputStream();
		InputStreamReader isr = new InputStreamReader(is, "UTF-8");
		BufferedReader br = new BufferedReader(isr);
		
		//11. 메시지 받기
		String reMsg = br.readLine(); //한줄씩 받기 
		System.out.println("server:"+reMsg);
		
		// 3. 닫기
		bw.close();
		socket.close();
		
	}

}

TCP 순서
예외처리 (통신이 안될 수 있는 상황)
--서버 클래스--
1. ServerSocket 메모리에 생성 및 정의 + 닫기
2. Bind -> IP주소 , PORT 번호 세팅

  • 서버 소켓의 메소드 사용
  • 포트 번호는 개발자가 정하는것이며, 정해진 번호대가 있다.
  • IP주소는 문자열로 받고(콤마가 있어서), port번호는 숫자로 입력한다.
  1. 접속 확인 메시지 출력되도록하여 중간 확인하는것이 좋음

--클라이언트 클래스--
4. Socket 메모리에 생성 및 정의 + 닫기
클라이언트 시작 문구 작성하여 중간 확인하는 것이 좋음
5. Connect -> 서버 IP, PORT 연결

  • 연결할 IP주소와 PORT번호 작성

--서버 클래스--
6. accept(); -> socket연결

  • 대기하고 있다가 누가 오면 실행(연결)
  • accept : 왔네?? 오케이
  • 내부적으로 소켓을 만들어줌, 새로 생성할 필요 없음
  • 클라이언트가 연결되었다고 출력되도록 연결확인하는 것이 좋다.
  1. Stream 준비 (읽거나 보낼 것 상황에 따라 다를 수 있다.)
  • 예제에서는 클라이언트에서 보내고 서버에서 받아서 다시 받은것을 서버에서 클라이언트로 보낸다.
  • 메시지 받을 준비 : 받고 보내는것 전부 socket으로 연결, InputStreamReade,BufferedReader는 기존 stream 방식과 동일.
InputStream is = socket.getInputStream();//socket으로 연결해서 소통하는 것 생각
  1. 메시지 받기
  2. 메시지 보낼 준비 : 받고 보내는것 전부 socket으로 연결,
OutputStream os = socket.getOutputStream();
  1. 메시지 보내기
bw.write(msg);
bw.newLine(); --> 줄바꿈
bw.flush();  --> 데이터 채우기

★bw.flush();
buffered의 경우 쟁반의 역할이다. 쟁반이 전체가 채워져야 움직이는 것
따라서 데이터가 적을 경우 오류가 날 수 있다.
이런것을 방지해주는 메소드로 나머지 데이터를 채워진것으로 만들어 주는 코드이다

  1. 메시지 받을 준비 (stream)
    여기에서 stream의 순서는 상관없이 위에 나열해도 된다.
    프로그램이 다른 프로그램이기 때문에

특징 :

  • ★서버를 켜줘야 클라이언트가 접속할 수 있다.
    서버를 꼭 켜주고 켜져있는지 확인
  • 서버와 클라이언트가 접속되면 프로그램은 종료된다.(p2p인 경우)
  • socket으로 연결해서 소통하기 때문에 socket으로 주고받음
  • 이전에 배운 스트림은 파일을 읽고 쓸것이라
    FileInputStream
    FileOutputStream
    사용했음 (파일로 시야를 정해준것임)
  • 파일개념을 생각하지 말것 파일로 "보내면" 파일이되는것
    화면에 보내면 이미지가 되는것 등 '내보낸다는 의미'

오류 파악 :

  • 보낸 메시지가 null이 나오는 경우
    (close닫는것 잘 확인해보기 : 순서를 바꾸니 다시 작동했음)
    혹은 bw.flush();
  • 서버가 꺼져있는 경우
profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글