서버와 클라이언트가 통신하는 자바 예제!!

안녕하세요 이번 시간에는

채팅 프로그램의 시발점인 기초 예제를 하나 올려봅니다.

서버와 클라이언트가 간단하게 통신하는 프로그램으로

내일도 이와 관련된 예제를 올리겠습니다.


저도 오늘 기초만 배우는 거라 쉽지가 않네요

소스 파일은 두개로

서버와 클라이언트 두개의 파일로 있습니다.


먼저 서버 파일 부터 올립니다

TCPServer.java ===============================================

/* 서버단
 * - ServerSocket과 Socket이 필요
 * - 클라이언트가 접속해오면 "행운의 숫자" 를 보내보자
 * */

public class TCPServer {

public static void main(String[] args) throws IOException {

//1. 서버 소켓을 생성한다 => 열어놓을 포트번호 필요(특정한 포트 외에는 아무렇게 지정 가능)
ServerSocket server = new ServerSocket(5555);

//2. 서버소켓이 클라이언트의 연결을 기다림
System.out.println("클라이언트 연결을 기다림..");
while(true){
Socket sock=server.accept();
/* 클라이언트가 접속해오기를 기다리고 있다가 클라이언트가 접속해오면
* 클라이언트와 연결된 소켓 객체를 반환한다.
* */
System.out.println("클라이언트가 접속했어요!!");
InetAddress inet=sock.getInetAddress();
System.out.println("클라이언트의 IP: "+inet.getHostAddress());

int num = new Random().nextInt(100)+0; // 0부터 99까지 랜덤하게 발생

//서버가 클라이언트에게 숫자 데이터를 보낸다.
//출력스트림 활용
OutputStream os = sock.getOutputStream();

//자바의 다양한 데이터(자료형)를 보내는 DataOutputStream 활용
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(num);
dos.flush();

//클라이언트가 보내는 메시지를 듣고 콘솔에 출력하자
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println("From Client>>>"+dis.readUTF());

//원래는 null 체크하고 종료하면 좋음
dos.close(); dis.close();
os.close(); is.close();
if(sock!=null) sock.close();
}

========================================================


그 다음은 클라이언트 파일입니다.


TCPClient.java===============================================

/* 서버단
 * - ServerSocket과 Socket이 필요
 * - 클라이언트가 접속해오면 "행운의 숫자" 를 보내보자
 *
 * */

public class TCPClient {

public static void main(String[] args) throws IOException{

Socket sock=new Socket("자신의 ip 주소",5555);
//클라이언트 소켓에서는 서버의 IP주소와 port번호가 필요하다. (집에서 할 때는 cmd->ipconfig->ipv4 주소로 변경하자)
//서버와 연결되면 Socket이 생성되고, 연결이 안되면 예외가 발생됨

System.out.println("서버와 연결됨");

//서버가 보낸 데이터를 듣기 위해 스트림 연결
InputStream is=sock.getInputStream();
DataInputStream dis=new DataInputStream(is);
int num=dis.readInt();
JOptionPane.showMessageDialog(null, "서버가 보내온 행운의 숫자:"+num);

// 서버에게 클라이언트가 메시지를 보내자
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.println("메시지를 입력하세요=>");
String str=sc.nextLine();
// 출력 스트림 얻기 => sock 통해서
OutputStream os = sock.getOutputStream();
//필터링
DataOutputStream dos=new DataOutputStream(os);
dos.writeUTF(str);
dos.flush();

dos.close();
dis.close();
is.close();
os.close();
sock.close();
}
}

========================================================


자 이번 예제는 먼저 서버부터 실행하고 바로 클라이언트를 실행해야 합니다

이번 예제는 특별히 자바 콘솔창이 아닌 도스창에서 실행하십쇼~!

 

먼저 서버를 실행하고 클라이언트를 실행하게 되면

클라이언트 창에서 서버가 보내온 행운의 숫자가 출력됩니다.



그 다음 클라이언트에서 서버에게 '안녕 서버야' 라는 메시지를 전송하게 되면..




서버에서는 안녕 서버야 라는 메시지가 출력이 되고

프로그램이 종료됩니다.

일단 서버와 클라이언트가 1대1 통신하는 간단한 예제를 끝으로 오늘 자바 네트워크 포스팅은 끝마치고 다른 포스팅을 올리겠습니다.

내일 다른 네트워크 예제로 뵙겠습니다~!


댓글 3개:

  1. cmd 에서 java net.day1.~에서 net.day1이 뭔가요? 파일 이름인가요?

    답글삭제
  2. 잘봤습니다.
    그런데 이 코드는 일 대 다 통신이 가능한 코드인가요? 아니면 P2P만 가능한 형채인가요?

    답글삭제