여러 대의 컴퓨터를 데이터 교환을 목적으로 통신 회선으로 연결한 것
네트워크로 연결된 컴퓨터 간의 관계를 역할로 구분
컴퓨터 간의 정보를 주고 받을 때 통신방법에 대한 규약
신뢰성을 최대한 보장하기 위한 방식
연결지향형 (3-way handshake)
순차적으로 데이터를 전송하고 확인
오류 시 재전송
HTTP, FTP 등에 사용
빠른 전달을 보장하기 위해 사용
비연결지향형
확인 및 재전송 작업 없음
실시간 스트리밍 서비스 등에 사용
서버와 클라이언트가 통신하기 위한 매개체, 소켓을 이용한 통신 프로그래밍
java.net 패키지를 통해 소켓 프로그래밍 지원
public void tcpServer() {
Scanner sc = new Scanner(System.in);
// 1. 서버에서 사용할 포트 번호 지정
// 0~65535 중 1개 사용
// 0~1000 사용중인 포트 번호가 많기 때문에
// 1000 이후의 번호를 사용
int port = 7777;
// 반환할 객체 미리 선언
// 서버에서 포트를 열기위한 개체
ServerSocket server = null;
// 데이터 주고 받기위한 보조 스트림
DataOutputStream dos = null;
DataInputStream dis = null;
try {
// 2. 서버 소켓 객체 생성
// 생성자 매개변수로 전달한 포트 번호가 열리면서 서버 대기상태
server = new ServerSocket(port);
// 이 시점에서 서버 준비 완료
System.out.println("[서버 준비 완료]");
System.out.println("클라이언트 접속 요청 대기 중 . . ... ");
// 3. server.accept() : 클라이언트 접속 요청 대기
// 4. 접속요청이 들어오면 수락해서 통신할 객체를 생성
Socket client = server.accept();
System.out.println("클라이언트 접속 완료");
// 연결을 기다리는 서버는 클라이언트가 소켓에
// 서버 아이디와 포트넘버를 담아 접속하면
// accept해서 소켓에 담는다
// 클라이언트 접속 완료
// 5. 데이터를 주고 받기 위한 스트림 추출
// (소켓안에 이미 스트림이 존재(양방향))
OutputStream out = client.getOutputStream();
InputStream in = client.getInputStream();
// 6. 보조스트림으로 성능개선
dos = new DataOutputStream(out);
dis = new DataInputStream(in);
// 7. 스트림을 통한 입력 및 출력
String clientMsg = dis.readUTF();
System.out.println(clientMsg);
// -------------------
System.out.print("클라이언트에게.. : ");
String serverMsg = sc.next();
dos.writeUTF(clientMsg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
dis.close();
dos.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void tcpClient() {
Scanner sc = new Scanner(System.in);
// 1. *서버* 아이피주소, 포트 번호 지정
String serverIP = "192.168.10.9"; // 자기자신ip호출(루프백)
int serverPort = 7777; //서버에서 사용하는 포트번호
// 자원반환에 필요한 객체 미리 선언
Socket socket = null;
DataOutputStream dos = null;
DataInputStream dis = null;
try {
// 2. 지정한 아이피와 포트로 소켓객체를 생성
// 서버에 요청을 보냄
socket = new Socket(serverIP, serverPort);
System.out.println("서버 접속 완료 !!");
// 3. 데이터를 주고받기 위한 스트림을 추출
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// 4. 보조스트림으로 성능개선
dos = new DataOutputStream(out);
dis = new DataInputStream(in);
// 5. 스트림을 통한 입력 및 출력
System.out.print("서버에 전송할 메시지 : ");
String sendMsg = sc.next();
dos.writeUTF(sendMsg);
// =================== 기본 송수신 끝
String serverMsg = dis.readUTF();
System.out.println(serverMsg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
socket.close();
dis.close();
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}