๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป/JAVA

(38) [JAVA] 22์ผ

by ๋”ฐ๊ถˆ 2024. 4. 10.

 

package ch16.unit02;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ServerChat extends JFrame implements ActionListener, Runnable {

    private static final long serialVersionUID = 1L;

    private JTextField tf = new JTextField();
    private JTextArea ta = new JTextArea();

    private ServerSocket ss = null;
    private int port = 8000;
    private Socket sc = null;

    public ServerChat() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ta.setEditable(false);
        JScrollPane sp = new JScrollPane(ta);
        add(sp, BorderLayout.CENTER);

        tf.addActionListener(this);
        add(tf, BorderLayout.SOUTH);

        setTitle("์ฑ„ํŒ…");
        setSize(500, 500);
        setResizable(false);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == tf) {
            String s = tf.getText().trim();

            if (s.length() == 0) {
                return;
            }
            try {
                if (sc != null) {
                    PrintStream out = new PrintStream(sc.getOutputStream());
                    out.println("์„œ๋ฒ„->" + s);
                    out.flush();
                    ta.append("๋‚˜->" + s + "\n");
                    tf.setText("");
                    tf.requestFocus();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ServerChat serverChat = new ServerChat();
        serverChat.serverStart();
    }

    public void serverStart() {
        try {
            ss = new ServerSocket(port);
            ta.setText("์„œ๋ฒ„ ์‹œ์ž‘\n");
            sc = ss.accept();
            Thread t = new Thread(this);
            t.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        String str;
        String ip = null;

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
            ip = sc.getInetAddress().getHostAddress();
            ta.append("[" + ip + "] ์ ‘์†\n");

            while ((str = br.readLine()) != null) {
                ta.append(str + "\n");
                ta.setCaretPosition(ta.getDocument().getLength());
            }
        } catch (IOException e) {
            str = "[" + ip + "] ๋‹˜์ด ํ‡ด์žฅ ํ–ˆ์Šต๋‹ˆ๋‹ค.";
            ta.append(str + "\n");
            sc = null;
        }
    }
}

 

 

package ch16.unit02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

//1:๋‹ค ์ฑ„ํŒ…
public class ServerChat2 {
	private Vector<Socket> client=new Vector<Socket>();
	private ServerSocket ss=null;
	private int port=8000;
	
	public ServerChat2() {
		
	}
	
	// ๋‚ด๋ถ€ ํด๋ž˜์Šค 
	class WorkerThread extends Thread{
		private Socket sc=null;
		
		public WorkerThread(Socket sc) {
			this.sc=sc; // ์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ„ 
			
		}
		
		//๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ 
		public void sendMsg(String msg) {
			for(Socket s:client) {
				
				try {
					if(s==sc) {
						continue;
					}
					
					//๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ 
					
					PrintStream ps=new PrintStream(s.getOutputStream());
					ps.println(msg);
					
				} catch (Exception e) {
				}
			}
		}
		
		
		@Override
		public void run() {
			String ip=null;
			String msg=null;
			
			try {
				//์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ(์ˆ˜์‹ ์šฉ)
				BufferedReader br=new BufferedReader(new InputStreamReader(sc.getInputStream()));
				
				ip=sc.getInetAddress().getHostAddress();
			
				//ํด๋ผ์ด์–ธํŠธ์˜ ์†Œ์ผ“์„ ๋ฐฑํ„ฐ์— ์ €์žฅ
				client.add(sc);
				
				//๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ‘์† ์‚ฌ์‹ค์„ ์•Œ๋ฆผ
				 msg="["+ip+"]์ž…์žฅ..ServerChat2.";
				 sendMsg(msg);
				 
				 System.out.println(msg);
				 
				 //ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์ •๋ณด ๋ฐ›๊ธฐ
				 while((msg=br.readLine())!=null) {
					 //๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก 
					 sendMsg(msg);
				} 
			} catch (IOException e) { 
				//ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†์„ ํ•ด์ œํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ•ด์ œ ์‚ฌ์‹ค์„ ์•Œ๋ฆผ  
				msg ="["+ip+"] ํ‡ด์žฅ~~~~~";
				sendMsg(msg);
				
				//๋ฐฑํ„ฐ์—์„œ ์ ‘์† ํ•ด์ œํ•œ ์†Œ์ผ“ ์‚ญ์ œ
				client.remove(sc);
				sc=null;
				System.out.println(msg);
			}
		
			super.run();
		}
		
	}
	
	public void serverStart() {
		try {
			ss=new ServerSocket(port);
			System.out.println("์„œ๋ฒ„ ์‹œ์ž‘!!!");
			
			while(true) {
				//ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆผ 
				
				Socket sc=ss.accept();
				
				//์Šค๋ ˆ๋“œ ๊ฐ์ฒด ์ƒ์„ฑ
				WorkerThread t=new WorkerThread(sc);
				t.start(); // ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•œ ๊ฐฏ์ˆ˜ ๋งŒํผ ์ƒ์„ฑ 
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) {
		ServerChat2 obj =new ServerChat2(); // ์„œ๋ฒ„์˜ ๊ฐ์ฒด ์ƒ์„ฑ
		obj.serverStart(); // serverStart ์‹คํ–‰ 
		
		

	}

}

 

package ch16.unit02;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class ClientChat extends JFrame implements ActionListener, Runnable {
	private static final long serialVersionUID = 1L;

	private JTextField tf = new JTextField();
	private JTextArea ta = new JTextArea();

	private Socket sc = null;
	private String host = "127.0.0.1";
	//private String host = "192.168.0.93";
	private int prot = 8000;
	private String nickname = "์• ";

	
	public ClientChat() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		ta.setEditable(false);
		JScrollPane sp = new JScrollPane(ta);
		add(sp, BorderLayout.CENTER);

		tf.addActionListener(this);
		add(tf, BorderLayout.SOUTH);

		setTitle("์ฑ„ํŒ…-ํด๋ผ์ด์–ธํŠธ");
		setSize(500, 500);
		setResizable(false);
		setVisible(true);

	}

	@Override
	public void run() {
		String s;
		
		try {
			if(sc==null) {
				return;
			}
			
			BufferedReader br=new BufferedReader(new InputStreamReader(sc.getInputStream()));
			
			while((s=br.readLine())!=null) {
				ta.append(s+"\n");
				ta.setCaretPosition(ta.getDocument().getLength());
				
			}
		} catch (Exception e) {
			ta.append("์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n");
			sc=null;
		}

	}
	
	

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == tf) {
			String s = tf.getText().trim();

			if (s.length() == 0) {
				return;
			}
			try {
				if(sc==null) {
					return;
				}
				
				PrintStream ps=new PrintStream(sc.getOutputStream());
				ps.println(nickname + ">" +s);

				
				ta.append("๋ณด๋ƒ„>" + s + "\n");
				ta.setCaretPosition(ta.getDocument().getLength());

				tf.setText("");
				tf.requestFocus();

			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	public void connect() {

		try {
			sc = new Socket(host, prot);
			ta.setText("์„œ๋ฒ„ ์ ‘์† ์™„๋ฃŒ...\n");

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

		} catch (Exception e) {
			sc = null;
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		new ClientChat().connect();
		;

	}

}