[Java 22-8 ChatClientApp] 채팅 클라이언트 프로그램 - Swing

임승현·2022년 10월 19일

Java

목록 보기
126/126
package xyz.itwill.net;

import java.awt.BorderLayout;

//채팅 클라이언트 프로그램 - Swing 
//→ 서버에서 보내온 메세지를 전달받아 JTextArea 컴퍼넌트에 출력 - 무한루프
//→ JTextField 컴퍼넌트에서 입력한 메세지를 서버에 전달 - 이벤트 처리 메소드
public class ChatClientApp extends JFrame implements ActionListener{

	private static final long serialVersionUID = 2203202916925132376L;
	
	private JTextArea area;//출력 컴퍼넌트
	private JTextField field;//입력 컴퍼넌트
	
	//서버의 소켓과 연결된 소켓정보를 저장하기 위한 필드
	private Socket socket;
	
	//서버에서 보내온 메세지를 읽기 위한 입력스트림을 저장하기 위한 필드
	private BufferedReader in;
	
	//서버에서 메세지를 보내기 위한 출력스트림을 저장하기 위한 필드
	private PrintWriter out;
	
	//대화명을 저장하기 위한 필드
	private String aliasName;
	
	public ChatClientApp(String title) {
		super(title);
		
		area=new JTextArea();
		field=new JTextField();
		
		JScrollPane pane=new JScrollPane(area);
		
		getContentPane().add(pane, BorderLayout.CENTER);
		getContentPane().add(field, BorderLayout.SOUTH);
		
		area.setFont(new Font("굴림체", Font.BOLD, 20));
		field.setFont(new Font("굴림체", Font.BOLD, 20));
		
		area.setFocusable(false);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setBounds(700,200,400,500);
		setVisible(true);
		
		//JTextField 컴퍼넌트에서 이벤트가 발생될 경우 실행될 이벤트 처리 객체를 등록
		//→ 클라이언트가 메세지를 입력한 경우 실행될 명령을 이벤트 처리 메소드에 작성
		field.addActionListener(this);
		
		try {
			//Socket 객체 생성 - 채팅 서버에 접속
			socket=new Socket("192.168.13.31", 5000);
			
			//서버와 연결된 소켓의 출력스트림을 반환받아 대량의 문자데이터를 읽을 수 있는
            입력스트림으로 확장
			in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			//서버와 연결된 소켓의 출력스트림을 반환받아 모든 형식의 값을 문자열로 전달할 
            수 있는 출력스트림으로 확장
			out=new PrintWriter(socket.getOutputStream(), true);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(this, "서버에 접속할 수 없습니다.","접속오류",JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
		
		//대화명을 입력받아 필드에 저장하고 서번에 전달
		//→ 정상적인 대화명이 입력되도록 무한루프 이용
		while(true) {
			//JOptionPane.showInputDialog(Component parent, String Message, 
            String title, int messageType)
			//→ 입력 다이얼로그를 보여주는 메소드 - 입력값을 문자열로 반환
			aliasName=JOptionPane.showInputDialog(this, "대화명을 입력해 주세요.","대화명 입력", JOptionPane.QUESTION_MESSAGE);
			
			String regEx="^[가-힣]{2,6}$";
			
			//정상적인 대화명을 입력한 경우 반복문 종료
			if(aliasName!=null && !aliasName.equals("")) break;
			
			JOptionPane.showMessageDialog(this, "대화명을 반드시 입력해 주세요.","입력오류",JOptionPane.ERROR_MESSAGE);
		}
		
		//서버에 대화명 전달
		out.println(aliasName);
		
		//서버에서 보내온 메세지를 전달받아 JTextArea 컴퍼넌트에 추가하여 출력 - 무한루프
		while(true) {
			try {
				area.append(in.readLine()+"\n");
				
				//JTextArea 컴퍼넌트의 스크롤을 맨 아래로 이동 처리
				area.setCaretPosition(area.getText().length());
			} catch (IOException e) {
				JOptionPane.showMessageDialog(this, "서버와 연결이 끊어졌습니다.","접속오류",JOptionPane.ERROR_MESSAGE);
				System.exit(0);
			}
		}
	}
	public static void main(String[] args) {
		new ChatClientApp("자바채팅");
	}
	
	//이벤트 처리 메소드에서는 JTextField 컴퍼넌트의 입력값(메세지)을 반환받아 서버에 전달하는 명령 작성
	@Override
	public void actionPerformed(ActionEvent e) {
		//JTextField 컴퍼넌트의 입력값을 반환받아 저장
		String message=field.getText();
				
		if(!message.equals("")) {//입력메세지가 존재하는 경우
			out.println(message);//서버에 메세지 전달
			field.setText("");//JTextField 컴퍼넌트 초기화
		}
	}
}

0개의 댓글