앞서 슬라이딩 퍼즐 게임(로그인, 퍼즐 GUI, 랭킹 GUI)를 만들었고, 소켓 통신과 연결을 하였습니다.

앞서 만들어둔 슬라이딩 퍼즐 게임과 변경된 점, 추가된 코드를 설명하였습니다.

 

로그인 DAO, DTO 는 동일하게 사용했으므로 설명 생략하도록 하겠습니다.

 

슬라이딩 퍼즐 게임 Part 1. 로그인 바로가기


로그인 DTO

package Login_pkg;

public class LoginData {
	private String ID;
	private String Password;
	public LoginData() { }
	public LoginData(String ID, String Password){
		this.ID = ID;
		this.Password = Password;
		System.out.println("ID"+ID);
	}
	
	public LoginData(String ID){
		this.ID = ID;
	}
	
	public String GetID(){
		return ID;
	}
	public void SetID(String Password){
		this.Password = Password;
	}
	public String GetPassword(){
		return Password;
	}
	public void SetPasswordD(String Password){
		this.Password = Password;
	}

로그인 DAO

package Login_pkg;

import java.sql.*;

public class LoginDB {
	private Connection conn = null;
	private ResultSet rs = null;
	private Statement st = null;
	private PreparedStatement ps = null;
	int count = 0;
	
	
	public LoginDB() { // 생성자로 데이터 베이스 연결
		
		final String url = "jdbc:mariadb://localhost:3306/puzzledb";
		final String id = "root";
		final String pw = "1234";
		try{
		Class.forName("org.mariadb.jdbc.Driver");
		conn = DriverManager.getConnection(url, id, pw);
		}catch(ClassNotFoundException cnfe) {
			System.out.println("DB 드라이버 로딩 실패:"+ cnfe.toString());
		}catch(SQLException sqle){
			System.out.println("DB 접속실패"+ sqle.toString());
		}catch(Exception e){
			System.out.println("Unkown error");
			e.printStackTrace();
		}	
	}

	
	public void DBClose(){ // 커넥션 연결 종료
		try{
			if(rs != null) rs.close();
			if(st != null) st.close();
			if(ps != null) ps.close();
		}catch(Exception e) { System.out.println(e + "=> DBClose 실패");}
	}
	
	// 회원 정보 저장
	public void InsertLogin(LoginData logindata){  // login table -> Login data insert
		String sql = "insert into login values(?, ?, ?)";
		
		try{
			ps = conn.prepareStatement(sql);
			st = conn.createStatement();
			rs = st.executeQuery("Select * From login order by position*1");
			while(rs.next())
			{
				int Number1 = rs.getInt("position");
				if(Number1 == count) count++;
				}
			ps.setInt(1, count);
			ps.setString(2, logindata.GetID());
			ps.setString(3, logindata.GetPassword());
			ps.executeUpdate();
			count++;
		}catch(SQLException e) 
		{
			e.printStackTrace();
		}finally 
		{
			DBClose();
		}
	}
	
	// 회원 정보 삭제
	public void Delete(String ID){  // login table -> Login data delete
		String sql = "Delete from login where ID =?";
		
		try{
			ps = conn.prepareStatement(sql);
			ps.setString(1, ID);
			ps.executeUpdate();
		}catch(SQLException e)
		{	
			e.printStackTrace();
		} finally 
		{
			DBClose();
		}
	}
	
	// ID, Password 확인
	public int LoginTry(LoginData logindata){ // login table -> Login ID, Password Confirm
		String sql = "select * from login where ID = ? and Password = ?";
		
		try{
		ps = conn.prepareStatement(sql);
		ps.setString(1, logindata.GetID());
		ps.setString(2, logindata.GetPassword());
		rs = ps.executeQuery();
		
		if(rs.next())
		{
			return 1;		
		}	
		}catch(Exception e) 
		{
			e.printStackTrace();
		}
		return -1;
	}
	
	// ID 확인
	public int LoginOX(LoginData logindata){ // login_management table -> Login ID Confirm
		String sql = "select * from login where ID = ?";
		try{
		ps = conn.prepareStatement(sql);
		ps.setString(1, logindata.GetID());
		rs = ps.executeQuery();
		if(rs.next()) 
		{
			return 1;
		}
		
		}catch(Exception e)
		{ 
			e.printStackTrace();
		}
		return -1;
	}

}

로그인 WindowBuilder

package Login_pkg;


import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import java.awt.Color;

public class Login_WindowBuilder {

	public JFrame frame;
	private JTextField IDtext;
	private JPasswordField passwordtext;
	private String getID = "" , getPS = "";
	
	private LoginDB Ldb = new LoginDB();

	/* main client 클래스로 변경
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() { 
			public void run() {
				try {
					Login_WindowBuilder window = new Login_WindowBuilder();
					window.frame.setVisible(true);
					window.frame.setResizable(false);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
    */

