[JAVA] ChatClient 예제

정은아·2022년 8월 19일
0
post-custom-banner
package ja_0819;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient extends Frame implements ActionListener, Runnable {

	Button btn_exit; //종료버튼
	Button btn_send; // 문자열 전송
	Button btn_connect; // 서버 접속
	TextArea txt_list; // 접속 목록 출력
	TextField txt_server_ip; // 접속 서버 아이피
	TextField txt_name; // 접속 이름
	TextField txt_input; // 전송 메시지
	Socket client; // 접속 클라이언트 소켓
	BufferedReader br = null; // 읽어오기 스트림
	PrintWriter pw = null; // 보내기 스트림
	String server_ip = null; // 서버 아이피
	final int port = 7400; // 포트 번호
	
	CardLayout cl; // 카드 레이아웃 설정
	
	//생성자
	public ChatClient(String title)
	{
		super(title); //타이틀바 제목
		cl = new CardLayout(); // 카드 레이아웃 초기화
		setLayout(cl); // 레이아웃 변경
		Panel connect = new Panel(); // 접속 화면
		connect.setLayout(new BorderLayout());
		Panel chat = new Panel(); // 채팅화면
		chat.setLayout(new BorderLayout());
		
		btn_connect = new Button("서버 접속"); // 버튼 생성
		btn_connect.addActionListener(this); // 이벤트 생성
		txt_server_ip = new TextField("192.168.20.20", 15);  
		txt_name = new TextField("정은아", 15);
		Panel connect_sub = new Panel(); // 접속창 하위 패널
		connect_sub.add(new Label("서버 아이피 : "));
		connect_sub.add(txt_server_ip);
		connect_sub.add(new Label("대화명   :   "));
		connect_sub.add(txt_name);
		connect.add("North", new Label("다중 채팅 접속 화면", Label.CENTER));
		connect.add("Center", connect_sub);
		connect.add("South", btn_connect);
		
		//채팅창 화면 구성
		txt_list = new TextArea();
		txt_input = new TextField("", 25);
		btn_exit = new Button("종료");
		btn_send = new Button("전송");
		btn_exit.addActionListener(this); // 이벤트 등록
		btn_send.addActionListener(this); // 이벤트 등록
		txt_input.addActionListener(this); // 이벤트 등록
		Panel chat_sub = new Panel(); // 채팅창 하위 패널
		chat_sub.add(txt_input);
		chat_sub.add(btn_send);
		chat_sub.add(btn_exit);
		chat.add("North", new Label("채팅 프로그램 ver 1.0", Label.CENTER));
		chat.add("Center", txt_list);
		chat.add("South", chat_sub);
		
		add(connect, "접속창"); // 카드 레이아웃에 등록
		add(chat, "채팅창"); // 카드 레이아웃에 등록
		
		cl.show(this, "접속창"); // 초기화면은 접속창
		
		setSize(400, 300);
		setVisible(true);
	}
	
	//Runnable 인터페이스 run() 메서드 오버라이딩
	
	@Override
	public void run()
	{
		try 
		{
			client = new Socket(server_ip, port); // 소켓 생성
			//입출력 스트림 생성
			
			InputStream is = client.getInputStream();
			OutputStream os = client.getOutputStream();
			br = new BufferedReader(new InputStreamReader(is));
			pw = new PrintWriter(new OutputStreamWriter(os));
			String msg = txt_name.getText();
			pw.println(msg); // 대화명 전송
			pw.flush();
			txt_input.requestFocus(); // 채팅창 글 입력 상자에 포커스
			
			while(true)
			{
				msg = br.readLine(); // 서버 데이터 수신
				txt_list.append(msg + "\n");
			}
			
		} catch (IOException e) // 예외처리
		{
			System.out.print(e.getMessage());
		}
	}

	//ActionEvente 이벤트 처리
	
	@Override
	public void actionPerformed(ActionEvent e)
	{
		try 
		{
			Object obj = e.getSource();
			// 서버 접속 버튼이 눌렸을 때
			
			if(obj == btn_connect) // 서버접속 버튼이 눌렸을 때
			{
				server_ip = txt_server_ip.getText();
				Thread th = new Thread(this);
				th.start(); // 스레드 시작
				cl.show(this, "채팅창"); // 채팅창으로 화면 전환
			}
			// 종료 버튼이 눌렸을 때
			
			else if(obj == btn_exit)
			{
				System.exit(0);
			}
			// 전송 버튼을 눌렀을 때
			// 글 입력 상자에서 엔터키를 쳤을 때
			
			else if(obj == btn_send || obj == txt_input)
			{
				String msg = txt_input.getText();
				pw.println(msg);
				pw.flush();
				txt_input.setText("");
				txt_input.requestFocus();
			}
		} catch (Exception ex) { // 예외 처리
			txt_list.append(ex.getMessage() + "\n");
		}
	}
	
	//main 메서드
	public static void main(String[] args) {
		new ChatClient("채팅 클라이언트 프로그램");
	}
}

이 소스코드들 중,

btn_connect = new Button("서버 접속"); // 버튼 생성
		btn_connect.addActionListener(this); // 이벤트 생성
		txt_server_ip = new TextField("192.168.20.20", 15);  

의 IP주소를 입력하면 IP주소의 채팅방에 입장할 수 있습니다.

profile
꾸준함의 가치를 믿는 개발자
post-custom-banner

0개의 댓글