Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

스포츠마케터의 초보 개발자 도전기

JAVA study 22 본문

develop/JAVA

JAVA study 22

teammate brothers 2024. 5. 9. 12:10

Socket 3)

 

JAVA로 간단한 채팅 프로그램 만들기!

ChatClient

package ex1_socket;

import java.awt.Button;
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.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient extends Frame implements Runnable {

	TextArea area; // 메세지 출력 영역
	TextField input; // 채팅 입력위한 객체
	Button send_bt; // 메세지 전송버튼

	// 서버접속에 필요한 객체들
	Socket s;
	PrintWriter out;
	BufferedReader in;
	Thread t;

	public ChatClient() {

		setBounds(500, 100, 300, 500);
		setLayout(null);

		area = new TextArea("", 0, 0, TextArea.SCROLLBARS_VERTICAL_ONLY);
		area.setBounds(10, 30, 280, 400);

		input = new TextField();
		input.setBounds(10, 440, 200, 30);

		send_bt = new Button("전송");
		send_bt.setBounds(210, 440, 80, 30);
		send_bt.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				if(e.getKeyChar() == KeyEvent.VK_ENTER) {
					//이거 마무리해보자
				}
				
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
		});

		this.add(area);
		this.add(input);
		this.add(send_bt);

		setVisible(true);

		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {

				// 종료하기 전에 모든 클라이언트에게 종료메시지를 보낸다
				out.println("xx:~X");
			}
		});
		// 메세지 전송 버튼
		send_bt.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				sendData();
			}
		});
		// 서버접속
		connected();

		// 서버로부터 전달되는 메시지를 받기위한 스레드 생성
		t = new Thread(this);
		t.start();

	}// 생성자

	// 서버접속 메서드
	private void connected() {
		try {
			s = new Socket("192.168.0.11", 4000);
			// 타 클라이언트의 메시지를 읽을 클래스
			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			// 메세지를 보내는 클래스
			out = new PrintWriter(s.getOutputStream(), true);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	@Override
	public void run() {

		// 서버로부터 전달되는 메세지를 기다렸다가 메세지가 도착하면 화면에 출력
		while (true) {

			try {
				String msg = in.readLine();

				if (msg.equals("xx:~X")) {
					break;
				}
				if (msg != null) {
					area.append(msg + "\n");
				}
			} catch (Exception e) {
				// TODO: handle exception
			}

		} // while
		closed();// 클라이언트가 접속을 해제하면 열려있는 모든 스트림을 해제
		System.exit(0); // 현재 클라이언트 종료

	}// run()

	// 서버에게 메세지를 전달하는 메서드
	private void sendData() {
		String msg = input.getText();
		if (msg.length() > 0) {
			out.println(msg);// 메세지 전달
		}
		input.setText("");
	}

	private void closed() {
		try {
			out.close();
			in.close();
			s.close();

		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

--

ChatServer

package ex1_socket;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer extends Thread {

	ServerSocket ss;

	// 복사된 클라이언트들을 저장할 리스트
	List<CopyClient> list;

	public ChatServer() {
		try {
			list = new ArrayList<CopyClient>();

			ss = new ServerSocket(5000);
			System.out.println("서버시작");

		} catch (Exception e) {
		}
	}

	@Override
	public void run() {

		while (true) {

			try {
				// 접속자 대기
				Socket s = ss.accept();

				// 접속자 ip
				String ip = s.getInetAddress().getHostAddress();

				System.out.println(ip + "님 접속");

				CopyClient cc = new CopyClient(s, this);
				list.add(cc);
				cc.start();

			} catch (Exception e) {
			}

		} // while
	}// run
	
		// 모든 클라이언트들에게 서버의 메세지를 전달
	public void sendMessage(String msg) {
		try {
			// List에 담긴 모든 접속자들(클라이언트)에게 메시지 전달
			for (CopyClient cc : list) {
				cc.out.println(msg);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}// sendMessage()

	public void removeClient(CopyClient cc) {
		list.remove(cc);
		sendMessage("--" + cc.ip + "님이 퇴장하였습니다.");
	}
}

--

ClientMain

package ex1_socket;

public class ClientMain {
	public static void main(String[] args) {

		new ChatClient();

	}// main
}

--

CopyClient

package ex1_socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class CopyClient extends Thread {

	Socket s;
	BufferedReader in;
	PrintWriter out;
	ChatServer server;
	String ip;

	public CopyClient(Socket s, ChatServer cs) {
		this.s = s;
		this.server = cs;

		try {
			out = new PrintWriter(s.getOutputStream(), true);
			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			ip = s.getInetAddress().getHostAddress();

		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	@Override
	public void run() {

		while (true) {

			try {
				String msg = in.readLine();
				if (msg.equals("xx:~X")) {
					out.println("xx:~X");

					server.removeClient(this);
					break;
				}

				server.sendMessage(ip + " : " + msg);

			} catch (Exception e) {
				// TODO: handle exception
			}

		} // while
	}// run
}

--

ServerMain

package ex1_socket;

public class MyServerMain {
	public static void main(String[] args) {
		
		ChatServer cs = new ChatServer();
		cs.start();
		
	}//main

}

'develop > JAVA' 카테고리의 다른 글

JAVA study 21  (0) 2024.05.09
JAVA study 20  (0) 2024.05.09
JAVA study 19  (0) 2024.03.25
JAVA study 18  (0) 2024.03.21
JAVA study 17  (0) 2024.03.20