C/Sアーキテクチャのデータベース操作


最近1つの課程の設計をして、C/Sアーキテクチャを使う必要があって、クライアントはデータベースを添削して調べる要求を出して、サービス側はデータベースの具体的な操作を完成する必要があって、このようにデータの安全を保証することができます.データベースはAccessを採用して、名前はstudentで、Fディスクのルートディレクトリの下に置いて、ファイルは添付ファイルを参照します.実装結果は次のとおりです.
 
サービス:
クライアント:検索結果は小文
 
 
実装コードは次のとおりです.
 
 
ServerFrame.JAvaはサービス側のインタフェースを実現する:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
/**
*
* @author xwz0528
* 
*         
*/

public class ServerFrame extends JFrame{

	public static int port=6000;
	
	Server sev;
	
	public ServerFrame() {
		
		JPanel p1=new JPanel(new GridLayout(2,2));// 
		JLabel jlb1=new JLabel("    :");
		final JLabel jlbPort=new JLabel("6000");
		JLabel jlb2=new JLabel("     :");
		final JLabel jlbNow=new JLabel("  ");
		p1.add(jlb1);
		p1.add(jlbPort);
		p1.add(jlb2);
		p1.add(jlbNow);
		p1.setBorder(new TitledBorder("     "));
		
		
		JPanel p2=new JPanel(new GridLayout(3,2));// 
		JPanel p21=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));
		JLabel jlb3=new JLabel("    :");
		final JTextField jtfPort=new JTextField("6000",8);		
		p21.add(jlb3);
		p21.add(jtfPort);
		JPanel p22=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));
		final JButton jbnApply=new JButton("  ");//       
		p22.add(jbnApply);
		JLabel jlb6=new JLabel("");
		p2.add(jlb6);
		p2.add(p21);
		p2.add(p22);
		p2.setBorder(new TitledBorder("     "));
		
		
		JPanel p3=new JPanel(new GridLayout(2,2));
		JPanel p31=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));// 
		final JButton jbnStart=new JButton("    ");//      		
		p31.add(jbnStart);
		JPanel p32=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));
		final JLabel jlbWork=new JLabel("    !");
		p32.add(jlbWork);
		JLabel jlb4=new JLabel("");
		JLabel jlb5=new JLabel("");		
		p3.add(jlb4);
		p3.add(jlb5);
		p3.add(p31);
		p3.add(p32);
		
		setLayout(new BorderLayout());
		add(p1,BorderLayout.WEST);
		add(p2,BorderLayout.EAST);
		add(p3,BorderLayout.SOUTH);
		
		
		
		//         
		
		//  
		jbnApply.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				String str=jtfPort.getText();//        
				
				port=Integer.parseInt(str);
				
				jlbPort.setText(str);//         
			}
		});
		
		//    
		jbnStart.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				jbnStart.setEnabled(false);
				jbnApply.setEnabled(false);
				jtfPort.setEnabled(false);
				jlbNow.setText("    ");
										
				sev=new Server();
				sev.start();
			}
		});
				
	}

	public static void main(String[] args) {
		JFrame frame=new ServerFrame();
		frame.setTitle("        (ESMS)   ");
		frame.setSize(380,300);
		frame.setLocationRelativeTo(null);//center
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

}

 
Server.JAvaはサービス側とクライアントとの通信を実現する:
 
import java.net.*;
import java.io.*;


/**
 *
 * @author xwz0528
 * 
 *                    ,           、 、 、  sql  ,
 * 
 *        ,             
 */


public class Server extends Thread{
	
	private ServerSocket ss;
	
	private Socket s;
	
	//private volatile boolean isStop=false;//      
	
    public Server()
    {
    	
    }
    
    public void run()
    {
    	try
        {
            ss=new ServerSocket(ServerFrame.port);
                       
            //    
            while(true)//      (  )
            {      
            	s=ss.accept();
            	
            	if(s!=null)
            	{
		            InputStream is=s.getInputStream();
		            byte[] buf=new byte[100];	
					int len=is.read(buf);
					if(len!=-1)
					{                               	   
						String sql=new String(buf,0,len);//   sql  
		                   
		                String[] split=sql.split(" ");//         
		                String sqlKey=split[0];//sql     ,           
		                
		                if(sqlKey.equals("insert")||sqlKey.equals("delete")||sqlKey.equals("update"))
		                {
		                	DataBase.executeSql(sql);
		                }
		                else if(sqlKey.equals("select"))//    
		                {
		                	//    
			                OutputStream os=s.getOutputStream();
		                	
			                String result=DataBase.getQueryResult(sql);
			                
			                os.write(result.getBytes());//            	
		                }
		                	                                   
	            	}
            	}
            }
                     
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

 
DataBase.JAvaは、データベースに関する操作を実現します.
import java.sql.*;

/**
 *
 * @author xwz0528
 * 
 *                 
 */
public class DataBase {

    public static Connection con = null;

    public static Statement st = null;

    public static ResultSet rs; //       

    //     
    public static void getConn() {
        try {

            String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; //      

            String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=F:\\student.mdb";//        URL

            Class.forName(driver);

            DataBase.con = DriverManager.getConnection(url);


        } catch (Exception e) {

            e.printStackTrace();


        }
    }

    //       
    public static void closeConn() {
        try {

            if (DataBase.con != null) {
                DataBase.con.close();
            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    //    ( )、  ( )、  ( )    
    public static void executeSql(String sql){

        try{

            DataBase.getConn();

            st = DataBase.con.createStatement();

            st.executeUpdate(sql);//         executeUpdate()

            DataBase.con.commit();

            DataBase.closeConn();//       ,        

        }
        catch(Exception e){

            e.printStackTrace();

        }

    }

    //       ,    ,       ( )
    public static String getQueryResult(String sql) {

    	String result="";
    	
        try {

            DataBase.getConn();

            st = DataBase.con.createStatement();

            rs = st.executeQuery(sql);//     executeQuery                                  
            
            while(rs.next())
            {
            	result=rs.getString(2);//  
            }
            
            DataBase.closeConn();//       ,        
            
            return result;


        } catch (Exception e) {

            e.printStackTrace();

            return result;

        }

    }

	
}

 
 
 
 
次に、クライアントのテストプログラムを示します.
Client.java
import java.net.*;
import java.io.*;

public class Client extends Thread{
	
	public static String result="";
	
	public static Socket s;
	
	public Client()
	{
		try
		{
			s=new Socket(InetAddress.getByName("localhost"),6000);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}	
	}
	
	public void run()
	{
		try
		{						
			//    
            while(true)//      (  )
            {                  	
            	if(s!=null)
            	{
		            InputStream is=s.getInputStream();
		            byte[] buf=new byte[100];	
					int len=is.read(buf);
					if(len!=-1)
					{             						
						Client.result=new String(buf,0,len);
					}
            	}
            }
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}	
	}
	
	public static void send()
	{
		try
		{		
			OutputStream os=s.getOutputStream();      

			//     356   (           )
			os.write("select * from db_student where   =356".getBytes());
		}
		catch(Exception ex)
		{		
			ex.printStackTrace();	
		}
	}
	
	public static void main(String[] args)
	{
		Thread client=new Client();		
		
		client.start();//                 

		Client.send();//  sql  
		
		try
		{
			Thread.sleep(1000);//        ,     
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		if(!Client.result.isEmpty())
		{
			System.out.print(Client.result);
		}
	}
}