TCP, UDP 포로토콜

서현서현·2022년 4월 28일
0

서블릿 & JSP

목록 보기
8/26

TCP기반 소켓통신 프로그래밍

  • ServerSocket클래스와 Socket클래스를 알아야한다!

ServerSocket 클래스

  • 소켓이란? 두호스트간 통신을 하기 위한 양 끝단(end point)를 말한다
  • TCP소켓 통신을 하기 위해 ServerSocket클래스와 Socket 클래스 생성
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(7777); //파라미터는 포트번호
		System.out.println("서버가 접속을 기다립니다");
		
		// accept()메소드는 Client에서 연결요청이 올때까지 계속 기다린다
		// 연결요청이 오면 Socket객체를 생성해서 Client와 Socket과 여결
		Socket socket = server.accept();
		
		//--------------------------------------------------
		// 이 이후는 클라이언트와 연결된 후의 작업을 진행하면 된다
		System.out.println("접속한 클라이언트 정보");
		System.out.println("주소: "+socket.getInetAddress());
		
		// Client에 메세지 보내기
		// 접속한 Socket의 getOutputStream()을 이용하여 구한다.
		OutputStream out = socket.getOutputStream();
		
		ObjectOutputStream oos =new ObjectOutputStream(out); 
		// writeUTF메소드 쓰고싶어서 ObjectOutputStream으로 선언 
		// DataOutputStream(보조스트림도 사용ㄱㄴ. 적절한 사이즈로 자료형에 맞춰 ...)
		oos.writeUTF("어서오세요..."); //메세지 보내기
		System.out.println("메세지를 보냈습니다");
		
		oos.close();
		
		server.close();
	}

}

Socket 클래스

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.function.ObjIntConsumer;

public class ClientSocketTest {
	public static void main(String[] args) throws UnknownHostException, IOException {
		String serverIp = "127.0.0.1";
		// 자기자신 컴퓨터(로컬호스트)를 나타내는 방법
		// IP : 127.0.0.1
		// 호스트이름 : localhost
		
		
		System.out.println(serverIp+"서버에 접속중입니다....");
		//소켓을 생성해서 서버에 연결을 요청한다
		Socket socket = new Socket(serverIp,7777);
		
		//연결이 되면 이후의 명령이 실행된다
		System.out.println("연결되었습니다");
		
		// 서버에서 보내온 메시지 받기
		// 메세지를 받기위해 InputStream객체를 생성한다.
		// Socket의 getInputStream() 메서드 이용
		InputStream is = socket.getInputStream();
		ObjectInputStream ois = new ObjectInputStream(is);
		
		//서버로 부터 받은 메세지 출력하기
		System.out.println("받은 메세지: "+ois.readUTF());
		System.out.println("연결종료");
		
		ois.close();
	}

}

chat 예시

package kr.or.ddit.tcp;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(7777);
		System.out.println("서버가 접속을 기다립니다");
		
		//accept()메소드는 Client에서 연결요청이 올때까지 계속 기다린다
		// 연결요청잉 ㅗ면 Socket객체를 생성해서 Client와 Socket과 여결
		Socket socket = server.accept();
		
		//--------------------------------------------------
		// 이 이후는 클라이언트와 연결된 후의 작업을 진행하면 된다
		System.out.println("접속한 클라이언트 정보");
		System.out.println("주소: "+socket.getInetAddress());
		
		// Client에 메세지 보내기
		// 접속한 Socket의 getOutputStream()을 ㅣㅇ용하여 구한다.
		OutputStream out = socket.getOutputStream();
		
		ObjectOutputStream oos =new ObjectOutputStream(out);
		oos.writeUTF("어서오세요..."); //메세지 보내기
		System.out.println("메세지를 보냈습니다");
		
		oos.close();
		
		server.close();
	}

}
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.function.ObjIntConsumer;

