[JAVA] Day 21 - Socket / Server / TCP / IP / UDP ํ”„๋กœํ† ์ฝœ

sueยท2023๋…„ 12์›” 12์ผ

๐Ÿ“’๊ตญ๋น„ํ•™์› [JAVA]

๋ชฉ๋ก ๋ณด๊ธฐ
20/20
post-thumbnail

Socketํ†ต์‹ 

: ๋„คํŠธ์›Œํฌ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ 

โ‘  ํด๋ผ์ด์–ธํŠธ <-> ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ๋ฐ ํ†ต์‹  ๋ฐฉ๋ฒ•
โ‘ก ์ผ๋ฐ˜์ ์œผ๋กœ TCP / UDP ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ
โ‘ข ์›น์„œ๋ฒ„ / ์ฑ„ํŒ… / ์˜จ๋ผ์ธ ๊ฒŒ์ž„ ๋“ฑ์— ์‚ฌ์šฉ (์ฃผ๋กœ ์†Œ์ผ“API & ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•จ)

1) ์„œ๋ฒ„(Server) - ํŠน์ • ํฌํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๊ธฐ๋‹ค๋ฆผ
2) ํด๋ผ์ด์–ธํŠธ(Client) - ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹œ๋„ / ์—ฐ๊ฒฐ ์„ฑ๊ณต์‹œ ์–‘์ชฝ๊ฐ„์˜ ํ†ต์‹  ์ด๋ฃจ์–ด์ง
3) ์„œ๋ฒ„ <-> ํด๋ผ์ด์–ธํŠธ (๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›์Œ)
4) ํ†ต์‹  ๋๋‚˜๋ฉด ์—ฐ๊ฒฐ ์ข…๋ฃŒ..

ํ”„๋กœํ† ์ฝœ (Protocol)

๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ (์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ํ†ต์‹ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด)

TCP (Transmission Control Protocol)

โ‘  ํ†ต์‹ ํ•˜๊ธฐ ์ „์— ์—ฐ๊ฒฐ ์„ค์ • ํ›„ ํ†ต์‹ ์™„๋ฃŒ๋˜๋ฉด ์—ฐ๊ฒฐํ•ด์ œ
โ‘ก ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก / ๋ฐ์ดํ„ฐ ์†์‹ค๋˜๋ฉด ์žฌ์ „์†ก ์š”์ฒญ (์‹ ๋ขฐ์„ฑ ์œ ์ง€)
โ‘ข ์†๋„ ์กฐ์ ˆ๊ฐ€๋Šฅ
โ‘ฃ (์—ฐ๊ฒฐ์œ ์ง€๊ฐ€ ์ค‘์š”ํ•œ) ํŒŒ์ผ์ „์†ก / ์ด๋ฉ”์ผ ์ „์†ก / ์›น ๋ธŒ๋ผ์šฐ์ง• = ์‹ ๋ขฐ์„ฑ ์ค‘์š”ํ•œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ

UDP (Transmission Control Protocol)

โ‘  ์—ฐ๊ฒฐ์ด๋‚˜ ์„ค์ • ์—†์ด ๋ฐ์ดํ„ฐ ์ฆ‰์‹œ ์†ก์ˆ˜์‹ 
โ‘ก ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ณ ๋‚˜์„  ํ™•์ธ ์•ˆํ•จ x / ์žฌ์ „์†กX / ์†์‹คํ—ˆ์šฉ
โ‘ข ์†๋„ ์กฐ์ ˆ ์ œ๊ณต X
โ‘ฃ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ / ๋™์˜์ƒ ์ „์†ก / DNS (๋„๋ฉ”์ธ์„ IP์ฃผ์†Œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ) ์™€ ๊ฐ™์€ ์‹ ์†ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์ค‘์š”ํ•œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ


