Daily coding
Java Basic : day 16 - 서버 / 클라이언트 연결하기 본문
Server 클래스
package day16.Lecture01_tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client_mainClass {
// Client 코드
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
1. 접속을 해야할 Server Ip(주소)를 설정 - Socket
2. Socket 생성
3. 접속 connect
4. 통신
*/
// InetSocketAddress 클래스
// 접속하고자하는 서버(서버소켓)의 IP주소와 포트 넘버를 설정하여 반환하는 객체
InetSocketAddress sockAddr = new InetSocketAddress("192.168.2.31", 9000 );
// (IP주소, 포트넘버)
Socket socket = new Socket(); // 단 한개인 클라이언트 소켓 (껍데기인 상태)
// Server 접속
// 예외처리 필수
try {
// connect 메소드에 연결
// 소켓 껍데기에 서버소켓과의 연결정보를 설정하고 연결을 요청한다.
socket.connect(sockAddr, 10000 );
// (문지기 소켓 객체, 만분의1초(현재는 10초임))
// InetAddress : 자바에서 IP 주소를 표현할때 사용하는 클래스
InetAddress inetAddr;
if((inetAddr = socket.getInetAddress())!= null) {
System.out.println("서버연결 성공 : " + inetAddr);
}else {
System.out.println("서버 연결 실패");
}
// 전송할 데이터 만들기
Scanner sc = new Scanner(System.in);
while(true) {
// 보낼 문자열 입력하기 (while로 계속 대화하도록 만듦)
System.out.print(">> ");
String str = sc.next();
// TCP는 stream, UDP는 Datagram 타입을 지정
// 클라이언트는 먼저 데이터를 보내고, 서버로부터 받기 때문에
// send부터 작성한다.
// 1. send
PrintWriter writer = new PrintWriter(socket.getOutputStream());
// getOutputStream --> 내보낼 데이터
writer.println(str); // 실질적으로 전송이 되는 문자열
writer.flush(); // 끝맺음
// 2. receive : 받기
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
str = reader.readLine();
System.out.println("서버로부터 받은 메세지 : " + str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Client 클래스
package day16.Lecture01_tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server_mainClass {
public static void main(String[] args) throws IOException {
// 서버
// 문지기소켓 : 서버 소켓
// 포트넘버 9000을 지키고 있는 문지기소켓 serSocket
ServerSocket serSocket = new ServerSocket(9000);
// 서버 포트 : 9000
// 자동으로 현재 PC의 자신의 IP를 설정한다, binding, listen이 포함되어있다
// 통신순서 1~3이 끝남
System.out.println("접속대기중...");
// Client Socket, 담당자 소켓 , 접속하는 클라이언트의 정보를 받아서 가지고 있음
// 담당자 소켓 당 하나의 클라이언트의 정보(IP주소와 데이터 등)을 가지고 있다.
// 클라이언트가 들어날 수록 담당자 소켓은 늘어나게 됨
Socket clientSocket = null;
clientSocket = serSocket.accept(); // serSocket에는 IP/port number를 내포하고 있음
// 클라이언트와 연결이 되면 밑으로 넘어간다.
// 확인 작업
// getInetAddress() : 클라이언트의 아이피주소 가져오기
// getPort() : 클라이언트의 포트 넘버 가져오기
System.out.println("client IP : " + clientSocket.getInetAddress()
+ " Port: " + clientSocket.getPort());
// 실행 중에 끄지 않고 다시 누르면 binding exception발생
// (이미 포트번호 9000번지에는 서버소켓이 사용중이고 실행을 끄지 않고 다시 접속하면 이미 접속중이기 때문에 바인딩에러 발생)
while(true) { // while문을 사용하면 클라이언트와 계속 대화 할 수 있음
// 1. receive
// 담당자소켓이 데이터를 받는다
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// getInputStream --> 클라이언트로부터 받아온 데이터(문자열)
String str = reader.readLine();
System.out.println("서버로부터 받은 메세지 : " + str);
// 2. send
Scanner sc = new Scanner(System.in);
System.out.print(">> ");
str = sc.next();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
// getOutputStream --> 내보낼 데이터
writer.println(str); // 실질적으로 전송이 되는 문자열
writer.flush(); // 끝맺음, 반드시 해줘야함
}
// 소켓 해방
// clientSocket.close();
// serSocket.close();
// 위의 코드는
// 다른 클라이언트와 같이 대화를 할 수 없음
}
}
'Language > Java_basic' 카테고리의 다른 글
Thread 사용한 소켓 프로그래밍 예제 - server (0) | 2019.12.11 |
---|---|
Java Basic : day 17 - Thread의 개념과 예제 (0) | 2019.12.11 |
Java Basic : day 16 - 네트워크 TCP / UDP (0) | 2019.12.09 |
Java Basic : day 15 - AWT & SWING : Example - 선수 데이터 관리 프로그램 만들기 (0) | 2019.12.08 |
Java Basic : day 14 - AWT & SWING : Example 3 : 숫자맞추기 게임 (0) | 2019.12.08 |