네트워크
-여러 컴퓨터를 통신 회선으로 연결한 것
서버와 클라이언트
서버 : 서비스를 제공하는 프로그램
웹서버, FTP서버, DBMS, 메신저 서버
클라이언트의 연결을 수락하고, 요청 내용을 처리한 후 응답을 보내는 역할
클라이언트 : 서비스를 받는 프로그램
웹브라우저, FTP 클라이언트, 메신저
네트워크 데이터를 필요로 하는 모든 애플리케이션이 해당(모바일 앱 조합)
nlp.jbnu.ac.kr/PL2020/ch14_additional.pdf
참고
package kr.co.kihd.inetaddress;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest {
public static void main(String[] args) throws Exception {
InetAddress ia = null;
InetAddress[] iaArr = null;
ia = InetAddress.getByName("www.google.com");
System.out.println("호스트 네임 : " + ia.getHostName());
System.out.println("호스트의 IP주소 : " + ia.getHostAddress());
System.out.println(ia.toString());
System.out.println("-----------------------------------------");
iaArr = InetAddress.getAllByName("www.google.com");
for(int i = 0; i<iaArr.length; i++) {
System.out.println(iaArr[i]);
}
System.out.println("-----------------------------------------");
ia = InetAddress.getLocalHost();
System.out.println("로컬호스트 : " + ia.getHostName());
System.out.println("로컬호스트 주소 : " + ia.getHostAddress());
}
}
호스트 네임 : www.google.com
호스트의 IP주소 : 216.58.220.132
www.google.com/216.58.220.132
-----------------------------------------
www.google.com/216.58.220.132
-----------------------------------------
로컬호스트 : DESKTOP-E6G5Q1J
로컬호스트 주소 : 192.168.100.145
package kr.co.kihd.inetaddress;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
/*
* URL : Uniform Resource Location
* 인터넷에 존재하는 서버들의 자원에 접근할수 있는 주소
* ex)https://developer.android.com/about?hl=ko
* 1)프로토콜 : 자원에 접근하기 위해 서버와 클라이언트간 통신하는데 사용하는 규약.
* 2)호스트명 : 자원을 제공하는 서버의 이름
* 3)포트번호 : 통신에 사용되는 서버의 포트번호(80)
* 4)경로명 : 접근하려는 자원이 저장되된 서버상의 위치
* 5)쿼리(query) : URL에서 '?'이후의 부분
*/
public class URLTest {
public static void main(String[] args) throws Exception {
URL url = new URL(args[0]);
System.out.println("프로토콜 : " + url.getProtocol());
System.out.println("호스트 : " + url.getHost());
System.out.println("포트 : " + url.getPort());
System.out.println("파일 : " + url.getFile());
InputStream ins = url.openStream();
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(ins));
String str = " ";
while((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
ins.close();
}
}
스트림을 활용해서 이미지 불러와 저장하기
package kr.co.kihd.inetaddress;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class URLConectionTest {
//스트림을 활용해서 이미지 불러와 저장하기
public static void main(String[] args) throws Exception {
String str = "https://lh5.googleusercontent.com/p/AF1QipMGUsroCou49CjvAhNInHfC4EgkYIBM4WFWEWHi=w408-h544-k-no";
URL url = new URL(str);
URLConnection conn = url.openConnection();
System.out.println("toString() : " + conn);
int size = conn.getContentLength();
System.out.println("파일 크기 : " + size);
System.out.println("파일 타입 : " + conn.getContentType());
System.out.println();
InputStream in = url.openStream(); //주스트림
BufferedInputStream bi = new BufferedInputStream(in); //주스트림 + 보조스트림 연결
FileOutputStream fo = new FileOutputStream("gumi.jpg");
byte[] buffer = new byte[1024];
int imgData = 0;
int cnt = 0;
while( (imgData = bi.read(buffer)) != -1) {
fo.write(buffer, 0, imgData);
fo.flush();
cnt += imgData;
System.out.println(((cnt*100)/size) + "%");
}
in.close(); bi.close(); fo.close();
}
}
toString() : sun.net.www.protocol.https.DelegateHttpsURLConnection:https://lh5.googleusercontent.com/p/AF1QipMGUsroCou49CjvAhNInHfC4EgkYIBM4WFWEWHi=w408-h544-k-no
파일 크기 : 97174
파일 타입 : image/jpeg
0%
1%
2%
3%
3%
4%
5%
6%
6%
7%
8%
9%
9%
10%
10%
11%
12%
13%
13%
14%
15%
16%
17%
17%
18%
19%
20%
20%
21%
21%
22%
23%
24%
24%
25%
26%
27%
27%
28%
29%
30%
30%
31%
32%
32%
34%
34%
35%
35%
36%
37%
38%
38%
39%
40%
41%
41%
42%
43%
44%
44%
45%
46%
47%
47%
48%
48%
49%
50%
51%
52%
52%
53%
54%
55%
55%
56%
57%
58%
58%
59%
59%
61%
61%
62%
62%
63%
64%
65%
65%
66%
67%
68%
69%
69%
70%
71%
72%
72%
73%
73%
74%
75%
76%
76%
77%
78%
79%
79%
80%
81%
82%
82%
83%
84%
84%
86%
86%
87%
87%
88%
89%
90%
90%
91%
92%
93%
93%
94%
95%
96%
96%
97%
98%
99%
99%
100%
소켓 프로그래밍
소캣
TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술
서버를 먼저 구현하고 다음으로 클라이언트를 구현한다,
package kr.co.kihd.demo;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class DemoClient {
public static void main(String[] args) throws Exception {
//연결시 소켓이 생성된다. 연결이 안될경우에는 예외발생한다.
Socket socket = new Socket("192.168.100.145", 5050); //127.0.0.1
System.out.println("서버와 접속이 되었습니다....");
InputStream ins = socket.getInputStream(); //주스트림
DataInputStream dins = new DataInputStream(ins); //보조스트림 연결
String str = dins.readUTF();
int number = dins.readInt();
System.out.println("서버에서 전송된 문자 : " + str);
System.out.println("서버에서 전송된 값 : " + number);
dins.close(); ins.close(); socket.close();
}
}
package kr.co.kihd.demo;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class DemoServer {
public static void main(String[] args) throws IOException {
int port = 5050;
int number = Integer.parseInt(args[0]); //실행할때 매개변수 첫번째 문자를 받음
String str = new String(args[1]);
//서버 소켓 생성
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("접속 대기중~");
while(true) {
Socket socket = serverSocket.accept();
System.out.println("사용자 접속 했습니다.");
System.out.println("클라이언트 IP : "
+ socket.getInetAddress().getHostAddress());
//스트림 생성
OutputStream ous = socket.getOutputStream();
DataOutputStream dous = new DataOutputStream(ous);
dous.writeUTF(str);
dous.writeInt(number);
dous.flush();
dous.close();
ous.close();
socket.close();
}//while
}
}
서버와 접속이 되었습니다.
서버에서 전송된 문자 : 구미시
서버에서 전송된 값 : 123
서버에서 하이! 메시지 write 클라이언트 readLIne으로 출력하기
package kr.co.kihd.echo;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServerTest {
public static void main(String[] args) {
int port = 7070;
ServerSocket serverSocket = null;
Socket socket = null;
//서버소켓 생성
try {
serverSocket = new ServerSocket(port);
System.out.println("접속 대기중");
socket = serverSocket.accept();
System.out.println(socket.getLocalPort() + "포트와 클라이언트"
+socket.getInetAddress() + "과 접속이 되었습니다.");
OutputStream out = socket.getOutputStream();//클라이언트와 통신하기 위한 스트림을 생성
PrintWriter pout = new PrintWriter(out, true); //flush()기능 자동으로 제공
pout.println("하이!!");
out.close(); pout.close(); socket.close(); serverSocket.close(); //반드시 넣어줌
} catch (IOException e) {
e.printStackTrace();
}
}
}
package kr.co.kihd.echo;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class EchoClientTest {
public static void main(String[] args) throws Exception {
String ip = "192.168.100.145";
int port = 7070;
//소켓 생성
Socket socket = new Socket(ip, port);
System.out.println("서버와 접속이 되었습니다.");
//서버로부터 데이터를 입력받는 스트림
InputStream ins = socket.getInputStream(); //주스트림
InputStreamReader isr = new InputStreamReader(ins); //보조스트림
BufferedReader bff = new BufferedReader(isr); //버퍼 3개 연결
String serverMsg = "";
serverMsg = bff.readLine(); //서버에서 읽음.
System.out.println("서버메시지 >" + serverMsg); //서버에서 불러온 메시지
bff.close(); socket.close(); isr.close(); ins.close();
}
}
서버와 접속이 되었습니다.
서버메시지 >하이!!