728x90
반응형
자바가 분명 끝나가고 있는데
마지막이 왜 이리 어려운지요
package com.sist.network;
/*
* 자바 네트워크 (인트라넷,인터넷 연결한후에 통신)
* 자바 => 사내메신저
* 자바 => 화면 UI , C => 서버
* ======================== 예) 카톡
* TCP =========> 전화
* 1) 연결성
* 2) 신뢰성
* 3) 속도 저하
* 4) => FTP , SMTP , TELNET , HTTP(웹)
* UDP =========> 우편
* 1) 비연결성
* 2) 신뢰성이 없다
* 3) 속도가 빠르다
* 4) => 게임 , 멀티미디어 (화상) => 24프레임
*
* 등기 => TCP / UDP
* 연결성,신뢰성,속도 => RTCP
*
* 자바에서 네트워크 =>
* 식별자 : IP(전화번호) , PORT (연결선) => 서버(IP:고정) , 클라이언트(유동)
* ==========================
* PORT : 0~65535 (0~1023 사용중)
* FTP(21) , SMTP(25) , TELNET(23) , HTTP(80) , 오라클서버(1521)
* MS-SQL(1433) , 몽고디비(27017) , 8080,4000
* 1) 서버제작
* 1:다 , 1:1 (프로그램 , 서버,클라이언트) : 화상 , 게임
* ====
* 1. 접속을 받는 프로그램 => 저장
* 2. 접속자마다 따로 통신이 가능하게 만든다 (쓰레드 : 통신)
* class Server
* {
* 접속자 정보 저장
* class 통신 extends Thread
* {
*
* }
* }
* http://www.daum.net/aaa/index.html
* *** Socket : 연결기계 (핸드폰)
* 접속을 당당하는 클래스
* ServerSocket
* 1) ip,port를 연결한다 bind() => 개통
* 2) 대기 상태 => listen()
* 3) 연결 => accept() => ip(발신자의 전화번호) => 저장
* 4) 응답 => 요청 내용 read()
* 5) 응답 => write()
* 통신을 담당하는 클래스
* Socket
* 2) 클라이언트 연결 방법
* 접속 => 요청 => 응답 받아서 출력
*/
import java.io.*;
import java.net.*;
// 1. URL
/*
* http://www.daum.net/movie/list.jsp => URL
* =============== URI
* = URLConnection : 웹서버에 접근
* = URLEncoder : 한글변환 ===> encoding ==> decoding => %EC%9E%90%EB%B0%94=자바
* ==========
* getBytes() 자바 = %EC%9E%90%EB%B0%94
* oq=자바
* 1. 브라우저 , 네트워크 => 1byte : 1byte를 변환 getByte() ===> 서버에서
* https://www.google.com/search?q=%EC%9E%90%EB%B0%94&rlz=1C1CHBD_koKR933KR933&oq=oq=자바&aqs=chrome..69i57j69i59j35i39j0i395i433j0i131i395i433j0i395j0i395i433j0i395.4281j1j15&sourceid=chrome&ie=UTF-8
*/
// 2. Socket , ServerSocket
// https://search.naver.com/search.naver?where=news&query=%EC%98%81%ED%99%94
public class MainClass{
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
URL url=new URL("http://newssearch.naver.com/search.naver?where=rss&query="
+URLEncoder.encode("영화", "UTF-8"));
// URL 연결
HttpURLConnection conn=(HttpURLConnection)url.openConnection();//naver에 연결
if(conn!=null) // 연결되었다면
{
BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
while(true)
{
String msg=in.readLine();
if(msg==null)// 읽을 내용이 없는 경우
{
break;
}
System.out.println(msg);
}
}
}catch(Exception ex){}
}
}
서버 소켓
클라이언트 소켓이 있고, 그 두개를 연결하는 과정을 네트워킹이라고 한다.
1. 서버소켓
ServerSocket
1) ip,port를 연결한다 bind() => 개통
2) 대기 상태 => listen()
3) 연결 => accept() => ip(발신자의 전화번호) => 저장
4) 응답 => 요청 내용 read()
5) 응답 => write()
서버소켓을 생성하기 위해서는 ip주소와 port번호를 지정해 주어야 한다. 그래서 생성이 된 것을 bind()라고 하고
생성이 된 후 누군가의 접속을 기다리는 상태를 listen(), 연결이 된 상태를 accept() 라고한다.
package com.sist.network;
import java.io.*; // 네트워크 입출력 (C/S => Client : 요청 , 응답을 받아서 출력 , Server:요청을 받아서 처리후에 응답)
import java.net.*;
/*
* 본인 => 서버
* ===
* localhost , 127.0.0.1 , 211.238.142.181
* ======================
*/
public class Server implements Runnable{
// 접속 받는 클래스
ServerSocket ss;
final int PORT=3355;// 0~65535(0~1023) => 화상(30000) , 음성(20000)
// 초기화
// 한개의 컴퓨타에서는 서버는 반드시 한번만 수행
// 여러번 수행도 가능 => PORT를 변경
public Server()
{
try
{
ss=new ServerSocket(PORT);// 컴퓨터 IP는 자동 인식
/*
* => ip,port
* => 개통 bind(ip,port) => 셋팅 완료
* => 클라이언트가 접근 대기 => listen()
*/
System.out.println("Server Start...");
}catch(Exception ex) {ex.printStackTrace();}
}
// 클라이언트가 접속시 처리 => 정보 저장
public void run()
{
while(true)
{
try
{
Socket s=ss.accept(); // 접속이 된 샹태에서만 호출 ==> 발신자 정보 (ip,port=>Socket)
System.out.println("Client IP:"+s.getInetAddress().getHostAddress());
System.out.println("Client PORT:"+s.getPort());
/*
* 서버 =======> port(고정)
* 클라이언트 ====> port(가변) => 자동 생성
*/
// 클라이언트 메세지 전송
OutputStream out=s.getOutputStream();
// s=> 클라이언트
out.write("안녕하세요!! 서버에 연결되었습니다\n".getBytes());//인코딩
}catch(Exception ex){}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Server server=new Server();
new Thread(server).start();// server가 가지고 있는 run()을 호출
}
}
클라이언트 소켓
접속할 ip주소를 연결해주면 접속이 된다.
Server와 Client를 연결하는 프로그램을 따로 만들어 봤다
package com.sist.practice;
import java.io.*;
import java.net.*;
public class Server {
private ServerSocket serverSocket;
private Socket clientSocket;
// 데이터가 들어왔다 나가는 통로도 만들어 줘야함
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
public void serverSetting() {
try {
// 생성과 바인드 ip, port 주소 할당
// ip는 자동으로 localhost
serverSocket = new ServerSocket(10002);
// 연결이 된 상태 - 접속이 완료된 부분
clientSocket = serverSocket.accept();
System.out.println("클라이언트 소켓 연결됨");
} catch (IOException e) {
e.printStackTrace();
}
}
public void streamSetting() {
// 받아온 정보 입력
try {
dataInputStream = new DataInputStream(clientSocket.getInputStream());
dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String dataRecv()
{
try {
return dataInputStream.readUTF();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void dataSend(String sendData)
{
try {
dataOutputStream.writeUTF(sendData);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 사용한 자원들을 모두 반납해주는 메소드
public void closeAll()
{
try {
serverSocket.close();
clientSocket.close();
dataInputStream.close();
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Server() {
serverSetting();
System.out.println(dataRecv());
dataSend("잘 받았습니다");
closeAll();
}
public static void main(String[] args) {
new Server();
}
}
서버에서 신경을 써야할게
먼저 소켓을 만들어 주어야하고, port를 설정해서 bind까지 완료해야한다.
그 다음에는 클라이언트와 연결해준다.
그 다음에는 받아온 정보를 입력해준다
데이터를 받고 보내는 메소들을 생성해주고, 서버 생성자를 만들어서 기능을 하나로 모아준다.
package com.sist.practice;
import java.io.*;
import java.net.*;
public class Client {
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
private Socket clientSocket;
public void connect() {
try
{
clientSocket = new Socket("125.177.95.108",10002);
System.out.println("접속완료!!");
}catch(Exception ex) {}
}
public String dataRecv()
{
try {
return dataInputStream.readUTF();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void dataSend(String sendData)
{
try {
dataOutputStream.writeUTF(sendData);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void streamSetting() {
// 받아온 정보 입력
try {
dataInputStream = new DataInputStream(clientSocket.getInputStream());
dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Client()
{
connect(); // 접속을 함
streamSetting(); // 스트림세팅
dataSend("안녕하세요 클라이언트 입니다^^!!");
System.out.println(dataRecv());
}
public static void main(String[] args) {
new Client();
}
}
클라이언트에서는 서버의 ip주소를 받아와서 접속을하면 데이터를 받아올 수 있었다.
728x90
반응형
'programming > Gukbi' 카테고리의 다른 글
국비 교육 31일차 - oracle (0) | 2021.02.07 |
---|---|
국비 교육 31일차 - 네트워크를 이용한 채팅 프로그램 (0) | 2021.02.07 |
국비 교육 29일차 - Thread (0) | 2021.02.02 |
국비 교육 28일차 - 라이브러리활용(Input/OutputStream) (0) | 2021.02.01 |
국비 교육 26일차 - 라이브러리활용(Vector, Map, Generics...) (0) | 2021.01.28 |