URL
URL형식에 맞는 문자열을 매개변수로 전달해야함
http://www.naver.com
ftp://ftp.a.b.c/pub
fil:///c:\myjava\day01\Hello.java
openStream()메소드를 이용하면 URL이 위치한 곳과 자동으로
접속이 일어나고, 그 결과로 InputStream이 반환
package net.day01;
import java.net.*;
import java.io.*;
public class URLTest {
public static void main(String[] args) {
try {
URL url = new URL(args[0]);
System.out.println("Protocol: "+url.getProtocol());
System.out.println("Host: "+url.getHost());
System.out.println("Port: "+url.getPort());
// -1을 반환 => 디폴트 포트를 사용한다는 의미
// http==> 80
System.out.println("DefaultPort: "+url.getDefaultPort());
System.out.println("File: "+url.getFile());
InputStream is=url.openStream();
//openStream()메소드를 이용하면 URL이 위치한 곳과 자동으로
//접속이 일어나고, 그 결과로 InputStream이 반환
BufferedReader br
=new BufferedReader(new InputStreamReader(is,"UTF-8"));
PrintWriter pw = new PrintWriter(System.out,true);
String line="";
while((line=br.readLine())!=null) {
pw.println(line);
}
pw.close();
br.close();
is.close();
} catch (MalformedURLException e) {
System.out.println("URL형식에 맞지 않음");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
url을 통해 이미지 가져오기
package net.day01;
import java.net.*;
import java.io.*;
public class URLTest2 {
public static void main(String[] args)
throws IOException, MalformedURLException
{
String str="https://res.cloudinary.com/demo/image/upload/sofa_cat.jpg";
//URL 클래스를 이용해서 위 이미지를 카피하여 target.jpg
URL url = new URL(str);
InputStream is=url.openStream();
//openStream()메소드를 이용하면 URL이 위치한 곳과 자동으로
//접속이 일어나고, 그 결과로 InputStream이 반환
File file = new File("target.jpg");
FileOutputStream fos = new FileOutputStream(file);
byte[] data= new byte[4000];
int n =0, count=0;
while((n=is.read(data))!=-1) {
fos.write(data,0,n);
fos.flush();
}
fos.close();
is.close();
}
}
InetAddress
- IP주소를 추상화한 클래스
- new로 생성하는 것이 아니라 static 메소드로 얻어온다.
1) IP주소 : 인터넷 상의 하나의 컴퓨터를 구분하기 위한 고유번호
32비트 IPv4 ===> 128비트 IPv6
2) 도메인이름 : IP주소에 대응하는 문자로된 주소를 도메인이라고 함
211.231.99.80 ===> www.daum.net (도메인)
3) DNS (Domain Name System) : 사용자가 사용하는 도메인 이름을 자동으로 IP주소로 바꿔주는 시스템
package net.day01;
import java.net.*;
import java.io.*;
public class InetAddressTest {
public static void main(String[] args) {
try {
InetAddress ia = InetAddress.getByName("www.naver.com");
System.out.println("호스트 이름: "+ia.getHostName());
System.out.println("호스트 IP: "+ia.getHostAddress());
InetAddress[] inets
= InetAddress.getAllByName("www.naver.com");
if(inets!=null) {
for(InetAddress a : inets) {
System.out.println("호스트 이름: "+a.getHostName());
System.out.println("호스트 IP: "+a.getHostAddress());
}
}
} catch(UnknownHostException e){
e.printStackTrace();
}
}
}
TCP
TCP 방식을 쓸 경우
1) TCP로의 연결은 Socket 클래스를 사용
-TCP/IP를 써서 서버와 통신하기 위해 클라이언트가 서버에 대한 소켓을 생성해야 함
-이 때 TCP연결을 위해 HOST(서버) 이름(ip)과 PORT번호를 정해줘야 함
- 포트 번호는 1~65535 까지의 정수값이지만, 0 ~ 1024 사이의 값은 시스템이 사용하는 포트 번호이므로 사용하지 말아야
cf> http는 80 포트, telnet은 23번 ftp는 21번
- 설정된 포트에서 대기(listening)하고 있는 서버가 존재하고 있으면 연결되고 그렇지 않으면 실패
- 소켓 연결이 이뤄지면 이 Socket 을 이용해 서버로의 Stream을 얻어낸다. (getInputStream()/getOutputStream())을 이용
- 이 스트림을 통해 데이터를 주고 받는다. 이 때 노드 스트림에 필터스트림을 덧입혀 좀더 고 수준의 데이터 교환이 가능
5. 네트워크 프로그램 절차
1) IP를 알아낸다.---> InetAddress클래스로
2) TCP로 연결 ---> Socket을 이용
---------------------------------------
서버의 경우 | 클라이언트 경우
----------------------+------------------
1) ServerSocket | 1) Socket
2) Socket | 하나만 있으면 된다.
두가지가 필요 |
----------------------+-------------------
1)서버 소켓에서는 | 1)클 소켓에서는
열어둘 포트번호 | 서버의 ip주소와
를 인자로 | port번호 두개를
| 인자로 받는다.
ServerSocket ser |
=new ServerSocket(5555)| Socket cs
2)서버 소켓을 통해 | =new Socket(ip,5555)
클과 통신할 |
소켓을 얻는다. |
Socket sock=ser.accept()|
-----------------------------------------
3) 소켓 연결이 이뤄지고 나면
Socket을 사용하요 서버로의 Stream을 얻어냄
-> sock.getInputStream()
sock.getOutputStream()
4) 이 스트림을 통해 데이터를 주고 받는다.
Server
package net.day01;
import java.io.*;
import java.net.*;
public class MyNetServer {
public static void main(String[] args) throws IOException{
final int port = 5555;
ServerSocket server = new ServerSocket(port);
//서버소켓 생성할 때 포트번호가 필요함
//포트번호는 1 ~ 65535사이의 값을 지정
//1 ~ 1024까지는 예약된 포트번호가 많으므로 그 이상의 값으로 지정
System.out.println("클라이언트 연결을 기다림..");
while(true) {
Socket sock = server.accept();
System.out.println("클이 접속해옴");
InetAddress ia = sock.getInetAddress();
System.out.println("클의 IP: "+ia.getHostAddress());
//클이 접속해오면 랜덤한 정수값을 클에게 보내주자
int num=(int)(Math.random()*100)+1;
OutputStream os = sock.getOutputStream();
//클에게 보내기 위한 출력스트림 열기
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("행운의 숫자");
dos.writeInt(num);
dos.flush();
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
String msg = dis.readUTF();
System.out.println(msg);
dis.close();
is.close();
}
}
}
Client
package net.day01;
import java.net.*;
import javax.swing.JOptionPane;
import java.io.*;
public class MyNetClient {
public static void main(String[] args)
throws IOException
{
//클라이언트단에서는 Socket만 필요
Socket sock = new Socket("192.168.0.225",5555);
System.out.println("서버와 연결됨...");
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
String msg = dis.readUTF();
System.out.println("From Server>>"+msg);
int num=dis.readInt();
System.out.println("From Server>>"+num);
//서버에 인사말을 보낸다. ==> 서버는 이것을 듣고 자기 콘솔에 출력
String sendMsg = JOptionPane.showInputDialog("메시지를 입력");
OutputStream os = sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(sendMsg);
dos.close();
os.close();
dis.close();
is.close();
sock.close();
}
}
에코서버
* - Client가 Server에 접속하면
* [1] 서버로부터 먼저 "안녕하세요? 클라이언트님~~"
이란 메시지를 받는다.
* [2] 그러면 클라이언트는 키보드 입력을 통해 메시지를 보낸다.
* [3] 그러면 서버는 클라이언트로 부터 받은 메시지를 분석해서
* (1) "안녕하세요?" 또는 "하이" 란 메시지가 오면
* ==> "반가워요~~ 클님!!!" 이라 답변하고
* (2) "오늘 날짜는" 이란 메시지가 오면
* ==> 오늘 날짜를 알려주고
* (3) 그외 다른 메시지가 오면
* "~~~님, 어여 가!!"란 메시지를 보내자.
Server
package net.day01;
import java.net.*;
import java.io.*;
public class EchoServer {
public static void main(String[] args)
throws IOException
{
final int port = 7777;
ServerSocket server = new ServerSocket(port);
Socket sock = null;
System.out.println("EchoServer Started..");
sock = server.accept();
InetAddress ia = sock.getInetAddress();
System.out.println(ia.getHostAddress()+"님이 접속..");
//클에게 메시지를 보내기 위한 스트림 연결
PrintWriter pout = new PrintWriter(sock.getOutputStream(),true);
pout.println("안녕하세요. 클라이언트님");
//1)클이 보내오는 메시지를 들을 입력 스트림 얻기
BufferedReader bf
= new BufferedReader(new InputStreamReader(sock.getInputStream()));
//2)반복문 돌면서 클이 보내오는 메시지를 듣고 이 메시지를
// 분석(파싱)한다.
// i) 안녕, 하이 ===> "반가워요, 클님"의 답변
// ii) 오늘 날짜 ===> "2020-06-16"
// iii) 그 외에는 ===> "나가세요"
String cMsg="";
while((cMsg=bf.readLine())!=null) {
if(cMsg.equals("안녕")||cMsg.equals("하이")){
pout.println("반가워요 클님");
}else if(cMsg.contains("날짜")) {
pout.println("2020-06-16");
}else {
pout.println("나가세요");
}
}
bf.close();
pout.close();
sock.close();
server.close();
}
}
Client
package net.day01;
import java.net.*;
import java.io.*;
public class EchoClient {
public static void main(String[] args)
throws IOException
{
String ip="192.168.0.183";
Socket sock = new Socket(ip,7777);
System.out.println("서버와 연결됨..");
InputStream is = sock.getInputStream();
//1) 서버가 보내오는 메시지를 듣는 스트림 얻기
BufferedReader bf
= new BufferedReader(new InputStreamReader(is));
String serverMsg = bf.readLine();
System.out.println("From EchoServer>>"+serverMsg);
//2) 키보드와 노드 연결한 스트림 생성
BufferedReader key
=new BufferedReader(new InputStreamReader(System.in));
//3) 서버에 메시지를 보내기 위한 출력 스트림 얻기
PrintWriter out = new PrintWriter(sock.getOutputStream(),true);
//키보드 입력받고 서버로 보내기
String myMsg="";
while((myMsg=key.readLine())!=null) {
out.println(myMsg);//서버에 메시지 보내기
//서버가 보내오는 메아리 듣기
serverMsg=bf.readLine();
System.out.println("From Server>>"+serverMsg);
}
bf.close();
is.close();
key.close();
out.close();
sock.close();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
location 객체
location객체의 속석
1) href : 현재 페이지의 url값을 반환함
2) hostname : 웹호스트의 도메인명을 반환함
3) pathname : 현재 페이지의 경로와 파일명을 반환함
4) portocol : 현재 페이지의 프로톡콜을 반환함
location객체의 함수
5) assign('파일명 또는 url') : 새로운 문서를 로드해준다.
6) reload() : 새로고침
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ex21BOM_location.html</title>
</head>
<body>
<h1>BOM - location 객체</h1>
<div id="msg">
</div>
<button id="b1">location객체의 속성 살펴보기</button>
<button id="b2">구글 페이지 이동</button>
<button id="b3" onclick="newPage()">새로운 페이지</button>
<button id="b4" onclick="refresh()">새로고침</button>
<button id="b5">3초 후 페이지 이동</button>
<script>
var obj1 = document.getElementById('b1');
var obj2 = document.getElementById('b2');
var divMsg = document.getElementById('msg');
var obj5 = document.getElementById('b5');
obj1.onclick=function(){
// alert("hi");
divMsg.innerHTML="<h3>"+window.location.href+"</h3>";
divMsg.innerHTML+="<h3>"+window.location.hostname+"</h3>";
divMsg.innerHTML+="<h3>"+window.location.pathname+"</h3>";
divMsg.innerHTML+="<h3>"+window.location.protocol+"</h3>";
}
//문제 id가 b2인 버튼을 클릭하면 구글 페이지로 이동
obj2.onclick=function(){
location.href="http://www.google.com";
}
//ex01.html 열기
function newPage(){
location.assign('ex01.html');
}
//새로고침하기
function refresh(){
location.reload();
}
function go(){
location.href="http://www.naver.com";
}
//3초뒤에 네이버로 이동하기
obj5.onclick=function(){
window.setTimeout(go,3000);
}
</script>
</body>
</html>
History객체
history.go(n) : n값이 양수면 => forward()효과
음수면 => back()효과
history,back() : 한 단계 이전 페이지로 이동
history.forward() : 한 단계 이후 페이지로 이동
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>BOM - history 객체</h1>
<h1>첫번째 페이지</h1>
<a href="his02.html">2페이지 이동</a>
</body>
</html>
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>BOM - history 객체</h1>
<h1>첫번째 페이지</h1>
<a href="his02.html">2페이지 이동</a>
</body>
</html>
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>BOM - history 객체</h1>
<h1>세번째 페이지(his03.html)</h1>
<a href="his02.html">2페이지 이동</a>
<p></p>
<button onclick="before1()">1단계 이전 페이지</button>
<button onclick="before2()">2단계 이전 페이지</button>
<script>
var before1 = function(){
history.go(-1);
}
var before2 = function(){
history.go(-2);
}
</script>
</body>
</html>
실습 자바스크립트에서 원 움직이기
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div#circle{
width:100px;
height: 100px;
background-color: cadetblue;
border-radius: 50%;
position: relative;
left: 100px;
right: 100px;
}
</style>
</head>
<body>
<div id="circle">
</div>
<button onclick="move1()">1번만 x좌표를 100px 이동</button>
<button onclick="move2()">Move Circle</button>
<button onclick="stop()">Stop Circle</button>
<script>
var obj = document.getElementById("circle");
var c = 0;
var move1 = function(){
c+=100;
obj.style.marginLeft=c+"px";
}
var move2 = function(){
w = setInterval(move1,1000);
}
var stop =function(){
clearInterval(w);
}
</script>
</body>
</html>