19-Network
네트워크
서버와 클라이언트
network: 여러 대의 컴퓨터를 통신 회선으로 연결한 것
- 서버: 클라이언트의 요청을 처리하고 결과를 리턴하는 컴퓨터
- 클라이언트: 요청하는 컴퓨터 (ip, port가 있어야 함)
한 개의 서버에 여러 클라이언트가 요청하는 시스템
자바의 웹은 이러한 처리를 하기 위해 멀티스레드가 이미 구현된 상태로 제공되고 있다.
- 프로토콜(protocol) : A라는 컴퓨터랑 B라는 컴퓨터가 소통을 하려면 일종의 약속된 규칙이 있어야 한다. 그것이 바로 프로토콜
- 서버와 클라이언트에는 동일한 프로토콜을 사용할 수 있는 환경이 되어야 한다.
java.net
통신구현
tcp통신 방식과, udp 통신 방식으로 구분 (tcp프로토콜, udp 프로토콜)
- java.net.ServerSocket
- java.net.Socket
tcp통신 구현 (전화) | udp통신 구현 (이메일) |
---|---|
java.net.SercerSocket java.net.Socket 1. 연결 2. 서버- 출력-클라이언트 입력 3. 클라이언트 출력 - 서버입력 4. 연결해제 |
java.net.DatagramSocket java.net.DatagramPacket 1. 보낸 이메일 + 받는 이메일 + 내용 2. 보낸 이메일 + 받는 이메일 + 내용2 ….. 연결 해제라는 개념이 없음. 동시에 대량 내용 전송이 가능, 응답 필요가 없는 메시지 |
http - 웹클라이언트/서버 |
tcp통신
tcp server class | tcp client class |
---|---|
1. ServerSocket 생성 (서버마다의 식별자인 port 필요) 3. tcp 연결 클라이언트 대기- 승인- Socket리턴 5. 클라이언트로부터 데이터 전송받음 = 서버 입력 6. 요청 내용 처리, 그 결과를 전송 = 서버 출력 9. Socket close = 연결 해제 10. 또 다른 클라이언트 연결 요청, 대기, 승인 |
2. Socket 생성 (“tcp server 컴퓨터 ip”, port 값) 4. 서버로 데이터 전송 = 클라이언트 출력 7. 서버로부터 데이터를 전송 받음 = 클라이언트 입력 … 필요한 만큼 작업 반복 … 8. Socket close = 서버와의 연결 해제 |
- 양 쪽에 Socket이 생성되면 연결된 것.
- 서버는 ServerSocket과 Socket 두 개가 있어야 하고 클라이언트는 Socket만 있으면 된다.
구현1) 서버 연결 과정
package server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
//ServerSocket 생성 port 번호 = 서버 프로그램 식별 번호 = 2^16 = 0-65535
//0-1024 이내 windows ftp telnet http 프로토콜 포트 예약, 피할 것
// 1025 - 5000 이내 권고사항, os 사용소지가 크니 피할 것
try{
ServerSocket ss = new ServerSocket(9999); // 서버 시작, 연결 대기 중
System.out.println("----서버 시작 대기 중----");
Socket s = ss.accept(); //연결 승인, 결과물로 Socket생성 - 연결점
System.out.println("----클라이언트와 연결 중----");
s.close();
System.out.println("----클라이언트와 연결 종료----");
}catch(IOException e) {
e.printStackTrace();
}
}
구현2) 언어 통신하기 입출력(server)
ackage server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
//ServerSocket 생성 port 번호 = 서버 프로그램 식별 번호 = 2^16 = 0-65535
//0-1024 이내 windows ftp telnet http 프로토콜 포트 예약, 피할 것
// 1025 - 5000 이내 권고사항, os 사용소지가 크니 피할 것
try{
ServerSocket ss = new ServerSocket(8999); // 서버 시작, 연결 대기 중
System.out.println("----서버 시작 대기 중----");
while(true) {
Socket s = ss.accept(); //연결 승인, 결과물로 Socket생성 - 연결점
System.out.println("----클라이언트와 연결 중----");
InputStream i = s.getInputStream();
//o.write(byte[])
byte b[] = new byte[100];
i.read(b); // read한 것을 byte b에 넣어
//byte[] -> String
String input_b = new String(b);
System.out.println("----클라이언트가 서버로 전송한 데이터 = " +input_b);
//클라리언트로 hello client 문자열 전송 = 서버 출력
OutputStream o = s.getOutputStream();
String data = "hello client";
//String --> byte[] 변경
//byte[] - > String
byte[] data_byte = data.getBytes();
o.write(data_byte);
s.close();
System.out.println("----클라이언트와 연결 종료----");
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
구현2) 언어 통신하기 입출력(client)
package client;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TCPClient {
public static void main(String[] args) {
try {
Socket s = new Socket("192.168.0.41",8999);
System.out.println("----서버와의 연결 중----");
//클라이언트가 서버로 출력
OutputStream o = s.getOutputStream();
String data = "hello server";
byte[] data_byte = data.getBytes();
o.write(data_byte);
//클라이언트가 서버로부터 입력받는 방법 1.
InputStream i = s.getInputStream();
/* byte b[] = new byte[100];
i.read(b); // read한 것을 byte b에 넣어
String input_b = new String(b);
*/
//방법 2.
Scanner sc = new Scanner(i);
String input_b = sc.nextLine(); // 전체 메시지 입력 받는 것 가
System.out.println("----서버가 클라이언트로 전송한 데이터 = " +input_b);
//방법 3.
s.close();
System.out.println("----서버와의 연결 종료----");
}catch(Exception e) {
e.printStackTrace();
}
}
}
java.io.DataInputStream –>DataOutputStream 출력된 데이터를 입력받는 객체 |
= java.util.Scanner 동일 |
---|---|
java.io.DataOutputStrema –>출력시 자바 데이터타입 변환 |
|
출력시 데이터타입으로 되었으면, 인풋도 데이터타입으로 즉, 스캐너 사용 안 됨, 둘은 일종의 쌍. 반드시 같은 타입으로 |
`` |
다음은 앞의 입출력을 DataInput Output Stream으로 바꾼 것이다.
TCPserver
package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer_Data {
public static void main(String[] args) {
//ServerSocket 생성 port 번호 = 서버 프로그램 식별 번호 = 2^16 = 0-65535
//0-1024 이내 windows ftp telnet http 프로토콜 포트 예약, 피할 것
// 1025 - 5000 이내 권고사항, os 사용소지가 크니 피할 것
try{
ServerSocket ss = new ServerSocket(8999); // 서버 시작, 연결 대기 중
System.out.println("----서버 시작 대기 중----");
while(true) {
Socket s = ss.accept(); //연결 승인, 결과물로 Socket생성 - 연결점
System.out.println("----클라이언트와 연결 중----");
InputStream i = s.getInputStream();
DataInputStream ds = new DataInputStream(i);
String input_b = ds.readUTF();
System.out.println("----클라이언트가 서버로 전송한 데이터 = " +input_b);
//클라리언트로 hello client 문자열 전송 = 서버 출력
OutputStream o = s.getOutputStream();
DataOutputStream ds2 = new DataOutputStream(o);
String data = "hello client";
ds2.writeUTF(data);
s.close();
System.out.println("----클라이언트와 연결 종료----");
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
TCPclient
package client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TCPClient_Data {
public static void main(String[] args) {
try {
Socket s = new Socket("192.168.0.41",8999);
System.out.println("----서버와의 연결 중----");
//클라이언트가 서버로 출력
OutputStream o = s.getOutputStream();
//o.write(byte1개/byte[])
DataOutputStream ds = new DataOutputStream(o);
String data = "hello server";
ds.writeUTF(data);
//클라이언트가 서버로부터 입력받는 방법 1.
InputStream i = s.getInputStream();
DataInputStream ds2 = new DataInputStream(i);
String input_b = ds2.readUTF();
System.out.println("----서버가 클라이언트로 전송한 데이터 = " +input_b);
//방법 3.
s.close();
System.out.println("----서버와의 연결 종료----");
}catch(Exception e) {
e.printStackTrace();
}
}
}
** DataInput과 Output은 쌍이다. 같이 써줘야 함.
서버 | 클라이언트 |
---|---|
1.클라이언트로부터 아이디, 암호 전송 받음 2.String ids [] = {“java”, “jsp”, “spring”}; 클라이언트로부터 아이디는 중복체크 3. 클라이언트에게 전송. 중복된 아이디라면 “다른 아이디를 사용하세요 중복되지 않았다면”xxxx는 사용 가능합니다.” |
1.회원아이디 입력: xxxx 2.암호 입력: xxx 3.서버로 전송 |