๐Ÿ“Œ Note Code


  • Server ์„œ๋ฒ„ : ๋ฐ›์€ ๋ฌธ์ž๋ฅผ ๋˜๋Œ๋ ค์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ์„œ visual ํ•„์š”์—†์Œ
  • ServerSocket์€ 1๊ฐœ / Socket์€ ํด๋ผ์ด์–ธํŠธ ๊ฐœ์ˆ˜๋งŒํผ!
  • Aํ•œํ…Œ ๋‚ด์šฉ์„ ๋ฐ›์•˜๋‹ค๋ฉด B,Cํ•œํ…Œ๋งŒ ์ฃผ๋ฉด ๋จ (์ž๊ธฐ์ž์‹  X)
  • Socket ( SeverIP / ์ž๊ธฐ์ž์‹  IP / ServerPort / ๋ฉ”์„ธ์ง€)
  • Socket : ์†Œ์ผ“ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ณ  ์„œ๋ฒ„์— ๋„˜๊น€ / ๋ฐ˜๋“œ์‹œ ๋ฐ˜๋Œ€์ชฝ์—์„œ ์†Œ์ผ“์ด ์žˆ์–ด์•ผํ•จ
  • ์„œ๋ฒ„์†Œ์ผ“ + ์†Œ์ผ“์ด ๋งŒ๋‚˜์•ผ ํ†ต์‹ ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ธ๋ฐ, ์ด ๋•Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•  ๋•Œ๊นŒ์ง€ cpu๊ฐ€ ๋ฉˆ์ถฐ์žˆ๋Š”๊ฒƒ์„ = accept ์ด๋ผ๊ณ  ํ•จ
  • ์†Œ์ผ“์€ ์ดˆ๊ธฐํ™” ๋งˆ์ง€๋ง‰ ์‹œ์ผœ์ค˜์•ผํ•จ! (์•ˆ๊ทธ๋Ÿผ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์Œ)



1. Server / Client / ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•œ ์ฑ„ํŒ…์ฐฝ ๋งŒ๋“ค๊ธฐ

Test1 - [ServerTest]

