Java Networking : TCP로 서버와 클라이언트 간, 메시지 주고받기

Java Programming|2018. 11. 16. 16:56
반응형

 학원에서배운 서버와 클라이언트 구축하여 메시지 주고받는 소스입니다.


아래는 서버 소스입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;


public class ServerTest {


public static void main(String[] args) {

// TODO Auto-generated method stub

//통신을 하려면 일단 IP주소는 알아야함.

//자바에서 IP주소에 관련된 정보를 가지고 있는 클래스 : InetAddress

//본인의 IP주소를 확인할 수 있는 방법

try {

System.out.println( InetAddress.getLocalHost().getHostAddress() );

System.out.println( InetAddress.getLocalHost().getHostName() );

System.out.println( InetAddress.getLoopbackAddress().toString() );

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//통신을 구현하려면 2가지 용어를 알아야함.

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

//2. port번호 - 그 컴퓨터 안에서의 프로그램 분류번호(65천개) 0~65535 : 0~1024까지는 사용하지 마세요.

//ex) 부산항(IP주소), 3번항구(port번호)

//서버 프로그램으로서의 작업

//1. 서버소켓을 만들어 놓는 작업!

try {

ServerSocket serverSocket= new ServerSocket(10001);

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

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

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

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

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

//3. 데이터를 주고받을 Stream만들기!!

//데이터를 입력받은 스트림 만들기 : 해임달(Socket)에게 무지개로드(InputStream)을 열어주세요!!

//연결된 client소켓과 다리 연결!!

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

InputStreamReader isr= new InputStreamReader(is);//문자 스트림

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

//클라이언트와 연결된 다리(Stream)을 통해 데이터를 읽어오기

String msg= reader.readLine();//클라이언트가 데이터를 보내면 한줄씩 일기...여기서 클라이언트가 데이터를 보낼때까지 대기....

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

reader.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} //0~65535

}

}




아래는 클라이언트 소스입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

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) {

// TODO Auto-generated method stub

//클라이언트는 서버의 IP주소, port번호를 알아야 접속할 수 있음.

String serverIP= " 접속할 서버 주소 ";

//serverIP= "127.0.0.1";//OK

//serverIP="localhost";//OK

//클라이언트의 작업

try {

//1. 서버와 연결하는 Socket생성(ip주소, 포트번호)

Socket socket= new Socket(serverIP, 10001);

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

//2. 데이터를 주고받을 Stream만들기!!

//데이터를 내보내는  Stream : 해임달(Socket)객체에게 무지개로드(Stream)을 열어달라고!!

OutputStream os= socket.getOutputStream();//바이트 스트림

//보조스트림을 이용하면 write()작업이 보다 수워함.

//OutputStreamWriter osw= new OutputStreamWriter(os);//문자스트림

PrintWriter writer= new PrintWriter(os); //보조 문자스트림

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

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

Scanner scanner= new Scanner(System.in);

System.out.print("보낼 메세지 입력 : ");

String msg= scanner.nextLine();

//스트림을 통해서 데이터 전송!

writer.println(msg);

writer.flush();

writer.close();

System.out.println("메세지 전송이 완료 되었습니다.");

} catch (UnknownHostException e) {

System.out.println("서버의 위치를 찾을 수 없음.");

} catch (IOException e) {

System.out.println("서버와 통신이 불가합니다.");

}

}

}


결과 테스트



서버와 연결하고 메시지를 보냅니다.


받은 메시지가 뜹니다.

반응형