这里是将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);
}
}
}
}
}