๐Ÿ’ป ์ž…๋ ฅ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class ServerTest {

	private ArrayList<Socket> clients = new ArrayList<Socket>();

	public void serverStart() { // ์„œ๋ฒ„์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ

		try {

			ServerSocket ss = new ServerSocket(7777);
			System.out.println("์„œ๋ฒ„์‹œ์ž‘!");

			// ํด๋ผ์ด์–ธํŠธ ๋ช‡๋ช…์ ‘์†ํ• ์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ ๋ฐ˜๋ณต๋ฌธ
			while (true) {

				Socket sc = ss.accept(); // ํด๋ผ์ด์–ดํŠธ๊ฐ€ ์ ‘์†ํ• ๋•Œ๊นŒ์ง€ cpu๊ฐ€ ๋ฉˆ์ถค = block์ƒํƒœ

				// thread ๋งŒ๋“ค๊ธฐ
				WorkThread wt = new WorkThread(sc); // ์œ„์— socket sc(ํ˜„์žฌ์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ)๊ฐ€ new WorkThread();๋กœ ๋„˜์–ด์˜ด

				wt.start(); // ์•„๋ž˜ WorkThreadํด๋ž˜์Šค์—์„œ run์‹คํ–‰

			}

		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

	class WorkThread extends Thread { // ์Šค๋ ˆ๋“œ ์—ญํ• 

		private Socket sc; // ํ˜„์žฌ ์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ

		public WorkThread(Socket sc) { // ์˜ค๋ฒ„๋กœ๋”ฉ๋œ ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด์ƒ์„ฑ ํ•˜๊ฒ ์Œ
			this.sc = sc;
		}

		@Override
		public void run() {

			String msg = null;
			String ip = null;

			try {
            
				BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
				
                //ํŠน์ • ์†Œ์ผ“์˜ ์—ฐ๊ฒฐ๋œ ์ƒ๋Œ€๋ฐฉ ํ˜ธ์ŠคํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ๋ฌธ์ž์—ด ip๋กœ ๋ณ€ํ™˜
				ip = sc.getInetAddress().getHostAddress();

				clients.add(sc); // ํ˜„์žฌ ์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ - list์— ๋„ฃ์–ด๋‘ 

				// ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ‘์†์‚ฌ์‹ค์„ ์•Œ๋ฆผ
				msg = ip + "]๊ฐ€ ์ž…์žฅํ–ˆ์Šต๋‹ˆ๋‹ค";

				// ๋ฉ”์„ธ์ง€ ์ „๋‹ฌ
				while ((msg = br.readLine()) != null) {

					// ๊ทธ ๋ฉ”์„ธ์ง€ = ๋‚˜๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค
					for (Socket ss : clients) { // ํ•˜๋‚˜ ๊บผ๋ƒ„

						if (ss == sc) { // ํ•˜๋‚˜ ๊บผ๋ƒˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋‚˜์™€ ๊ฐ™์œผ๋ฉด
							continue; // ์ด๋ฒˆ๋งŒ ์ƒ๋žต
						}

						// PrintWriter ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์— ์“ฐ๋Š”๋ฐ ์‚ฌ์šฉ
						// getOutputStream() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์†Œ์ผ“์˜ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์–ป์Œ
						// ์ด ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์ผ“์„ ํ†ตํ•ด ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
						PrintWriter pw = new PrintWriter(ss.getOutputStream(), true); // true๊ฐ€ ์ž๋™์œผ๋กœ ๋‚ด๋ณด๋‚ด์ง, false๊ฐ€ ์žˆ์œผ๋ฉด
																						// ์ˆ˜๋™์œผ๋กœ ๋ณด๋‚ด์ง
						pw.println(msg);

					}

					// ์„œ๋ฒ„์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ง(๊ฐ์‹œ) ์ž‘์—…

					System.out.println(msg);

				}

			} catch (Exception e) {

				msg = ip + "]๊ฐ€ ํ‡ด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.";

				try {
					for (Socket ss : clients) {

						if (ss == sc) {
							continue;
						}
						PrintWriter pw = new PrintWriter(ss.getOutputStream(), true);
						pw.println(msg);

					}

					System.out.println(msg);
					sc = null; // ํ•ด๋‹น ์†Œ์ผ“์€ ์ดˆ๊ธฐํ™” ํ•„์ˆ˜
				} catch (Exception e2) {
				}
			}
		}
	}
	public static void main(String[] args) {

		new ServerTest().serverStart();
	}

๐Ÿ’ป ์ž…๋ ฅ -[ ClientTest ]

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

//Client (์„œ๋ฒ„์†Œ์ผ“ ํ•„์š” x)

//์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ

public class ClientTest extends Frame implements ActionListener, Runnable { //๋‹ค์ค‘์ƒ์†

	private static final long serialVersionUID = 1L;

	private TextArea ta = new TextArea();
	private TextField tf = new TextField();
	private Socket sc = null;
	private int port = 7777; //์ฐพ์•„๊ฐ€๋Š” ํฌํŠธ 
	private String host = "192.168.16.0"; //http://localhost = ๋ฃจํ”„๋ฐฑ์ฃผ์†Œ127.0.0.1 = ๋„คํŠธ์›Œํฌ์—์„œ์˜ me = ์ž๊ธฐ์ž์‹ ์„œ๋ฒ„์˜ IP
	
	public ClientTest() {
		
		add(ta,BorderLayout.CENTER);
		add(tf,BorderLayout.SOUTH);
		
		tf.addActionListener(this);
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	
		setTitle("์ฑ„ํŒ… ํด๋ผ์ด์–ธํŠธ");
		setSize(300,400);
		setVisible(true);
		
	}
	
	
	public static void main(String[] args) {

		new ClientTest().connect();
	}

	@Override
	//์ƒ๋Œ€ํŽธ์ด ๋ณด๋‚ด๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ 
	public void run() { 
		
		
		String str;

		try {

			if (sc == null) { // ๋ฐ์ดํ„ฐ ์—†์œผ๋ฉด
				return;
			}

			InputStream is = sc.getInputStream(); // ๋นจ๋Œ€ ๊ฝ‚๊ธฐ
			BufferedReader br = new BufferedReader(new InputStreamReader(is)); // ์ƒ๋Œ€๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ

			// ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ (๋ช‡๊ธ€์ž์ธ์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ)
			while ((str = br.readLine()) != null) {
				ta.append("\r\n" + str);
			}

		} catch (Exception e) {
			ta.append("\r\n ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ข…๋ฃŒ");

			// ์†Œ์ผ“์€ ์ดˆ๊ธฐํ™” ๊ผญ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค˜์•ผํ•จ.
			// ์•ˆ๊ทธ๋Ÿผ ๋‹ค์Œ๋ฒˆ์— ์—ฐ๊ฒฐํ• ๋•Œ ์ž”์—ฌ์“ฐ๋ ˆ๊ธฐ๊ฐ’์œผ๋กœ ์ธํ•ด ์—ฐ๊ฒฐ๋ถˆ๊ฐ€
			sc = null;
		}

	}

	@Override
	// ๋‚ด๊ฐ€ ๋ณด๋‚ด๋Š” ๋ฉ”์„ธ์ง€
	public void actionPerformed(ActionEvent e) { 
		
		String str = tf.getText();
		
		if(str.trim().equals("")) { //์–‘์ชฝ ๋น„๊ตํ–ˆ์„ ๋•Œ ์–‘์ชฝ ๊ณต๋ฐฑ์ด null์ด๋ƒ?
			return;
		}
		
		
		if(sc==null) {
			return;
		}
		
		try {
			
			//๋‚ด๋ณด๋‚ผ๋•Œ๋Š” OutputStream
			
			OutputStream os = sc. getOutputStream();
			
			//PrintWriter pw = new PrintWriter(sc. getOutputStream());
			PrintWriter pw = new PrintWriter(os,true); //true =  auto - flush (์ž๋™์œผ๋กœ ๋‚จ์•„์žˆ๋Š”๊ฒƒ๋“ค๋„ ์ถœ๋ ฅ๋จ)
			
			pw.println("์ˆ˜์ธ] "+str); //์—”ํ„ฐ ๊ผญ - ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” ๋ฉ”์„ธ์ง€
			
			ta.append("\r\n์ˆ˜์ธ] "+str); //์ž์‹ ์˜ ์ฐฝ์— ๋„์›€
			tf.setText("");
			tf.requestFocus();
			
			
			
		} catch (Exception e2) {
			ta.append("\r\n ์„œ๋ฒ„์™€ ์ ‘์†์ด ๋Š๊ฒผ์Šต๋‹ˆ๋‹ค.");
			sc = null;
		}
	}

	public void connect() {
		
		try {
			//์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ(ํฌํŠธ๋ฒˆํ˜ธ 7777)
			sc = new Socket(host,port); //client socket์ด ๋งŒ๋“ค์–ด์ ธ์„œ server์™€๋„ ์—ฐ๊ฒฐ์ด ๋จ
			
			
			Thread th = new Thread(this);
			
			th.start();
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
}


๐Ÿ’ก **์ถœ๋ ฅ**
[์„œ๋ฒ„ ์‹œ์ž‘!] - [ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ์—ด์–ด์„œ ๋Œ€ํ™”ํ•˜๊ธฐ]



๐Ÿ“Œ Note Code


  • implements Serializable : ์ง๋ ฌํ™”ํ• ๋•Œ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ!



2. File(๋ฐ์ดํ„ฐ) /Server / Client / ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•œ ์ฑ„ํŒ…์ฐฝ ๋งŒ๋“ค๊ธฐ

Test2 - [FileServer]

๐Ÿ’ป ์ž…๋ ฅ

import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {

	class WorkThread extends Thread {

		private Socket sc = null;

		public WorkThread(Socket sc) {
			this.sc = sc;
		}

		@Override
		public void run() {

			try {

				// ํด๋ผ์ด์–ธํŠธ ์ ‘์†์™„๋ฃŒ
				ObjectInputStream ois = // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Œ
						new ObjectInputStream(sc.getInputStream());

				System.out.println("ํด๋ผ์ด์–ธํŠธ ์ ‘์†!!");

				FileOutputStream fos = null;
				Object ob = null;

				while ((ob = ois.readObject()) != null) {

					if (ob instanceof FileInfo) {

						FileInfo info = (FileInfo) ob; // downcasting

						if (info.getCode() == 100) {

							String str = new String(info.getData());// ํŒŒ์ผ๋ช…
							fos = new FileOutputStream(str); // ํŒŒ์ผ ๋งŒ๋“ฆ = fileoutputstream
							System.out.println(str + "ํŒŒ์ผ ์ „์†ก ์‹œ์ž‘!!");

						} else if (info.getCode() == 110) { // ๋ฐ์ดํ„ฐ์ „์†ก

							if (fos == null) {
								break;
							}
							fos.write(info.getData(), 0, info.getSize());
							// ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ 0๋ถ€ํ„ฐ getsize๊นŒ์ง€ ์ฝ์–ด์„œ ๋ฐ์ดํ„ฐ์— ์ €์žฅ

							System.out.println(info.getSize() + "bytes ๋ฐ›๋Š” ์ค‘!!");

						} else if (info.getCode() == 200) {

							String str = new String(info.getData());// ํŒŒ์ผ๋ช…
							fos.close();
							System.out.println(str + "ํŒŒ์ผ ์ „์†ก ์ข…๋ฃŒ!!");

						}

					}
				}
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}
	}

	public void serverStart() {

		try {

			ServerSocket ss = new ServerSocket(7777);
			System.out.println("ํด๋ผ์ด์–ธํŠธ ์ ‘์†๋Œ€๊ธฐ์ค‘...");

			Socket sc = ss.accept();

			WorkThread wt = new WorkThread(sc);
			wt.start();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

	public static void main(String[] args) {

		new FileServer().serverStart();
	}
}

๐Ÿ’ป ์ž…๋ ฅ -[ ClientTest ]


import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class FileClient {

	public static void main(String[] args) {

		int port = 7777;
		String host = "127.0.0.1";
		Socket sc = null;

		// ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋ƒ„

		ObjectOutputStream oos = null;

		Scanner scn = new Scanner(System.in);

		String path; // ํŒŒ์ผ์„ ๋‹ด๋Š” ๋ณ€์ˆ˜

		try {
			System.out.println("์ „์†กํ•  ํŒŒ์ผ๋ช… ๋ฐ ๊ฒฝ๋กœ? : ");
			path = scn.next();

			File f = new File(path); // f์•ˆ์— ๊ฒฝ๋กœ์ •๋ณด ๋‹ด๊ฒจ์ ธ์žˆ์Œ

			if (!f.exists()) {
				System.out.println("ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค!");
				System.exit(0); // ์ฝ˜์†”ํ”„๋กœ๊ทธ๋žจ์ด๊ธฐ๋•Œ๋ฌธ์— exit
			}

			// ์„œ๋ฒ„์—ฐ๊ฒฐ
			sc = new Socket(host, port);

			oos = new ObjectOutputStream(sc.getOutputStream());
			// getInputStream() - ํŒŒ์ผ์„œ๋ฒ„์—์„œ ์ธํ’‹์œผ๋กœ ๋ฐ›์•˜์œผ๋‹ˆ ์•„์›ƒํ’‹์œผ๋กœ ๋ฑ‰๊ธฐ
			oos.flush();

			// ํŒŒ์ผ ์ „์†ก ์‹œ์ž‘์„ ์•Œ๋ฆผ
			FileInfo info;

			info = new FileInfo();
			info.setCode(100);
			// ๋ฐ์ดํ„ฐ์—๋Š” ํŒŒ์ผ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€์žˆ์Œ
			info.setData(f.getName().getBytes()); // setData = charํƒ€์ž… + .getBytes()๋ถ™์—ฌ์•ผํ•จ
			info.setSize((int) f.length());

			// ์œ„์— ๋‹ด์•„๋†“์€ ๋ฐ์ดํ„ฐ๋ฅผ oos๋ฅผ ํ†ตํ•ด writeObject๋กœ ๋ณด๋ƒ„
			// ๋ฐ์ดํ„ฐ ๋ณด๋ƒ„!!!
			oos.writeObject(info);
			System.out.println(f.getName() + "ํŒŒ์ผ์ „์†ก ์‹œ์ž‘!");

			Thread.sleep(300);

			// ํŒŒ์ผ๋‚ด์šฉ์ „์†ก (ํŒŒ์ผ์„ ์ฝ์–ด์•ผํ•จ)
			FileInputStream fis = new FileInputStream(f);

			int data = 0;
			byte[] buffer = new byte[1024];

			while ((data = fis.read(buffer, 0, 1024)) != -1) {

				// ๋‚ด์šฉ๋ณด๋ƒ„
				info = new FileInfo();

				info.setCode(110);
				info.setSize(data);
				info.setData(buffer);

				oos.writeObject(info);

				System.out.println(data + "bytes ์ „์†ก์ค‘,,,");

				buffer = new byte[1024]; // ์œ„์„ธใ…“ buffer ์“ฐ๊ณ  ๋์ด์ง€๋งŒ ๋‹ค์‹œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ฆ์œผ๋กœ์จ
				// ์ƒˆ๋กญ๊ฒŒ buffer๋งŒ๋“ค๊ธฐ

				Thread.sleep(300);

			}
			fis.close();

			// ํŒŒ์ผ ์ „์†ก ์ข…๋ฃŒ
			info = new FileInfo();
			info.setCode(200);
			info.setData(f.getName().getBytes());
			info.setSize((int) f.length());

			oos.writeObject(info);

			System.out.println(f.getName() + "ํŒŒ์ผ์ „์†ก ์ข…๋ฃŒ,,,");

			Thread.sleep(300);

			oos.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
}

๐Ÿ’ป ์ž…๋ ฅ -[ FileInfo ]


import java.io.Serializable;

public class FileInfo implements Serializable {

	private static final long serialVersionUID = 1L;

	/*
	 * code : ์›น์—์„œ ํŒจ์น˜ํ• ๋•Œ 404, 200 http ์ƒํƒœ์ฝ”๋“œ๋กœ ์•Œ๊ธฐ ๋•Œ๋ฌธ 100 : ํŒŒ์ผ์ „์†ก ์‹œ์ž‘ (ํŒŒ์ผ๋ช… ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ์ „์†ก) 110 :
	 * ํŒŒ์ผ๋‚ด์šฉ ์ „์†ก -> ์—ฌ๋Ÿฌ๋ฒˆ ๋ณด๋‚ด๋‹ˆ๊นŒ ๋ฐ˜๋ณต 200 : ํŒŒ์ผ์ „์†ก ์ข…๋ฃŒ (ํŒŒ์ผ๋ช… ๋๋‚ฌ๋‹ค๊ณ  ์ „์†ก)
	 * 
	 * size: ํŒŒ์ผํฌ๊ธฐ data: ํŒŒ์ผ๋‚ด์šฉ
	 */

	private int code;
	private int size;
	private byte[] data = new byte[1024]; // = buffer

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}

	public byte[] getData() {
		return data;
	}

	public void setData(byte[] data) {
		this.data = data;
	}
}


๐Ÿ’ก **์ถœ๋ ฅ**
์ „์†กํ•  ํŒŒ์ผ๋ช… ๋ฐ ๊ฒฝ๋กœ? : 
c:\\Windows\\bootstat.dat

ํด๋ผ์ด์–ธํŠธ ์ ‘์†๋Œ€๊ธฐ์ค‘...
ํด๋ผ์ด์–ธํŠธ ์ ‘์†!!
bootstat.datํŒŒ์ผ ์ „์†ก ์‹œ์ž‘!!
1024bytes ๋ฐ›๋Š” ์ค‘!!
1024bytes ๋ฐ›๋Š” ์ค‘!!
1024bytes ๋ฐ›๋Š” ์ค‘!!
1024bytes ๋ฐ›๋Š” ์ค‘!!
1024bytes ๋ฐ›๋Š” ์ค‘!!
.
.
.
bootstat.datํŒŒ์ผ ์ „์†ก ์ข…๋ฃŒ!!



๐Ÿ“Œ Note Code


  • ์ปดํ“จํ„ฐ๋“ค์ด ์„œ๋กœ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™

  • ์ง€๊ธˆ๊นŒ์ง€ ํ–ˆ๋˜ main ํ”„๋กœํ† ์ฝœ (์ธํ„ฐ๋„ท ํ‘œ์ค€)
    : TCP(ํŠธ๋ž™ ๊ฒ€์‚ฌ & ๋งˆ์ง€๋ง‰๊ณผ ์ฒ˜์Œ๊ฐ’์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€์ง€ ๊ฒ€์ฆ) / IP

  • (์ธํŠธ๋ผ๋„ท ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ)
    : UDP(๊ฐ€๊นŒ์šด๊ฑฐ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ ๋ณด๋‚ผ ๋•Œ ) / ๋ณด๋ƒˆ๋Š”์ง€ ๊ด€์‹ฌ์—†์Œ X

  • D Class : 224.0.0.0~239.255.255.255 / ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด ip class ์„œ์น˜

  • ๋ฐ์ดํ„ฐ๊ทธ๋žจ
    : DatagramSocket(์—ฌ๋Ÿฌ ip์ฃผ์†Œ, ๋ฉ”์„ธ์ง€ ๋“ฑ๋“ฑ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ์†Œ์ผ“) / DatagramPacket = ์ƒ๋Œ€ํŽธ์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ



3. TCP / IP / UDP [ํ†ต์‹ ๊ทœ์น™]

Test3

๐Ÿ’ป ์ž…๋ ฅ


import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

//์ปดํ“จํ„ฐ๋“ค์ด ์„œ๋กœ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™ (TCP / IP / UDP)
public class ChatCS extends Frame implements Runnable, ActionListener {

	private static final long serialVersionUID = 1L;
    
    // ๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ์ „์†ก
	private MulticastSocket ms = null;
	private InetAddress xGroup = null;

	private String host = "230.0.0.5";
	private int port = 7777;
	private String userName = "์ˆ˜";

	private TextArea ta = new TextArea();
	private TextField tf = new TextField();

	public ChatCS() {

		ta.setEnabled(false);// ์ž…๋ ฅ์ฐฝ ์™ธ์—๋Š” ํƒ€์ดํ•‘ ๋ชป์น˜๊ฒŒํ•˜๋Š” ๋Šฅ๋ ฅ
		add(ta, BorderLayout.CENTER);

		add(tf, BorderLayout.SOUTH); // ์ฑ„ํŒ…์ฐฝ
		tf.addActionListener(this);

		addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);

			}

		});

		setTitle("๊ทธ๋ฃน์ฑ„ํŒ…[" + host + "]");
		setSize(400, 400);
		setVisible(true);
		tf.requestFocus();
	}

	public void setup() { // ๋ฉ€ํ‹ฐ์บ์ŠคํŒ… ํ•˜๊ธฐ์œ„ํ•œ ์กฐ๊ฑด

		try {
			xGroup = InetAddress.getByName(host); // host์ฃผ์†Œ๋กœ ์ ‘์†ํ•œ ์‚ฌ๋žŒ๋“ค ๊ทธ๋ฃน 230.0.0.1
			ms = new MulticastSocket(port); // ๋ฉ€ํ‹ฐ ์†Œ์ผ“ 7777

			ms.joinGroup(xGroup);// ์œ„์— ๋‘๊ฐœ ์ถฉ์กฑํ•˜๋Š” ์‚ฌ๋žŒ ๋ชจ์—ฌ๋ผ

			Thread th = new Thread(this);
			th.start();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

	// ์—ฐ๊ฒฐ์ด ๋Š๊ฒผ์„ ๋•Œ
	public void disConnection() {

		try {

			ms.leaveGroup(xGroup);
			ms.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

	public static void main(String[] args) {
		new ChatCS().setup();

	}

	@Override
	public void actionPerformed(ActionEvent e) {

		String str = tf.getText().trim();

		if (str.equals("")) {//๋ฉ”์„ธ์ง€ ๋ฐ์ดํ„ฐ X
			return;
		}

		byte[] buffer = (userName + "]" + str).getBytes(); // byte[] buffer = ๋ฐ”์ดํŠธ ํƒ€์ž… , (userName+"]"+str) ์ŠคํŠธ๋ง์ด๋ฏ€๋กœ char๋กท
															// ๋ฐ”๊ฟ”์•ผํ•จ

		try {

			DatagramPacket dp = new DatagramPacket(buffer, buffer.length, xGroup, port);//ํ•ด๋‹นํŒจํ‚ท : ๊ทธ๋ฃน ์ฃผ์†Œ (xGroup) , ํฌํŠธ ๋ฒˆํ˜ธ (port)

			ms.send(dp); // ๋ฐ์ดํ„ฐ๋ณด๋‚ด๊ณ 
			tf.setText("");// ์ดˆ๊ธฐํ™” ์ •๋ฆฌ
			tf.requestFocus();

		} catch (Exception e2) {
			System.out.println(e2.toString());
		}

	}

	@Override
	public void run() {

		try {

			while (true) {
				byte[] buffer = new byte[512];

				DatagramPacket dp = new DatagramPacket(buffer, buffer.length);

				ms.receive(dp);
				String str = new String(dp.getData()).trim();

				ta.append(str + "\r\n");

			}

		} catch (Exception e) {
			System.out.println(e.toString());
			disConnection();

		}

	}

}


๐Ÿ’ก **์ถœ๋ ฅ**
[๊ฐ™์€ IP์ฃผ์†Œ ๊ณต์œ ํ•œ ์‚ฌ๋žŒ๋ผ๋ฆฌ - ๊ทธ๋ฃน์ฑ„ํŒ… ๊ฐ€๋Šฅ]


0๊ฐœ์˜ ๋Œ“๊ธ€