목차
1. TCP 소켓 프로그래밍
2. IP주소
3. TCP 소켓 프로그래밍 절차
1. TCP 소켓 프로그래밍
:1:1 소통 프로그램인 echo프로그램을 만들었다.(개인간 p2p, 사용자의 컴퓨터를 이용하는것)
이후 다자간 형태의 프로그램 제작 예정
*다자간 : 중간에서 데이터를 받아서 뿌려주는 형태
서버 혹은 클라이언트에서 데이터를 보내면 다이렉트로 상대방에게 전달되는것이 아닌,
통신망(소켓)에 연결되어 서버 -> 소켓 -> 클라이언트 형태로 받아서 뿌려주는 형태이다.
특징:
2. IP주소
IP주소
IP주소 확인
3. TCP 소켓 프로그래밍 절차
형태 01전체 : main프로그램이 두개인것
1. 서버 클래스 생성(서버 프로그램)
2. 클라이언트 클래스 생성(클라이언트 프로그램)
★각각의 프로그램으로 생각해야한다.
특징 :
형태 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 번호 세팅
--클라이언트 클래스--
4. Socket 메모리에 생성 및 정의 + 닫기
클라이언트 시작 문구 작성하여 중간 확인하는 것이 좋음
5. Connect -> 서버 IP, PORT 연결
--서버 클래스--
6. accept(); -> socket연결
InputStream is = socket.getInputStream();//socket으로 연결해서 소통하는 것 생각
OutputStream os = socket.getOutputStream();
bw.write(msg);
bw.newLine(); --> 줄바꿈
bw.flush(); --> 데이터 채우기
★bw.flush();
buffered의 경우 쟁반의 역할이다. 쟁반이 전체가 채워져야 움직이는 것
따라서 데이터가 적을 경우 오류가 날 수 있다.
이런것을 방지해주는 메소드로 나머지 데이터를 채워진것으로 만들어 주는 코드이다
특징 :
오류 파악 :