public class ClientSocketTest {
	public static void main(String[] args) throws UnknownHostException, IOException {
		String serverIp = "127.0.0.1";
		// 자기자신 컴퓨터(로컬호스트)를 나타내는 방법
		// IP : 127.0.0.1
		// 호스트이름 : localhost
		
		
		System.out.println(serverIp+"서버에 접속중입니다....");
		//소켓을 생성해서 서버에 연결을 요청한다
		Socket socket = new Socket(serverIp,7777);
		
		//연결이 되면 이후의 명령이 실행된다
		System.out.println("연결되었습니다");
		
		// 서버에서 보내온 메시지 받기
		// 메세지를 받기위해 InputStream객체를 생성한다.
		// Socket의 getInputStream() 메서드 이용
		InputStream is = socket.getInputStream();
		ObjectInputStream ois = new ObjectInputStream(is);
		
		//서버로 부터 받은 메세지 출력하기
		System.out.println("받은 메세지: "+ois.readUTF());
		System.out.println("연결종료");
		
		ois.close();
	}

}
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

// 소켓을 통해 메세지를 보내는 역할을 담당하는 스레드
public class Sender extends Thread {
	private Scanner scan;
	private String name;
	private DataOutputStream dos;
	
	public Sender(Socket socket) {
		name = "["+socket.getInetAddress()+" : "
				+ socket.getLocalPort()+"]";
		scan = new Scanner(System.in);
		
		try {
			dos = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while(dos!=null) {
			
			try {
				dos.writeUTF(name+" >>> "+scan.nextLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

// 소켓에서 메세지를 받아서 화면에 출력하기 위한 스레드 클래스
public class Receiver extends Thread{
	private DataInputStream dis;
	
	public Receiver(Socket socket) {
		try {
			dis = new DataInputStream(socket.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while(dis != null) {
			try {
				System.out.println(dis.readUTF());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}

MultiChat 예시

TcpFileServer.java

TcpFileClient.java

UDP 기반 소켓통신 프로그래밍

  • DatagremSocket클래스와 DatagramPacket클래스가 필요하다

UDPServer

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class UdpServer {
	
	private DatagramSocket ds;
	private DatagramPacket dp;
	private byte[] msg; //패킷 송수신을 위한 바이트 배열 선언
	
	public UdpServer(int port) {
		try {
			ds = new DatagramSocket(port);
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	
	public void start() throws IOException {
		while(true) {
			// 데이터를 수신하기 위한 패킷을 생성한다
			msg = new byte[1];
			dp = new DatagramPacket(msg, msg.length);
			
			System.out.println("패킷 수신 대기중");
			
			// 패킷을 통해 데이터를 수신한다
			ds.receive(dp);
			
			System.out.println("패킷수신 완료");
			
			// 수신한 패킷으로부터 client의 ip주소와 port를 얻는다
			InetAddress iAddr = dp.getAddress();
			int port = dp.getPort();
			
			// 서버의 현재시간을 시분초 형태([hh:mm:ss])로 반환한다.
			SimpleDateFormat sdf = new SimpleDateFormat("[hh:mm:ss]");
			String time = sdf.format(new Date());
			msg = time.getBytes(); // 시간 문자열을 byte배열로 변환한다
			
			// 패킷을 생성해서 client에게 전송(send)한다
			dp = new DatagramPacket(msg, msg.length,iAddr,port);
			ds.send(dp); // 전송시작
		}
	}

}

UdpClient

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UdpClient {
	private DatagramSocket ds;
	private DatagramPacket dp;
	
	private byte[] msg; // 데이터가 저장될 공간으로 byte배열을 생성
	
	public UdpClient() {
		try {
			msg = new byte[100];

			// 소켓객체 생성(명시하지 않으면 포트번호는 이용가능한 임의의 포트번호로 할당됨)
			ds = new DatagramSocket();
			
			
		} catch (SocketException e) {
			e.printStackTrace();
		}
		
	}
	
	public void start() {
		try {
			InetAddress serverAddr = InetAddress.getByName("192.168.36.2");
			dp = new DatagramPacket(msg, 1, serverAddr, 7777);
			ds.send(dp); // 전송
			
			dp = new DatagramPacket(msg, msg.length);
			ds.receive(dp); // 수신
			
			System.out.println("현재 서버시간 => "+new String(dp.getData()));
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			ds.close();
		}
	}

}

UcpFileClient

UdpFileServer

0개의 댓글