20240826수업
InetAddress
IP 주소를 다루기 위한 클래스. 주로 네트워크 프로그래밍에서 사용
명령 프롬프트 앱을 열어서 ipconfig/all을 입력하면 무선 LAN 어댑터 Wi-Fi에서 mac주소(물리적 주소)와 ip내부주소(IPv4 주소,본인 컴퓨터)를 알 수 있다.
인터넷 주소:192.168.0.9
- local : 나
- remote:상대방
- host:컴퓨터
- server:서버-자료를 제공하는 컴
- client:클라이언트-자료를 요청하는 컴
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest {
public static void main(String[] args) {
try {
//win+r:cmd -> ipconfig/all로 확인가능
InetAddress local = InetAddress.getLocalHost(); // 내 컴퓨터의 정보를 가져와서 내컴퓨터에 담는것를 의미함
System.out.println("내 아이피 주소: " + local.getHostAddress());
//IPv4주소:192.168.100.133(기본설정)
//win+r:cmd -> nslookup daum.net
System.out.println("다음의 ip 주소목록");
InetAddress[] ia = InetAddress.getAllByName("daum.net");
for (InetAddress inetAddress : ia) {
System.out.println(inetAddress);
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
참고하면 좋은 글
https://yozm.wishket.com/magazine/detail/1956/
InetSocketAddress
- TCP 통신의 개념
TCP(Transmission Control Protocol)는 신뢰성 있는 데이터 전송을 제공하는 프로토콜입니다. 데이터가 전송되는 동안 오류 검사, 재전송, 순서 보장을 통해 데이터가 정확하게 전달되도록 합니다. - 구조
서버: 클라이언트의 요청을 기다리고, 연결이 수립되면 데이터를 처리합니다.
클라이언트: 서버에 연결 요청을 하고, 데이터를 송신하거나 수신합니다. - 통신 과정
1.서버 소켓 생성
○ 서버는 특정 포트 번호를 바인딩하여 클라이언트의 연결 요청을 기다립니다.
이때, 포트넘버의제한은 아래와 같습니다.
*0~65535(64kbyte)
*0~1023:well known 사용금지
*6000~6500:hardware용 ex)임베디드, 비디오카드
*45000번 이상 사용x
○ 예: ServerSocket serverSocket = new ServerSocket(15000);
2.클라이언트 연결 요청
○ 클라이언트는 서버에 연결 요청을 합니다.
○ 예: socket.connect(new InetSocketAddress("서버_IP", 15000));
3.연결 수립
○서버는 accept() 메서드를 사용하여 클라이언트의 연결을 수락합니다. 이때 새로운 소켓 객체가 생성되어 클라이언트와의 통신을 담당합니다.
4.데이터 송신 및 수신
○ 서버: InputStream을 통해 클라이언트로부터 데이터를 수신하고, OutputStream을 사용하여 클라이언트에게 응답합니다.
○ 클라이언트: OutputStream을 통해 서버에 데이터를 송신하고, InputStream을 통해 서버의 응답을 수신합니다.
5. 연결 종료
데이터 송수신이 완료되면 각 측에서 소켓을 닫아 연결을 종료합니다. - 예제
0~65535(64kbyte)
0~1023:well known 사용금지
6000~6500:hardware용 ex)임베디드, 비디오카드
45000번 이상 사용x
0~65535(64kbyte)
0~1023:well known 사용금지
6000~6500:hardware용 ex)임베디드, 비디오카드
45000번 이상 사용x
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(15000)); // 15000번 포트를 통신
//소켓(Socket)과 포트 번호를 결합(bind)한다
//자바는listen문법이 없다
//대신 while뭉르 돌려서 바로accept로 감
while (true) {
System.out.println("연결을 기다림");
Socket socket = serverSocket.accept();//전화를 받는다
InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println("[연결 수락됨]" + isa.getHostName() + isa.getAddress());
// data 수신
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];//byte배열
int readByteCount = is.read(bytes);//받은 바이트가
// byte [] -> String
String msg = new String(bytes, 0, readByteCount, "UTF-8");//읽어들인 byte값을 utf-8로 받아서 문자열로 바꿈
System.out.println(msg);
// data 송신
OutputStream os = socket.getOutputStream();
msg = "애옹";
// String -> byte[];
bytes = msg.getBytes("UTF-8");
os.write(bytes); // 클라이언트에 내보낸다
os.flush(); // 버퍼에 남아있는 데이터를 전부 내보내어 clear 한다
System.out.println("서버도 보낸다");
is.close();
os.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
// 서버 소켓 close
if (!serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
server의 코드
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class TestClient {
//TCP방식
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket();
System.out.println("[서버에 연결 요청]");
InetSocketAddress isa = new InetSocketAddress("192.168.100.133", 15000);// 15000번 포트를 충전
socket.connect(isa); //전화를 건다
System.out.println("[서버에 연결 성공]");
// 서버에 data 보내기
byte[] bytes = null;
OutputStream os = socket.getOutputStream(); //os:byte data를 보내는 통로
String msg = "애옹";
bytes = msg.getBytes(); //문자열을 byte배열로 바꾼다
os.write(bytes);
os.flush(); //버퍼에 남아있는 데이터를 보내라(서버로)
System.out.println("[데이터를 서버에 보냈습니다]");
// 서버에서 data 받기
InputStream is = socket.getInputStream();
bytes = new byte[1024];
int readBytesCount = is.read(bytes);
msg = new String(bytes, 0, readBytesCount, "UTF-8");
System.out.println("서버가 보낸거:" + msg);
is.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
client의 코드
- 예제 요약
☞클라이언트가 "애옹"이라는 메시지를 서버에 전송.
☞ 서버는 이 메시지를 수신하고, 다시 "애옹"이라는 응답을 클라이언트에 전송.
☞ 클라이언트는 서버로부터 응답을 받고 출력합니다.
참고
tcp 4계층
https://carnival.tistory.com/58
socket 프로그래밍
1. tcp 방식
https://recipes4dev.tistory.com/153#google_vignette
2. udp 방식
https://sharpcoder.tistory.com/34
'JAVA' 카테고리의 다른 글
[java] 클래스 활용 (1) | 2024.10.10 |
---|---|
[java]접근제어자 (0) | 2024.08.26 |
[java]Thread(스레드) (0) | 2024.08.26 |
[java] 외부파일을 읽어서 출력하기(FileReader,BufferedReader,FileWriter,BufferedWriter) (0) | 2024.08.24 |
[java]Collection Framework (3) | 2024.08.22 |