Socket 多线程 JDBC综合编程一客户端编程

  这里是将GUI,Socket编程,多线程任务,JDBC综合起来,写的一个远程交互小项目。不过这里IP地址是采用127.0.0.1(回环地址)进行测试的,

  若访问远程服务器则需要将IP地址进行相应修改。下面是代码分析:

/*

客户端只是进行:查询和注册任务,这里直接发送相应字符串给服务器进行处理即可

1: 建立Socket连接

2:生成相应流对象

3:完成数据的读取或输出

要注意在收发数据时,线程是处于阻塞状态的!

*/


 import java.sql.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import java.net.*;
 import java.io.*;
 public class Client
 {
         public static void  main(String args[])
         {
               JFrame client = new ConnectFrame();
               client.show();
         }
 }
 class ConnectFrame extends JFrame implements ActionListener
 {
// 这里客户端没有进行数据库的操作,只是获得服务器返回的信息
            private String st1=null;
            private String st2=null;
            private String st3=null;
            private String st4=null;
            private String st5=null;

            private String stt1=null;
            private String stt2=null;
            private String stt3=null;
            private String stt4=null;
             private String stt5=null;
 
           private Socket socket = null;
           private DataInputStream in = null;
           private DataOutputStream out = null;
 
           private JLabel user = new JLabel("客户端",SwingConstants.CENTER);
/*
输入向数据库待输入学生的信息,用于扩增数据库
*/
           private JLabel namelabel = new JLabel("姓名:",SwingConstants.RIGHT);
           private JTextField name = new JTextField(5);
  
           private JLabel numlabel = new JLabel("学号:",SwingConstants.RIGHT);
           private JTextField num = new JTextField(10);
 
           private JLabel sexlabel = new JLabel("性别:",SwingConstants.RIGHT);
           private JTextField sex = new JTextField(5);
 
           private JLabel gradelabel = new JLabel("平均分:",SwingConstants.RIGHT);
           private JTextField grade = new JTextField(5);
 
           private JLabel majorlabel = new JLabel("专业:",SwingConstants.RIGHT);
           private JTextField major = new JTextField(10);
 
           private JButton submit = new JButton("注册信息");
 
/*
 输入对数据可操作所需要的信息
*/
           private JLabel operation = new JLabel("用户查询数据",SwingConstants.CENTER);
// 这里SwingConstants.CENTER 表示文本在单行输入文本中的初始位置
            private JLabel namelabel2 = new JLabel("姓名:",SwingConstants.RIGHT);
           private JTextField name2 = new JTextField(5);
 
           private JLabel numlabel2 = new JLabel("学号:",SwingConstants.RIGHT);
           private JTextField num2 = new JTextField(10);
 
            private JLabel sexlabel2 = new JLabel("性别:",SwingConstants.RIGHT);
          private JTextField sex2 = new JTextField(5);
 

private JLabel gradelabel2 = new JLabel("平均分:",SwingConstants.RIGHT);

private JTextField grade2 = new JTextField(5);

 

private JLabel majorlabel2 = new JLabel("专业:",SwingConstants.RIGHT);

private JTextField major2 = new JTextField(10);

 

// 执行操作的各个按钮

private JButton select = new JButton("查询信息");

 

 /*

 用于显示操作的结果

*/

private JLabel  resultlabel = new JLabel("查询结果如下",SwingConstants.CENTER);

private JTextArea resultarea = new JTextArea(20,80);

 

// 初始化各项操作,包括界面布局以及信息传送,接收和数据库操作

public ConnectFrame()

{

setTitle("数据库管理程序");

setSize(580,500);

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

           });

             // 生成布局界面

            CreateView();

}

 

public void CreateView()