	public Login_WindowBuilder() 
	{
		initialize();
	}
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 401, 346);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBackground(Color.WHITE);
		panel.setBounds(0, 0, 385, 307);
		frame.getContentPane().add(panel);
		panel.setLayout(null);
		
		JLabel IDLabel = new JLabel("ID : ");
		IDLabel.setBounds(71, 122, 66, 33);
		IDLabel.setHorizontalAlignment(SwingConstants.CENTER);
		IDLabel.setFont(new Font("맑은 고딕", Font.BOLD, 18));
		panel.add(IDLabel);
		
		JLabel PassWordLabel = new JLabel("PW : ");
		PassWordLabel.setBounds(71, 173, 66, 29);
		PassWordLabel.setHorizontalAlignment(SwingConstants.CENTER);
		PassWordLabel.setFont(new Font("맑은 고딕", Font.BOLD, 18));
		panel.add(PassWordLabel);
		
		IDtext = new JTextField();
		IDtext.setBounds(149, 125, 145, 33);
		IDtext.setToolTipText("ID 입력");
		panel.add(IDtext);
		IDtext.setColumns(10);
		
		passwordtext = new JPasswordField();
		passwordtext.setBounds(149, 172, 145, 33);
		passwordtext.setToolTipText("PassWord 입력");
		panel.add(passwordtext);
		
		JLabel lblNewLabel = new JLabel("로그인 창");
		lblNewLabel.setBounds(12, 10, 361, 81);
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setFont(new Font("돋움체", Font.BOLD, 30));
		panel.add(lblNewLabel);
		
		JButton Loginbutton = new JButton("로그인");
		Loginbutton.setVisible(false);
		Loginbutton.setBackground(Color.WHITE);
		Loginbutton.setBounds(71, 243, 111, 47);
		Loginbutton.addActionListener(new ActionListener() { // 로그인 버튼 클릭 시 동작
			public void actionPerformed(ActionEvent arg0) {
				String ID = IDtext.getText();
				char[] PS1 = passwordtext.getPassword();
				
				String PS = String.valueOf(PS1);
				
				getID = ID; getPS = PS;

				int s = Ldb.LoginTry(new LoginData(ID,PS));
				
				if(s == 1) {
				
				JOptionPane.showMessageDialog(null, "로그인 성공");
				frame.dispose(); // 로그인 GUI 창 종료
                
                /* client 클래스에서 실행
                Puzzle_Swing window = new Puzzle_Swing();
				window.setVisible(true); // 슬라이딩 퍼즐 GUI 화면 나타남
				window.setResizable(false);  // GUI 창 크기 조절 불가능
				Ranking window2  =  new Ranking();
				window2.frame.setVisible(true); // 랭킹 GUI 화면 나타남
				window2.frame.setResizable(false);  // GUI 창 크기 조절 불가능
                */
				
				} else JOptionPane.showMessageDialog(null, "로그인 실패");
				
				
			}
		});
		Loginbutton.setFont(new Font("맑은 고딕", Font.PLAIN, 15));
		panel.add(Loginbutton);
		
		JButton button = new JButton("회원 가입");
		button.setBackground(Color.WHITE);
		button.setBounds(211, 243, 111, 47);
		button.addActionListener(new ActionListener() { // 회원 가입 버튼 클릭 시 동작
			public void actionPerformed(ActionEvent e) {
				
				String ID = IDtext.getText();
				char[] PS1 = passwordtext.getPassword();
				String PS = String.valueOf(PS1);
				
				
				if(ID.length() != 0 && PS.length() != 0)
				{
				Ldb.InsertLogin(new LoginData(ID, PS));
				IDtext.setText(""); passwordtext.setText("");
				JOptionPane.showMessageDialog(null, "등록 완료");
				frame.dispose(); 
				
				}
				else JOptionPane.showMessageDialog(null, "ID , PW 입력 바람.");
			}
		});
		button.setFont(new Font("맑은 고딕", Font.PLAIN, 15));
		panel.add(button);
	}

	public String getID() {
		return getID;
	}
	public String getPassword() {
		
		return getPS;
	}
}

이전 슬라이딩 퍼즐 게임에서는 해당 클래스파일에서 main 메소드를 실행 시켰지만, 소켓 통신을 연결함으로 써, client에서 main 메소드를 실행시킨다. 퍼즐 GUI 또한 client에 구현하였고, Puzzle_Swing 클래스도 필요없어지게 되었습니다.

또한 로그인 부분도 client에서 하기때문에  setVisible(false)를 주어 버튼을 나타나지 않도록 하였습니다.


실행결과

로그인 실행화면

 

 

다음으로 소켓통신 슬라이딩 퍼즐의 퍼즐에 대한 설명은 Part 2. 퍼즐에서 하도록 하겠습니다.


Part 2. 퍼즐 바로가기

Part 3. 랭킹 바로가기

Part 4. 소켓통신 바로가기

 

전체 소스코드 바로가기

+ Recent posts