본문 바로가기
  • developer
  • challenge
이론수업

자바 Network TCP방식

by 빵승 2024. 1. 17.

통신을 하려면 2가지 용어를 알아야한다.

1.IP주소 - 그 컴퓨터의 고유한 주소(숫자) : 42억개

2.port번호 - 그 컴퓨터안에서 프로그램 분류번호 (6만5천개) : 0~1023까지는 사용하지 않는 것을 권장

                                                                                              비유) -부산항 (ip주소), 3번항구 (port번호)

                                         통신규약 (Protocol)

                                            TCP -전화방식

                             TCP방식 Sever-Client-Socket통신

  1.서버용 프로그램을 작성 (ServerTest)

두개의 class를 만들어서  네트워크를 연결해보는 예시를 해볼겁니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTest {

public static void main(String[] args) {

 

 

try { //1. 서버소켓을 만들어내는 작업

ServerSocket serverSocket=new ServerSocket(10001); //port번호

System.out.println("서버소켓이 생성되었습니다.");

 

//2.클라이언트의 접속을 기다리기...

System.out.println("클라이언트의 접속을 기다립니다.");

Socket socket=serverSocket.accept(); //여기서 커서가 대기함

System.out.println(socket.getInetAddress().getHostAddress()+"클라이언트가 접속하셨습니다.");

 

//3.클라이언트가 보낸 데이터를 읽어올 무지개 로드 준비

InputStream is=socket.getInputStream(); //바이트 스트림

InputStreamReader isr=new InputStreamReader(is); //바이트스트림-->문자스트림

BufferedReader reader=new BufferedReader(isr); //문자스트림-->보조문자스트림

 

// String msg=reader.readLine();

// System.out.println("받은 메세지 : "+msg);

 

//반복적으로 메세지를 수신하려면..

while(true) {

String msg=reader.readLine();

if(msg==null) break; //상대방과의 스트림연결이 종료되면 null이 읽어짐

 

System.out.println("받은 데이터 : "+msg);

}

 

reader.close();

System.out.println("서버 통신 종료!!");

 

} catch (IOException e) {

System.out.println("통신작업중 오류 발생 : "+e.getMessage());

System.out.println(e.getMessage());

}

 

 

}

 

}

 

 

 

2.고객용 접속 프로그램을 작성 (ClientTest)

 

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ClientTest {

public static void main(String[] args) {

 

 

try { //1.서버와 연결하는 Socket 객체 생성(ip주소, port번호)

Socket socket=new Socket(serverIP,10001);

System.out.println("서버와 연결이 되었습니다.");

 

//2.데이터를 보내기위한 무지개로드 만들기

//Network를 넘어가는 스트림은 해임달(socket) 객체가 필용함

OutputStream os= socket.getOutputStream();

//바이트스트림으로 문자열을 보내는 작업은 짜증나니..문자스트림으로 변환 더 나아가 보조문자스트림으로 변환하면 더 쉽게 코딩이 가능함

PrintWriter writer= new PrintWriter(os);

System.out.println("스트림 연결하는 작업성공!!..데이터 전송 가능 상태");

 

//보낼 데이터를 키보드로 입력받기

Scanner scanner=new Scanner(System.in);

//System.out.print("보낼 데이터 : ");

//String message=scanner.nextLine();

 

while(true) {

System.out.println("보낼데이터 : ");

String message= scanner.nextLine();

 

if(message.equals("quit"))break;

 

writer.println(message);

writer.flush();

}

 

//3.스트림을 통해 데이터를 전송

//writer.println(message);

//writer.flush();

 

writer.close();

System.out.println("메세지 전송을 완료했습니다.");

 

} catch (UnknownHostException e) {

System.out.println("서버주소를 찾을수 없습니다.");

} catch (IOException e) {

System.out.println("통신중 에러가 발생했습니다.");

}

 

 

}

 

}

 

서버용 프로그램 (ServerTest) 결과값 접속 되기를 기다리고 

서버소켓이 생성되었습니다.

클라이언트의 접속을 기다립니다.

 

고객용 접속 프로그램 (ClientTest) 에서 서버 연결을 하면 보낼데이터를 작성할수 있습니다.

서버와 연결이 되었습니다.

스트림 연결하는 작업성공!!..데이터 전송 가능 상태

보낼데이터 :

Hello

보낼데이터 :

good

보낼데이터 :