728x90
반응형
2. TCP/IP 네트워킹
소켓(socket)
- 두 호스트 사이 연결
- 어떠한 방식으로 통신을 할지도 정해주는 것
- 원격 장비에 연결, 데이터 전송(보내기, 받기), 포트 지정, 수신 대기(서버와 클라이언트 관계(c/s), p2p)
ServerSocket 클래스
- 클라이언트의 연결 요청을 기다리면서 연결 수락을 담당하는 클래스
(대기하다가, 일반소켓을 만들고 일반 소켓끼리 통신할 수 있도록 만들어 연결을 해주는 역할)
-> 서버부터 실행을 해야한다.(대기상태에서)
Socket 클래스
- 연결된 클라이언트와 통신을 담당하는 클래스(사용자가 접속할 수 있는)
문제. 에코서버를 만들어보자.
데이터
클라이언트 -----> 서버
<-----
데이터
문제. 구구단서버를 만들어보자.
클라이언트
단을 입력하세요 5 ----------> 5
<----------
5단을 리턴
예제1
import java.io.IOException;
import java.net.Socket;
public class Client1 {
public static void main(String[] args) {
System.out.println("클라이언트가 실행되었습니다.");
Socket socket = null;
try{
System.out.println("서버와 연결을 시도중입니다");
socket = new Socket("192.168.6.13",3579);//접속이 잘되면 소켓생성
System.out.println("연결되었습니다");
}catch (IOException e){
e.printStackTrace();
}finally {
if(socket != null) try{socket.close();} catch (IOException e){}
}
System.out.println("프로그램이 종료되었습니다");
}
}
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Network1 {
public static void main(String[] args) {
try {
// InetAddress inetAddress = InetAddress.getByName("www.naver.com");
// 도메인 내임을 겟 네임에 주면 아이피 어드레스를 얻을 수 있다/}
// System.out.println(inetAddress.getHostName());
// 도메인을 츨력한다. www.naver.com
// System.out.println(inetAddress.getHostAddress());
// IP주소 223.130.200.107
InetAddress[] inetAddress = InetAddress.getAllByName("www.naver.com");
// 배열로 모든 도메인 네임에 있는 아이피 어드레스를 가저온다
for(InetAddress iAdd : inetAddress){
System.out.println(iAdd.getHostAddress());
// 공개 IP 전부 찍힘 223.130.195.200
//223.130.195.95
}
} catch (UnknownHostException e) {//강제
e.printStackTrace();
}
}
}
예제2
import java.net.MalformedURLException;
import java.net.URL;
public class Network2 {
public static void main(String[] args) {
try {
URL url = new URL("https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=c4i&oquery=" +
"%EB%82%B4+ip&tqi=h09aCsprvxZssLrqXLwssssssB8-375298");
System.out.println(url.getProtocol());// 프로토콜을 출력 https:와 같은것
System.out.println(url.getHost()); // 호스트(도메인)
System.out.println(url.getPort()); // 기본값 -1(80)
System.out.println(url.getPath()); // https 같은것(도메인) 뒤에 나오는 리소스
System.out.println(url.getQuery()); // 값 (응답) - 내가 보내는(검색) 값을 전달해준다.
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server2 {
public static void main(String[] args) {
System.out.println("서버가 실행되었습니다.");
ServerSocket serverSocket = null;
Socket socket = null;
BufferedWriter bw = null;
try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
System.out.println("서버가 준비되었습니다.");
socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
System.out.println("클라이언트가 접속되었습니다.");
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
bw.write("Server Message!!");
bw.flush();//벌퍼를 비우면서 내보냄
}catch (IOException e){
e.printStackTrace();
}finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
if(bw != null) try{bw.close();}catch (IOException e){}
if(socket != null) try{socket.close();}catch (IOException e){}
if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
}
System.out.println("프로그램이 종료되었습니다.");
}
}
예제3
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Network3 {
public static void main(String[] args) {
try {
URL url = new URL("https://www.koreaisacademy.com/");
URLConnection conn = url.openConnection();
System.out.println(conn);
//sun.net.www.protocol.https.DelegateHttpsURLConnection:https://www.koreaisacademy.com/
// 데이터를 보여줌
System.out.println(conn.getContent());
//sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@be35cd9
System.out.println(conn.getDate());// 1666142580000 -> timestamp를 알 수 있다. 접속시간 확인
System.out.println(conn.getURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server3 {
public static void main(String[] args) {
System.out.println("서버가 실행되었습니다.");
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader br = null;
BufferedWriter bw = null;
try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
System.out.println("서버가 준비되었습니다.");
socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
System.out.println("클라이언트가 접속되었습니다.");
br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
String msg = br.readLine();
System.out.println("클라이언트 메시지 : " + msg);
bw.write(msg+"\n"); // 한 번 읽고 다음줄을 읽기위해
bw.flush();//벌퍼를 비우면서 내보냄
System.out.println("전송디었습니다.");
bw.write("Server Message!!");
bw.flush();//벌퍼를 비우면서 내보냄
}catch (IOException e){
e.printStackTrace();
}finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
if(br != null) try{br.close();}catch (IOException e){}
if(bw != null) try{bw.close();}catch (IOException e){}
if(socket != null) try{socket.close();}catch (IOException e){}
if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
}
System.out.println("프로그램이 종료되었습니다.");
}
}
예제4
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
// buffer 이를 통해 크롤링은 가능하지만 자바로 하는것은 추천하지는 않는다. 파이썬으로 하는게 편하다 크롤링의 경우
public class Network4 {
public static void main(String[] args) {
BufferedReader br =null;
try {
URL url = new URL("https://www.koreaisacademy.com/");
// InputStream isr = new InputStreamReader(url.openStream());
// br = new BufferedReader(isr); 이렇게 해도 괜찮지만 밑에 방식이 더 편하다.
br = new BufferedReader(new InputStreamReader(url.openStream()));
// 버퍼리더 임시저장
//url.openStream() url을 열어 데이터를 가저온다. 스트림을 통해 가저와야하고 인풋스트림이 있어야한다.
String data = null;
while((data = br.readLine()) != null ){//읽을게 있으면
System.out.println(data);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally {// 무조건 들림 파이널리는
{
if(br != null){ // 버퍼가 존재한다면 없에라
try {
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server4 {
public static void main(String[] args) {
System.out.println("서버가 실행되었습니다.");
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader br = null;
BufferedWriter bw = null;
try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
System.out.println("서버가 준비되었습니다.");
socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
System.out.println("클라이언트가 접속되었습니다.");
br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
String dan = br.readLine();
int intdan = Integer.parseInt(dan);
for(int i=1; i<=9; i++){
bw.write(intdan + "*"+i+"="+(intdan *i)+"\n");
}
bw.flush();
System.out.println("전송되었습니다.");
}catch (IOException e){
e.printStackTrace();
}finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
if(br != null) try{br.close();}catch (IOException e){}
if(bw != null) try{bw.close();}catch (IOException e){}
if(socket != null) try{socket.close();}catch (IOException e){}
if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
}
System.out.println("프로그램이 종료되었습니다.");
}
}
반응형
'Java > Java' 카테고리의 다른 글
Java 음성 소켓 통신(서버, 클라이언트) 기초 (0) | 2023.04.21 |
---|---|
JAVA 채팅 프로그램 (0) | 2022.10.20 |
JAVA 네트워크 (0) | 2022.10.20 |
자바 제네릭(Generic) (0) | 2022.10.12 |
자바 스레드 (0) | 2022.10.07 |