- TCP
- 1:1 통신방식
- 연결지향
- 상대방이 데이터를 잘 전달받았는지 확인하는 과정을 거침 -> 데이터 전송에 신뢰성 보장
- 스트림 방식으로 데이터를 주고받음
- 서버를 먼저 실행한 후 클라이언트를 실행
- 통화에 비유할 수 있음 -> 실시간 대화 방식
- Server
public class Server {
public static void main(String[] args) {
try {
//서버 소켓 생성
ServerSocket serverSocket = new ServerSocket(6789); //포트 번호 지정
System.out.println("[====서버 6789포트에서 시작====]");
while (true) {
Socket s = serverSocket.accept();
//수신 코드
InputStream is = s.getInputStream();
Scanner sc = new Scanner(is); //Scanner: 2Byte 처리
System.out.println("[클라이언트 메세지 : " + sc.nextLine() + "]");
//클라이언트로 응답 전송
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.print("클라이언트 어서오고~\n"); //보낼 메세지
ps.flush(); //버퍼의 데이터를 한번에 보냄
//클라이언트 간 연결만 해제, 서버는 살아있음
s.close();
System.out.println("[===서버-클라이언트 연결 해제===]");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- Client
public class Client {
public static void main(String[] args) throws Exception{
//서버 접속
Socket s = new Socket("localhost", 6789);
System.out.println("[===클라이언트-서버 접속===]");
//송신 코드
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.print("서버 어서오고~\n");
ps.flush();
//수신 코드
InputStream is = s.getInputStream();
Scanner sc = new Scanner(is);
System.out.println("[서버의 메세지 : " + sc.nextLine() + "]");
//서버와 연결 해제
s.close();
System.out.println("[===서버-클라이언트 접속 해제===]");
}
}
- UDP
- 1:1, 1:다, 다:다 통신방식
- 내용만 보내는 것이 아닌 보내는 사람, 받는 사람을 명시하여 통신
- 비연결지향
- 데이터 전송에 신뢰성이 없음 -> 데이터를 순서대로 보낸다는 보장이 없음
- DatagramPacket, DatagramSocket을 사용
- Server
public class Server {
public void start() throws IOException{
// 6789번을 사용하는 소켓 생성
DatagramSocket socket = new DatagramSocket(6789);
DatagramPacket inPacket, outPacket;
byte[] inMessage = new byte[10];
byte[] outMessage;
while(true) {
//데이터 수신을 위한 패킷 생성
inPacket = new DatagramPacket(inMessage, inMessage.length);
socket.receive(inPacket); //패키을 통해 데이터 수신
//수신한 패킷에서 클라이언트의 IP 주소와 Port 를 얻음
InetAddress address = inPacket.getAddress();
int port = inPacket.getPort();
//서버의 현재 시간 포맷을 설정 및 반환
SimpleDateFormat simple = new SimpleDateFormat("[hh:mm:ss]");
String time = simple.format(new Date());
outMessage = time.getBytes();
//패킷 생성 후 클라이언트에게 송신
outPacket = new DatagramPacket(outMessage, outMessage.length, address, port);
socket.send(outPacket);
}
}
public static void main(String[] args) {
try {
//UDP 서버 시작
new Server().start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- Client
public class Client {
public void start() throws IOException, UnknownHostException {
DatagramSocket datagramSocket = new DatagramSocket();
InetAddress serverAddr = InetAddress.getByName("127.0.0.1");
//데이터가 저장될 공간으로 임의로 지정한 크기의 byte 배열을 생성
byte[] message = new byte[200];
DatagramPacket outPacket = new DatagramPacket(message, 1, serverAddr, 6789);
DatagramPacket inPacket = new DatagramPacket(message, message.length);
//데이터그램패킷 송신
datagramSocket.send(outPacket);
//데이터그램패킷 수신
datagramSocket.receive(inPacket);
System.out.println("현재 시간 : " + new String(inPacket.getData()));
datagramSocket.close();
}
public static void main(String[] args) {
try {
new Client().start();
} catch (IOException e){
e.printStackTrace();
}
}
}
GitHub - Pearlmoon997/Socket: 자바 소켓 프로그래밍
자바 소켓 프로그래밍. Contribute to Pearlmoon997/Socket development by creating an account on GitHub.
github.com
'Java_ 소켓' 카테고리의 다른 글
Java_ 채팅, 스레드 (0) | 2022.10.20 |
---|---|
소켓 프로그래밍_ 기초 (0) | 2022.10.01 |
소켓 프로그래밍 (0) | 2022.09.29 |