gwooden_코린이
java_네트워크에 대해 본문
728x90
- 네트워크
서버와 클라이언트를 연결해주는 것
뭔가를 주고 받는 행위
클라이언스 / 서버
클라이언트 요청 -> 서버 -> 요청사항 처리 -> 서버 -> 클라이이언트에게 응답
OSI 7 계층 <-- 국제표준기구
- 네트워크에 관련된 장비, 규약 -> 기존에는 회사마다 다 달랐다.
- 이를 해결하기 위해 업체마다의 표준을 맞추려고 함
1계층 - 물리 계층
- 기계, 전기, 기능을 케이블로 전송
- 단순히 주고받기만 하는 계층
- 장비 : 리피터, 허브
2계층 - 데이터 링크 계층
- 정보의 전달
- 오류 검출
- 단위 : 프레임
- 장비 : 브리지, 스위치
3계층 - 네트워크 계층(IP 계층이라고도 함)
- 안정성 향상, 속도 상승
- IP할당
4계층 - 전송 계층
- 통신이 활성화되는 계층
- TCP 프로토콜을 사용
- 프로토콜 : 통신 규약
- TCP : 상호간 신뢰적인 연결지향 서비스를 제공
- 패킷 손실 가능성이 적다, 중복, 순서 변경되는경우가 없음
- 비연결 -> UDP
- 신뢰성이 낮음
- 비연결성 1: 다수
5계층 - 세션 계층
- 통신을 위한 논리적 연결
- 대표적인 ex) 로그
6계층 - 표현 계층
7계층 - 응용 계층
- 서비스 제공
ip / port
- ip
- port 번호
- socket
- 연결해주는 장치
서버 동작 과정
- 소켓 생성
- ip, port를 지정
- 클라이언트 요청 대기
- 요청 ok -> 데이터 송수신 소켓 생성
- 송수신
- 연결 종료
클라이언트
- 소켓 생성
- 서버한테 요청 연결
- 서버 동장 과정에서 4번 항목과 연결
- 송수신
- 연결 종료
Java API에 모두 포함되어 있다
- 내컴퓨터 ip 주소 확인해보기
- 네이버 ip 주소 확인해보기
import java.net.InetAddress;
public class Main {
public static void main(String[] args) {
try {
InetAddress local = InetAddress.getLocalHost(); //예외발생할 경우가 있을 수 있으므로 예외처리 필요
System.out.println("내컴퓨터 ip 주소 : " + local.getHostAddress());
InetAddress[] iaArr = InetAddress.getAllByName("www.naver.com");
for(InetAddress r : iaArr) {
System.out.println("네이버 ip 주소 : " + r.getHostAddress());
}
}catch (Exception e) {
}
}
}
URL
Http:// " IP : Port"
? <-- 쿼리스트
요청방식 : get, post
get : 일반 검색 관련, 용량제한, 보안약함
post : 로그인 관련
ServerSocket
ip
port 1 ~ 65550
Socket
네트워크에선 특수한 IP 주소로 127.0.0.1이라는 IP 주소가 있다. 한 번씩 봤을 법한 주소인데, 이는 루프백(loopback) 혹은 로컬호스트 주소(localhost)라고도 불린다. 네트워크 통신이란 인터넷 상에 존재하는 호스트와 서로 패킷을 주고 받는 것 |
- 서버 클래스
package 소켓연결;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket serverSok = null;
try {
serverSok = new ServerSocket();
serverSok.bind(new InetSocketAddress("localHost", 5001));
while(true) { //계속 대기상태 -> 연결되면 상태 변함
System.out.println("[연결 대기]");
// 클라이언트 측에서 요청이 들어오면 요청을 받고 아래 출력문으로 넘어감
// 요청완료 하면 다시 대기상태로 돌아감
Socket socket = serverSok.accept();
InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
//형변환이 필요하다 -> (InetSocketAddress)
System.out.println("[연결 수락] : " + isa.getHostName());
}
} catch (Exception e) {
System.out.println("[연결 실패]");
}
if(!serverSok.isClosed()) {
try {
serverSok.close();
} catch(Exception e) {
}
}
}
}
- 클라이언트 클래스
package 소켓연결;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket();
System.out.println("[연결 요청]");
socket.connect(new InetSocketAddress("localhost", 5001));
System.out.println("[연결 성공]");
} catch(Exception e) {
}
if(!socket.isClosed())
try {
socket.close();
} catch (Exception e) {
}
}
}
- 서버 클래스 추가 코드
import java.io.OutputStream;
public class Server {
byte[] bytes = null;
String message= null;
InputStream is= socket.getInputStream();
bytes = new byte[100];
int readByteCount = is.read(bytes);
message = new String(bytes,0,readByteCount,"utf-8");
System.out.println("[데이터 받음]"+message);
OutputStream os= socket.getOutputStream();
message = "hi Client";
bytes = message.getBytes("utf-8");
os.write(bytes);
os.flush();
System.out.println("[데이터 전송함]");
is.close();
os.close();
socket.close();
- 클라이언트 클래스 추가 코드
import java.io.OutputStream;
public class Client {
byte[] bytes = null;
String message = null;
OutputStream os = socket.getOutputStream();
message = "hi Server";
bytes= message.getBytes("utf-8");
os.write(bytes);
os.flush();
System.out.println("[데이터 전송함]");
InputStream is= socket.getInputStream();
bytes = new byte[100];
int readByteCount = is.read(bytes);
message = new String(bytes,0,readByteCount,"utf-8");
System.out.println("[데이터 받음]"+message);
os.close();
is.close();
- 스레드를 이용한 서버/클라이언트
1. 서버 클래스
package 스레드;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServerMain {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(5500);
while(true) {
Socket socket = serverSocket.accept();
System.out.println("ip : " + socket.getInetAddress() + "와 연결 성공");
//송수신 쓰레드
ReceiveTread rt = new ReceiveTread(socket);
SendThread st = new SendThread(socket);
rt.start();
st.start();
}
}
}
package 스레드;
import java.io.DataInputStream;
import java.net.Socket;
public class RThread extends Thread {
private final Socket socket;
public RThread(Socket socket) {
this.socket = socket;
}
public void run() {
String message;
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
while(true) {
message = dis.readUTF();
System.out.println("상대방 : " + message);
}
} catch (Exception e) {
}
}
}
package 스레드;
import java.io.DataInputStream;
import java.net.Socket;
public class ReceiveTread extends Thread {
private final Socket socket;
public ReceiveTread(Socket socket) {
this.socket = socket;
}
/**계속 받을 수 있게 해주는 run 스레드*/
public void run() {
try {
//DataInputStream <-- 보조 스트림 (socket.getInputStream())
DataInputStream tmpbuf = new DataInputStream(socket.getInputStream());
String message; //문자를 받는 변수 선언
while(true) { //문자를 받을때 마다 무한 반복
message = tmpbuf.readUTF(); //문자를 읽어올때는 readUTF 사용
System.out.println("상대방 : " + message);
}
} catch (Exception e) {
System.out.println("[연결종료]");
}
}
}
2. 스레드 클라이언트 클래스
package 스레드;
import java.net.Socket;
public class SocketClientMain {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 5500);
System.out.println("[연결 성공]");
} catch (Exception e) {
System.out.println("[연결실패]");
}
if(socket != null) {
RThread rt = new RThread(socket);
SThread st = new SThread(socket);
rt.start();
st.start();
}
}
}
package 스레드;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SThread extends Thread{
private final Socket socket;
Scanner sc = new Scanner(System.in);
public SThread(Socket socket) {
this.socket = socket;
}
public void run() {
String message;
try {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
while(true) {
message = sc.nextLine();
dos.writeUTF(message);
dos.flush();
}
}catch (Exception e) {
}
}
}
package 스레드;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SendThread extends Thread{
private final Socket socket;
Scanner sc = new Scanner(System.in);
public SendThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
DataOutputStream sendWriter = new DataOutputStream(socket.getOutputStream());
String message;
while(true) {
message = sc.nextLine();
sendWriter.writeUTF(message);
sendWriter.flush();
}
}catch (Exception e) {
}
}
}
728x90
'데이터베이스' 카테고리의 다른 글
데이터 베이스 오라클 11g xe 설치 및 오라클 sql Developer 세팅해보기 (0) | 2023.01.09 |
---|---|
데이터 베이스란? (0) | 2022.12.21 |
java_MariaDB 활용02 (1) | 2022.12.13 |
java_데이터베이스01 (0) | 2022.12.12 |
mariaDB(마리아DB) 설치해보기 (0) | 2022.12.12 |
Comments