{

resultarea.setEditable(false);

resultarea.setLineWrap(true);

 

Container layout = getContentPane();

layout.setLayout(null);

// 添加用于创建新成员相关信息的控件

layout.add(user);

user.setBounds(150,5,200,25);

 

layout.add(namelabel);

namelabel.setBounds(5,40,40,22);

layout.add(name);

name.setBounds(50,40,60,22);

 

layout.add(numlabel);

numlabel.setBounds(110,40,40,22);

layout.add(num);

num.setBounds(155,40,80,22);

 

layout.add(sexlabel);

sexlabel.setBounds(240,40,40,22);

layout.add(sex);

sex.setBounds(285,40,30,22);

 

layout.add(gradelabel);

gradelabel.setBounds(320,40,55,22);

layout.add(grade);

grade.setBounds(385,40,40,22);

 

layout.add(majorlabel);

majorlabel.setBounds(425,40,40,22);

layout.add(major);

major.setBounds(470,40,60,22);

 

layout.add(submit);

submit.setBounds(200,80,100,25);

 

// 添加修改数据库需要输入的信息

layout.add(operation);

operation.setBounds(175,135,150,25);

 

layout.add(namelabel2);

namelabel2.setBounds(5,180,40,22);

layout.add(name2);

name2.setBounds(50,180,60,22);

 

layout.add(numlabel2);

numlabel2.setBounds(110,180,40,22);

layout.add(num2);

num2.setBounds(155,180,80,22);

 

layout.add(sexlabel2);

sexlabel2.setBounds(240,180,40,22);

layout.add(sex2);

sex2.setBounds(285,180,30,22);

 

layout.add(gradelabel2);

gradelabel2.setBounds(320,180,55,22);

layout.add(grade2);

grade2.setBounds(385,180,40,22);

 

layout.add(majorlabel2);

majorlabel2.setBounds(425,180,40,22);

layout.add(major2);

major2.setBounds(470,180,60,22);

 

// 数据库执行操作的按钮

layout.add(select);

select.setBounds(200,225,100,25);

 

// 显示操作结果,这里操作都要分情况进行

layout.add(resultlabel);

resultlabel.setBounds(175,270,150,25);

 

JScrollPane scrollpane = new JScrollPane(resultarea);

layout.add(scrollpane);

scrollpane.setBounds(80,300,360,150);

 

submit.addActionListener(this);

select.addActionListener(this);

 

}

 

public void actionPerformed(ActionEvent evt)

{ // Java中Socket对象可以共用一个吗,或者定义全局变量使用?


resultarea.setText("");

    if(evt.getSource()==submit)

   {

// 如果JTextField未输入字符串,getText()为"",长度为0,但是一个实例对象

st1 = name.getText().trim();

st2 = num.getText().trim();

st3 = sex.getText().trim();

st4 = grade.getText().trim();

st5 = major.getText().trim();

//Java中 if和switch只能接受true和false,不能像C和C++接收数值

      if(st1.length()==0||st2.length()==0||st3.length()==0||st4.length()==0||st4.length()==0)

     {

resultarea.append("  "+"请输入完整的学生信息!"+"\n");

return;

   }else{

// 建立与服务器的一次连接,最后要释放掉相关资源

try

{

socket = new Socket("127.0.0.1",8850);  // 获取服务器Socket

in = new DataInputStream(socket.getInputStream());

out = new DataOutputStream(socket.getOutputStream());

// 这里获得全部信息,传送过去

String line = "INSERT INTO Student VALUES"+"('"+st1+"','"+st2+"','"+st3+"',"+st4+",'"+st5+"')";

out.writeUTF(line);

resultarea.setText("  注册学生信息成功!");


}catch(Exception e)

{

System.out.println("  数据传输出现问题1");

}finally{

try

{

if(in!=null)

in.close();

if(out!=null)

out.close();

if(socket!=null)

socket.close();

}catch(IOException io)

{

System.out.println("Exception : "+io);

}

    }

 }

}else if(evt.getSource()==select)

{

resultarea.setText("");

stt2 = num2.getText().trim();


// 建立与服务器的连接,获得服务器放回的数据

try

{

if(stt2.length()!=0)

{

String result = "";

socket = new Socket("127.0.0.1",8850); // 获取与服务器建立连接的Socket对象,依据该对象生成相应流对象

in = new DataInputStream(socket.getInputStream());

out = new DataOutputStream(socket.getOutputStream());

String line = "SELECT * FROM Student WHERE num LIKE '"+stt2+"%'";

out.writeUTF(line);

// 这里可以发送后,立即获得服务器返回信息,只要是在一个Socket连接中,不会产生混淆。

// 这是因为 in.readUTF()处于死等状态,不读出东西不往后执行(没有信息会阻塞在这里)

result = in.readUTF();

if(result != "")

{

resultarea.setText(result);

}else{

resultarea.setText("数据库无该同学信息!");

}


}else 

{

resultarea.setText("查询失败,请输入学号!");

}


}catch(Exception e)

{

System.out.println("  数据传输出现问题2");

}finally{

try

{

if(in!=null)

in.close();

if(out!=null)

out.close();

if(socket!=null)

socket.close();

}catch(IOException io)

   {

       System.out.println("Exception : "+io);

    }

     }

        }

}   

 }



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值