/******************************************************************************
* 파일 : URLConnectionOutput.java
* 용도 : URLConnectionOutput test
* 작성자 : 성홍제
* 작성일 : 2006. 08. 07
* Version : 1.0
******************************************************************************/
import java.net.*;
import java.io.*;
public class URLConnectionOutput
{
public static void main(String[] args)
{
try
{
URL url = new URL("http://search.empas.com/search/all.html");
URLConnection conn = url.openConnection();
// URLConnection 개체가 output도 가능하게 하겠다는 설정
conn.setDoOutput(true);
System.out.println("검색어를 입력하세요:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String strKeyword = br.readLine();
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write("a=w&s=&f=&z=A&q="+URLEncoder.encode(strKeyword,"euc-kr"));
wr.flush();
wr.close();
String line=null;
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
PrintWriter pw = new PrintWriter(new FileWriter("result.html"));
while ((line = br.readLine()) != null)
{
System.out.println(line);
pw.println(line);
}
pw.close();
br.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
★ URLEncoder,URLDecoder
① URLEncoder클래스
데이터를 웹서버에서 요구하는 데이터 형식으로 바꾸어 줌
(x-www-form-urlencoded 형식)
변환규칙
아스키문자(a~z, A~Z, 1~9), ‘,’, ‘-’, ‘*’, ‘_’ : 그대로 전달
공백문자 : ‘+’기호로 전환
기타문자 : ‘%xy’ 같은 형식으로 변환(xy: ASCII코드를 16진수화한 결과)
하나의 static 멤버 메서드를 갖음
public static String encode(String s) Deprecated.
public static String encode(String s,String charset. )
② URLDecoder클래스
X-www-form-urlencoded 형식으로 인코딩된 데이터를 디코딩
하나의 static 멤버메서드를 갖음
Public static String decode(String d)
/******************************************************************************
* 파일 : URLEnDecoderTest.java
* 용도 : URLEnDecoderTest test
* 작성자 : 성홍제
* 작성일 : 2006. 08. 07
* Version : 1.0
******************************************************************************/
import java.net.*;
public class URLEnDecoderTest
{
public static void main(String [] args) throws Exception
{
String str, encodedStr, decodedStr;
str = "우리가 사랑하는 모든 사람";
// euc-kr로 인코딩
encodedStr = URLEncoder.encode(str,"euc-kr");
decodedStr = URLDecoder.decode(encodedStr,"euc-kr");
System.out.println("str : " + str);
System.out.println("encodedStr : " + encodedStr);
System.out.println("decodedStr : " + decodedStr);
}
}
★ 포트(Port)
포트 : 하나의 주소에서 동시 작업, 여러 서비스 이용 용이
0~1023 사이의 포트는 시스템에 예약
사용자가 임의의 사용 포트 :1024~65535까지의 포트
미리 할당되어 있는 포트
하나의 포트는 하나의 프로그램만이 사용가능.
동시에 2개 이상의 프로그램이 같은 포트를 사용하려하면 충돌이 발생.
★ 소켓(Socket)
① 상호 통신을 위해 사용되는 일시적인 객체
② 통신을 하기 위해 사용되는 TCP 계층
소켓 & 포트 : 두 개의 프로그램이 하부 네트워크에 신경 쓰지 않고 통신하기 위한
소프트웨어적인 메커니즘(mechanism)
③ 두 개의 프로그램 사이에 통신을 위한 채널이 형성
양방향 통신이 이루짐
서버 : 자신의 포트 번호로 요청 대기(listen) => 요청 확인(accept) => 해당 서비스 수행
④ 소켓의 기본적인 일
원격기계에 접속
데이터를 보냄
연결끊음
포트에 바인드
들어오는 데이터에 귀를 기울임
바인드된 포트를 통해 들어오는 원격 기계 접속요청 받음
⑤ 가상회선 마련 : 포트와 소켓 이용
TCP의 연결기반 서비스를 제공
각 TCP 애플리케이션은 고유한 포트번호를 가진 포트를 가짐.
가상회선을 확보
TCP 층은 소켓들을 마련하고 있다가, 그 소켓을 통해 들어온 요청을 전달할 표적 애플리케이션의 포트에 연결.
1. 서버 : 4444번 포트에 대해 계속 클라이언트의 요청대기(Listen)
2. 클라이언트 : 4444번 포트를 통해 서버로 서비스 요청.
3. 서버 / 클라이언트 프로그램은 각각이 사용하는 포트(소켓)을 연결
=> 하나의 논리적인 채널을 생성
4. 서버: 결과를 클라이언트가 사용하는 포트(예에서는1234)를 통해 전달
/******************************************************************************
* 파일 : EchoServer.java
* 용도 : EchoServer test
* 작성자 : 성홍제
* 작성일 : 2006. 08. 07
* Version : 1.0
******************************************************************************/
import java.net.*;
import java.io.*;
public class EchoServer
{
public static void main(String[] args)
{
ServerSocket server = null;
Socket sock = null;
BufferedReader br = null;
PrintWriter pw = null;
try
{
// 서버 소켓 생성 - 서버가 사용할 포트 번호
server = new ServerSocket(10001);
while(true)
{
System.out.println("접속을 기다립니다.");
// 클라이언트의 접속을 기다린다. 접속한 후에 다음 라인으로 넘어간다.
sock = server.accept();
// 접속한 컴퓨터의 IP주소를 얻는다. - 소켓에 모든 정보가 들어있다.
InetAddress inetaddr = sock.getInetAddress();
System.out.println(inetaddr.getHostAddress() + " 로 부터 접속하였습니다.");
// 역시 소켓에서 Input, OutputStream을 얻어온다.
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();
br = new BufferedReader(new InputStreamReader(in));
pw = new PrintWriter(new OutputStreamWriter(out));
String line = null;
// 한줄씩 읽어와서
while((line = br.readLine()) != null)
{
// 화면에 출력하고
System.out.println("클라이언트로 부터 전송받은 문자열 : " + line);
// 다시 그대로 클라이언트에 돌려준다.
pw.println(line);
pw.flush();
}
}
}
catch(SocketException e) // 클라이언트가 강제 종료 시 서버에서 예외 발생하는 것을 처리
{
System.out.println("클라이언트 강제 종료");
}
catch(Exception e)
{
//System.out.println(e);
e.printStackTrace();
}
finally
{
try
{
// 소켓 닫기 전에 먼저 스트림부터 닫는다.
pw.close();
br.close();
sock.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
} // main
}
/******************************************************************************
* 파일 : EchoClient.java
* 용도 : EchoClient test
* 작성자 : 성홍제
* 작성일 : 2006. 08. 07
* Version : 1.0
******************************************************************************/
import java.net.*;
import java.io.*;
public class EchoClient
{
public static void main(String[] args)
{
Socket sock = null;
BufferedReader keyboard = null;
PrintWriter pw = null;
BufferedReader br = null;
try
{
// 클라이언트 소켓 생성 - 서버의 IP주소와 서버 프로그램의 포트번호
// 생성과 동시에 연결한다.
sock = new Socket("61.109.232.156", 10001);
keyboard = new BufferedReader(new InputStreamReader(System.in));
pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String line = null;
// 키보드로부터 메시지 입력 받음.
while((line = keyboard.readLine()) != null)
{
if(line.toLowerCase().equals("quit"))
break;
// 서버로 보낸다.
pw.println(line);
pw.flush();
// 서버에서 되돌려보낸 문자열을 읽는다.
String echo = br.readLine();
System.out.println("서버 로부터 전달받은 문자열 :" + echo);
}
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
try
{
br.close();
pw.close();
sock.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
} // main
}
'프로그래밍 > Java' 카테고리의 다른 글
04 UDP (0) | 2007.11.27 |
---|---|
03 졸려.... (0) | 2007.11.27 |
01 Network 첫시간... (0) | 2007.11.27 |
05 문자 단위 입출력 (0) | 2007.11.27 |
04 ObjectOutputStream / ObjectInputStream 클래스 (0) | 2007.11.27 |