直接粘贴源代码了,本来JDBC的DBUtil有点错误,以后用自己的8
DBUtil.java
//DBUtil.java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBUtil {
private Connection conn;
private PreparedStatement preStmt;
private ResultSet rs;
public static Connection getConnection() throws SQLException {
Properties p=new Properties();
File file=new File("config"+File.separator+"mysql.properties");
try {
p.load(new FileInputStream(file));
String user=p.getProperty("user");
String password=p.getProperty("password");
String driver=p.getProperty("driver");
String url=p.getProperty("url");
Class.forName(driver);
return DriverManager.getConnection(url, user, password);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new SQLException("加载配置文件失败!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new SQLException("数据库驱动程序未找到!");
}
}
public void closeAll() {
try {
if(null!=rs)
rs.close();
if(null!=preStmt)
preStmt.close();
if(null!=conn)
conn.close();
}catch(Exception ex) {
ex.printStackTrace();
}
}
public ResultSet executeQuery(String sql, Object...params)throws Exception
{
conn=this.getConnection();
if(null==sql)
return null;
preStmt=conn.prepareStatement(sql);
if(null!=params && params.length>0) {
for(int i=0;i<params.length;i++) {
preStmt.setObject(i+1, params[i]);
}
}
rs=preStmt.executeQuery();
return rs;
}
public int executeUpdate(String sql, Object...params)throws SQLException
{
int result=0;
if(null==sql)
return 0;
conn=this.getConnection();
preStmt=conn.prepareStatement(sql);
if(null!=params && params.length>0) {
for(int i=0;i<params.length;i++) {
preStmt.setObject(i+1, params[i]);
}
}
result=preStmt.executeUpdate();
return result;
}
}
mysql.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/student0010?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&&useSSL=false
user=root
password=123456
user.java
//user.java
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String username,String password) {
this.username=username;
this.password=password;
}
}
userservice.java
//UserService.java
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserService {
public User findUserByName(String userName) {
DBUtil db=new DBUtil();
User user=null;
try {
db.getConnection(); //获取数据库连接
String sql="SELECT * FROM userdetails WHERE username=?";//设置数据库参数
Object[] param =new Object[] {userName};
ResultSet rs=db.executeQuery(sql, param);
if(rs.next()) { //将结果集中的数据封装到对象中
user=new User(rs.getString(1),rs.getString(2));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
db.closeAll();
}
return user;
}
public boolean saveUser(User user) { //保存用户信息,没有做注册界面,没敲完
boolean r=false;
DBUtil db=new DBUtil();
return r;
}
}
LoginFrame.java
//LoginFram.java
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class LoginFrame extends JFrame{
private JPanel p;
private JLabel lblName,lblPwd;
private JTextField txtName;
private JPasswordField txtPwd;
private JButton btnOk,btnCancle,btnRegist;
private static User user;
private UserService userService;
public String username;
public LoginFrame() {
super("登录页面");
userService=new UserService();
p=new JPanel();
p.setLayout(null);
/*未设置Layout时,java默认为flowLayout布局的,设置为null即为清空布局管理器,
* 之后添加组件,常常是设置组件左上角坐标相对于容器左上角(0,0)的x,y值来确定组件的位置,
* 即使更改容器大小也不会改变位置。这种方式常常用于窗体大小固定的容器里。
*/
lblName=new JLabel("用户名");
lblPwd=new JLabel("密码");
txtName=new JTextField(20);
txtPwd=new JPasswordField(20);
txtPwd.setEchoChar('*');
btnOk=new JButton("登录");
btnOk.addActionListener(new LoginListener());
btnCancle=new JButton("重置");
btnCancle.addActionListener(new ResetListener());
btnRegist=new JButton("注册");
//注册监听器
/*setBounds(x,y,width,height);
* x:组件在容器X轴上的起点
* y:组件在容器Y轴上的起点
* width:组件的长度
* height:组件的高度
*/
lblName.setBounds(30,30,60,25);
lblPwd.setBounds(30,60,60,25);
txtName.setBounds(95,30,120,25);
txtPwd.setBounds(95,60,120,25);
btnOk.setBounds(30,90,60,25);
btnCancle.setBounds(95,90,60,25);
btnRegist.setBounds(160,90,60,25);
p.add(lblName);
p.add(txtName);
p.add(lblPwd);
p.add(txtPwd);
p.add(btnOk);
p.add(btnCancle);
p.add(btnRegist);
this.add(p);
this.setSize(250,170);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public class LoginListener implements ActionListener{ //监听类,处理登录按钮
public void actionPerformed(ActionEvent e) {
user=userService.findUserByName(txtName.getText().trim());
if(user!=null) {
if(user.getPassword().equals(new String(txtPwd.getPassword()))) {
LoginFrame.this.setVisible(false);//登录成功,隐藏登录窗口
username=txtName.getText().trim();
new ChatClient(username).setVisible(true);//显示聊天窗口
}else {
System.out.println("密码错误,请重新输入");
txtPwd.setText("");
}
}else {
System.out.println("该用户不存在,请先注册");
}
}
}
public class ResetListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
txtName.setText("");
txtPwd.setText("");
}
}
public static void main(String args[]) {
new LoginFrame();
}
}
ChatServer.java
//chatServer.java
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
public class ChatServer {
public static String username;
ServerSocket serverSocket; //声明服务器套接字
ArrayList<BufferedReader> bReaders=new ArrayList<BufferedReader>(); //输入流列表集合
ArrayList<PrintWriter> pWriters=new ArrayList<PrintWriter>(); //输出流列表集合
LinkedList <String>msgList=new LinkedList<String>(); //聊天信息列表集合
public ChatServer() {
try {
serverSocket=new ServerSocket(28888);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new AcceptSocketThread().start(); //创建接客户端socket的线程实例并启动
new SendMsgToClient().start(); //创建给客户端发送信息的线程实例并启动
System.out.println("服务器已经启动...");
}
class AcceptSocketThread extends Thread{
public void run() {
while(this.isAlive()) {
try {
Socket socket=serverSocket.accept();
if(socket!=null) {
BufferedReader bReader=new BufferedReader( //获取socket对象的输入流
new InputStreamReader(socket.getInputStream()));
bReaders.add(bReader); //将输入流添加到输入流列表集合中
new GetMsgFromClient(bReader).start();
//开启一个线程接收该客户端的聊天信息
pWriters.add(new PrintWriter(socket.getOutputStream()));
//获取socket对象的输出流,并添加到输入出流列表集合中
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class GetMsgFromClient extends Thread{
BufferedReader bReader;
public GetMsgFromClient(BufferedReader bReader) {
this.bReader=bReader;
}
public void run() {
while(this.isAlive()) {
try {
String strMsg=bReader.readLine();
//从输入流中读一行信息
if(strMsg!=null) {
SimpleDateFormat dateFormat=new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String strTime=dateFormat.format(new Date());
msgList.addFirst("<=="+strTime+"==>\n"+strMsg);
//将时间和信息添加到信息链表集合中
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class SendMsgToClient extends Thread{
public void run() {
while(this.isAlive()) {
if(!msgList.isEmpty()) { //如果信息链表不空,表示还有聊天信息没发送
String msg=msgList.removeLast(); //取出信息链表最后一条,并移除
for(int i=0;i<pWriters.size();i++) { //对输出流列表集合进行遍历,循环发送信息给客户端
pWriters.get(i).println(msg);
pWriters.get(i).flush();
}
}
}
}
}
public static void main(String args[]) {
new ChatServer();
}
}
ChatClient.java
//ChatClient.java
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.*;
public class ChatClient extends JFrame{
Socket socket;
public static String username;
PrintWriter pWriter;
BufferedReader bReader;
JPanel panel;
JScrollPane sPane;
JTextArea txtContent;
JLabel lblName,lblSend;
JTextField txtName,txtSend;
JButton btnSend;
public ChatClient(String username) { //参数username,登录后聊天界面用户名设置
super("聊天室");
txtContent=new JTextArea();
txtContent.setEditable(false);
sPane=new JScrollPane(txtContent);
lblName=new JLabel("昵称");
txtName=new JTextField(5);
lblSend=new JLabel("发言");
txtSend=new JTextField(20);
btnSend=new JButton("发送");
txtName.setText(username);
panel=new JPanel();
panel.add(lblName);
panel.add(txtName);
panel.add(lblSend);
panel.add(txtSend);
panel.add(btnSend);
this.add(panel,BorderLayout.SOUTH);
this.add(sPane);
this.setSize(500,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
socket=new Socket("127.0.0.1",28888); //创建套接字
pWriter=new PrintWriter(socket.getOutputStream());
bReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
btnSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String strName=txtName.getText();
String strMsg=txtSend.getText();
if(!strMsg.equals("")) {
pWriter.println(strName+"说"+strMsg);
pWriter.flush();
txtSend.setText("");
}
}
});
new GetMsgFromServer().start();
}
class GetMsgFromServer extends Thread {
public void run() {
while(this.isAlive()) {
try {
String strMsg=bReader.readLine();
if(strMsg!=null) {
txtContent.append(strMsg+"\n"); //文本域添加聊天信息
}
Thread.sleep(50);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String args[]) {
new ChatClient(username).setVisible(true);
}
}