java day14
네트워크
관련 용어 정리
네트워크(Network) : 컴퓨터들이 통신 기술을 이용하여 그물망처럼 연결된 통신 이용형태
인터넷(Internet) : 컴퓨터로 연결하여 TCP/IP 프로토콜을 이용하여 정보를 주고 받는 네트워크
IP(internet protocol) : 인터넷의 연결되어있는 모든 장치를 식별할 수 있도록 장비에게 부여되는 고유주소
포트(Port) : 컴퓨터나 통신장비에서 다른 장치에 물리적으로 접속되는 특정한 통로
소켓(socket) : 두 호스트 사이 연결, 어떠한 방식으로 통신을 할지 정해주는 것
버퍼(buffer) : 입출력을 수행하는데 있어 속도차이를 극복하기 위해 사용하는 임시 저장 공간. 프로그래밍이나 웅영체제에서 CPU와 보조기억장치 사이에서 사용되는 임시 저장 공간을 뜻함.
소켓통신 방법
client 접속 server
서버 ip, port -----> 서버 소켓
- client(소켓)이 ip 주소와 port 번호를 통해 server (소켓) 에 접근
- server(소켓)은 client 가 접속을 했는지 체크하는 용도로만 사용
- server(소켓) 을 통해 client 소켓을 생성
서버 소켓 생성
ServerSocket 참조변수 = new ServerSocket(포트번호);
클라이언트 소켓 생성
Socket 참조변수 = new Socket("아이피주소", 포트번호)
위 와 같은 방법으로 두 PC 간 통신이 가능하며 예제를 통해 더 자세히 알아보자.
// server
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
public static void main(String[] args) {
int port = 9999;
try{
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("클라이언트를 기다리고 있습니다.");
while(true){
// 새로운 클라이언트가 접속시 클라이언트 소켓을 생성
Socket socket = serverSocket.accept();
System.out.println("클라이언트가 접속했습니다.");
System.out.println("Client ip : " + socket.getInetAddress());
}
}catch (IOException e){
e.printStackTrace();
}
}
}
// client
import java.io.IOException;
import java.net.Socket;
public class Client1 {
public static void main(String[] args) {
try{
Socket socket = new Socket("127.0.0.1", 9999);
// 서버 포트번호와 일치하면 연결
System.out.println("서버와 접속이 되었습니다.");
}catch (IOException e){
e.printStackTrace();
}
}
}
실행결과
// server
클라이언트를 기다리고 있습니다.
클라이언트가 접속했습니다.
Client ip : /127.0.0.1
실행결과
// client
서버와 접속이 되었습니다.
서버를 먼저 실행하고 클라이언트 실행해야됨.
메세지 보내기
클라이언트에서 서버로 메세지 보내는 방법을 알아보자.
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server2 {
public static void main(String[] args) {
try{
ServerSocket serverSocket= new ServerSocket(9999);
System.out.println("서버 소켓 생성됨");
Socket socket = serverSocket.accept();
System.out.println("클라이언트가 접속 했습니다.");
System.out.println("Client ip : " + socket.getInetAddress());
// client로 부터 전송받은 데이터을 저장
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String data = br.readLine(); // client로 전송받은 데이터를 읽어 data에 저장
if(data.equals("Q") || data.equals("q")){ // 전송받은 데이터 중 Q,q 가 있을 시 프로그램 종료
System.out.println("프로그램 종료");
break;
}
System.out.println("Client 메시지 : " + data); // 클라이언트가 보낸 데이터 출력
}
br.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.Socket;
public class Client2 {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1" , 9999);
// 서버로 보내는 역할
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
// 키보드로 읽어들임
BufferedReader key = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.print("메시지 입력 : ");
String data = key.readLine(); // 키보드로 입력 받은 값을 읽어 data에 저장
if(data.equals("Q")|| data.equals("q")){
System.out.println("채팅 종료");
break;
}
pw.println(data); // 서버로 data 값 보내기
pw.flush(); // 항상 Writer 는 flush()로 버퍼 내 데이터 비우기
}
pw.close();
socket.close();
key.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
실행결과 // server
서버 소켓 생성됨
클라이언트가 접속 했습니다.
Client ip : /127.0.0.1
Client 메시지 : 안녕하세요
Client 메시지 : 반갑습니다.
실행결과 // client
메시지 입력 : 안녕하세요
메시지 입력 : 반갑습니다.
메시지 입력 : q
채팅 종료