简单的聊天程序


//QQ聊天程序的建立网络流类

importjava.net.*;

importjava.io.*;

publicclassNeter{

privateBufferedReaderbr;

privatePrintWriterpw;

publicNeter(Socketsocket){

try{

InputStreamis=socket.getInputStream();

InputStreamReaderisr=newInputStreamReader(is);

br=newBufferedReader(isr);

OutputStreamos=socket.getOutputStream();

OutputStreamWriterosw=newOutputStreamWriter(os);

pw=newPrintWriter(osw,true);

}catch(Exceptione){

e.printStackTrace();

}

}

publicvoidsend(Stringmessage){

try{

pw.println(message);

}catch(Exceptione){

e.printStackTrace();

}

}

publicStringrecieve(){

Stringmessage="";

try{

message=br.readLine();

}catch(Exceptione){

e.printStackTrace();

}

returnmessage;

}

}

//QQ聊天程序的数据库验证类

importjava.sql.*;

importjava.io.*;

publicclassSQLer{

publicbooleanselect(Stringu,Stringp){

booleanb=false;

Connectioncon=null;

PreparedStatementps=null;

ResultSetrs=null;

try{

Filef=newFile("F:/java/SQL.ini");

FileReaderfr=newFileReader(f);

BufferedReaderbr=newBufferedReader(fr);

Stringdriver=br.readLine();

Stringurl=br.readLine();

Stringuser=br.readLine();

Stringpass=br.readLine();

Class.forName(driver);

con=DriverManager.getConnection(url,user,pass);

ps=con.prepareStatement("selectusername,passwordfromuserwhereusername=?andpassword=?");

ps.setString(1,u);

ps.setString(2,p);

rs=ps.executeQuery();

b=rs.next();

br.close();

rs.close();

ps.close();

con.close();

}catch(Exceptione){

e.printStackTrace();

}

finally{

try{

rs.close();

ps.close();

con.close();

}catch(Exceptione){

e.printStackTrace();

}

}

returnb;

}

}

//QQ聊天程序的文件读写类

importjava.io.*;

publicclassRecorder{

privateFilef;

publicRecorder(Stringurl){

try{

f=newFile(url);

if(!f.exists()){

f.createNewFile();

}

}catch(Exceptione){

e.printStackTrace();

}

}

publicvoidwrite(Stringmessage){

try{

FileWriterfw=newFileWriter(f,true);

PrintWriterpw=newPrintWriter(fw);

pw.println(message);

pw.close();

}catch(Exceptione){

e.printStackTrace();

}

}

publicStringread(){

Stringmessage="";

try{

FileReaderfr=newFileReader(f);

BufferedReaderbr=newBufferedReader(fr);

message+=br.readLine()+"\n";

}catch(Exceptione){

e.printStackTrace();

}

returnmessage;

}

}

服务器

//QQ聊天程序服务器代码

importjava.net.Socket;

importjava.net.ServerSocket;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStreamWriter;

importjava.io.BufferedReader;

importjava.io.PrintWriter;

importjava.sql.DriverManager;

importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.io.File;

importjava.io.FileWriter;

importjava.util.*;

publicclassQQServer{

privateServerSocketserver;

privateSocketsocket;

privateNeternet;

privateHashMap<String,Neter>hm;

publicQQServer(){

createSocket();

}

publicvoidcreateSocket(){

try{

server=newServerSocket(8000);

hm=newHashMap<String,Neter>();

System.out.println("服务器已启动!");

while(true){

socket=server.accept();

net=newNeter(socket);

// MyServicems=newMyService(socket);

MyServicems=newMyService(net,hm);

Threadt=newThread(ms);

t.start();

System.out.println("客户端已连上!");

}

}catch(Exceptione){

e.printStackTrace();

}

}

publicstaticvoidmain(String[]args){

newQQServer();

}

}

classMyServiceimplementsRunnable{

// privateSocketsocket;

privateHashMap<String,Neter>hm;

privateNeternet;

// publicMyService(Socketsocket){

// this.socket=socket;

// }

publicMyService(Neternet,HashMap<String,Neter>hm){

this.net=net;

this.hm=hm;

}

@Override

publicvoidrun(){

createStream();

}

publicvoidcreateStream(){

try{

//输入流

// InputStreamis=socket.getInputStream();

// InputStreamReaderisr=newInputStreamReader(is);

// BufferedReaderbr=newBufferedReader(isr);

// //输出流

// OutputStreamos=socket.getOutputStream();

// OutputStreamWriterosw=newOutputStreamWriter(os);

// PrintWriterpw=newPrintWriter(osw,true);

while(true){

// str=br.readLine();

Stringstr=net.recieve();

Stringtype=str.split("%")[0];

Stringmess=str.split("%")[1];

if(type.equals("[login]")){

Stringuser=mess.split(":")[0];

Stringpass=mess.split(":")[1];

SQLersql=newSQLer();

if(sql.select(user,pass)){

net.send("[login]%OK");

for(Netern:hm.values()){

n.send("[add]%"+user);

}

for(Strings:hm.keySet()){

net.send("[add]%"+s);

}

hm.put(user,net);

}else{

net.send("[login]%ERR");

}

// Connectioncon=null;

// PreparedStatementps=null;

// ResultSetrs=null;

// try{

// Class.forName("org.gjt.mm.mysql.Driver");

// con=DriverManager.getConnection("jdbc:mysql://localhost:3306/qq","root","root");

// ps=con.prepareStatement("selectusername,passwordfromuserwhereusername=?andpassword=?");

// ps.setString(1,user);

// ps.setString(2,pass);

// rs=ps.executeQuery();

//

// if(rs.next()){

// pw.println("[LOGIN]:OK");

// }else{

// pw.println("[LOGIN]:NO");

// }

// rs.close();

// ps.close();

// con.close();

// }catch(Exceptione1){

// e1.printStackTrace();

// }

// finally{

// try{

// rs.close();

// ps.close();

// con.close();

// }catch(Exceptione1){

// e1.printStackTrace();

// }

// }

}elseif(type.equals("[chat]")){

Stringfrom=mess.split(":")[0];

Stringto=mess.split(":")[1];

Stringmessage=mess.split(":")[2];

Neterts=hm.get(to);

ts.send("[chat]%"+from+":"+message);

}elseif(type.equals("[exit]")){

for(Netern:hm.values()){

n.send("[exit]%"+mess);

}

}

}

}catch(Exceptione){

e.printStackTrace();

}

}

}

界面:

//QQ聊天程序的登录界面及相关事件

importjavax.swing.JFrame;

importjavax.swing.JOptionPane;

importjavax.swing.JLabel;

importjavax.swing.JButton;

importjavax.swing.JTextField;

importjavax.swing.JPasswordField;

importjavax.swing.JPanel;

importjava.awt.GridLayout;

importjava.awt.BorderLayout;

importjava.awt.FlowLayout;

importjava.awt.event.ActionListener;

importjava.awt.event.ActionEvent;

importjava.awt.event.WindowEvent;

importjava.awt.event.WindowListener;

importjava.io.File;

importjava.io.FileReader;

importjava.io.BufferedReader;

importjava.net.Socket;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.BufferedReader;

importjava.io.OutputStream;

importjava.io.OutputStreamWriter;

importjava.io.PrintWriter;

publicclassQQLoginextendsJFrameimplementsActionListener,WindowListener{

privateJLabellabUser; //用户标签

privateJLabellabPass; //密码标签

privateJTextFieldtxtUser; //用户信息输入框

privateJPasswordFieldtxtPass; //用户密码输入框

privateJButtonbtnReg; //注册按钮

privateJButtonbtnLogin; //登录按钮

privateJButtonbtnCancel; //取消按钮

privateJPaneljpCenter; //中部布局

privateJPaneljpSouth; //南部布局

privateSocketsocket;

privateNeternet;

publicQQLogin(){

try{

socket=newSocket("localhost",8000);

net=newNeter(socket);

}catch(Exceptione){

e.printStackTrace();

}

init();

this.setSize(300,150);

this.setResizable(false);

// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setLocation(500,200);

}

//界面布局

publicvoidinit(){

//用户标签和密码标签

labUser=newJLabel("用户");

labPass=newJLabel("密码");

//用户和密码输入框

txtUser=newJTextField();

txtPass=newJPasswordField();

//按钮

btnReg=newJButton("注册");

btnReg.addActionListener(this);

btnLogin=newJButton("登录");

btnLogin.addActionListener(this);

btnCancel=newJButton("取消");

btnCancel.addActionListener(this);

//中部布局

jpCenter=newJPanel();

jpCenter.setLayout(newGridLayout(2,2));

jpCenter.add(labUser);

jpCenter.add(txtUser);

jpCenter.add(labPass);

jpCenter.add(txtPass);

this.add(jpCenter,BorderLayout.CENTER);

//南部布局

jpSouth=newJPanel();

jpSouth.setLayout(newFlowLayout());

jpSouth.add(btnReg);

jpSouth.add(btnLogin);

jpSouth.add(btnCancel);

this.add(jpSouth,BorderLayout.SOUTH);

this.addWindowListener(this);

}

@Override

publicvoidactionPerformed(ActionEvente){

if(e.getActionCommand().equals("登录")){

try{

// OutputStreamos=socket.getOutputStream();

// OutputStreamWriterosw=newOutputStreamWriter(os);

// PrintWriterpw=newPrintWriter(osw,true);

//

// InputStreamis=socket.getInputStream();

// InputStreamReaderisr=newInputStreamReader(is);

// BufferedReaderbr=newBufferedReader(isr);

Stringuser=txtUser.getText();

Stringpass=newString(txtPass.getPassword());

if(!user.equals("")&&!pass.equals("")){

// pw.println("[LOGIN]:"+user+"%"+pass);

//

// Stringlogin=br.readLine();

net.send("[login]%"+user+":"+pass);

Stringlogin=net.recieve();

// System.out.println(login.split(":")[0]);

if(login.split("%")[0].equals("[login]")){

Stringstr=login.split("%")[1];

if(str.equals("OK")){

QQMainmain=newQQMain();

// main.setSocket(socket);

main.setNeter(net,user);

main.setVisible(true);

this.setVisible(false);

}else{

JOptionPane.showMessageDialog(this,"用户名或密码错误!");

}

}

}else{

JOptionPane.showMessageDialog(this,"密码或用户名为空!");

}

}catch(Exceptione1){

}

}

if(e.getActionCommand().equals("注册")){

QQRegr=newQQReg();

r.setVisible(true);

}

if(e.getActionCommand().equals("取消")){

txtUser.setText("");

txtPass.setText("");

}

}

publicStringgetUser(){

returntxtUser.getText();

}

publicStringgetPass(){

returnnewString(txtPass.getPassword());

}

publicstaticvoidmain(String[]args){

QQLoginlogin=newQQLogin();

login.setVisible(true);

}

@Override

publicvoidwindowOpened(WindowEvente){

//TODOAuto-generatedmethodstub

}

@Override

publicvoidwindowClosing(WindowEvente){

inti=JOptionPane.showConfirmDialog(this,"是否关闭?","QQlogin",JOptionPane.OK_CANCEL_OPTION);

if(i==JOptionPane.OK_OPTION){

System.exit(1);

}

}

@Override

publicvoidwindowClosed(WindowEvente){

}

@Override

publicvoidwindowIconified(WindowEvente){

}

@Override

publicvoidwindowDeiconified(WindowEvente){

}

@Override

publicvoidwindowActivated(WindowEvente){

}

@Override

publicvoidwindowDeactivated(WindowEvente){

}

}

//QQ聊天程序注册界面

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JButton;

importjavax.swing.JOptionPane;

importjavax.swing.JTextField;

importjavax.swing.JPasswordField;

importjavax.swing.JPanel;

importjava.awt.BorderLayout;

importjava.awt.GridLayout;

importjava.awt.event.ActionListener;

importjava.awt.event.ActionEvent;

importjava.io.File;

importjava.io.FileWriter;

importjava.io.PrintWriter;

importjava.sql.DriverManager;

importjava.sql.Connection;

importjava.sql.PreparedStatement;

publicclassQQRegextendsJFrameimplementsActionListener{

JLabellabMess; //显示注册标签

JLabellabUser; //用户标签

JLabellabPass; //密码标签

JTextFieldtxtUser; //用户输入框

JPasswordFieldtxtPass; //密码输入框

JButtonbtnOK; //确认按钮

JButtonbtnCancel; //取消按钮

JPaneljpSouth;

JPaneljpCenter;

publicQQReg(){

init();

this.setBounds(500,200,300,150);

this.setResizable(false);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

publicvoidinit(){

//实例化所有选项

labMess=newJLabel("注册信息");

labUser=newJLabel("用户");

labPass=newJLabel("密码");

txtUser=newJTextField();

txtPass=newJPasswordField();

btnOK=newJButton("确认");

btnOK.addActionListener(this);

btnCancel=newJButton("取消");

btnCancel.addActionListener(this);

jpSouth=newJPanel();

jpSouth.add(btnOK);

jpSouth.add(btnCancel);

jpCenter=newJPanel();

jpCenter.setLayout(newGridLayout(2,2));

jpCenter.add(labUser);

jpCenter.add(txtUser);

jpCenter.add(labPass);

jpCenter.add(txtPass);

this.add(labMess,BorderLayout.NORTH);

this.add(jpCenter,BorderLayout.CENTER);

this.add(jpSouth,BorderLayout.SOUTH);

}

@Override

publicvoidactionPerformed(ActionEvente){

if(e.getActionCommand()=="确认"){

Connectioncon=null;

PreparedStatementps=null;

Stringuser=txtUser.getText();

Stringpass=newString(txtPass.getPassword());

try{

Class.forName("org.gjt.mm.mysql.Driver");

con=DriverManager.getConnection("jdbc:mysql://localhost:3306/qq","root","root");

ps=con.prepareStatement("insertintouser(username,password)values(?,?)");

ps.setString(1,user);

ps.setString(2,pass);

ps.executeUpdate();

}catch(Exceptione1){

e1.printStackTrace();

}

}

if(e.getActionCommand()=="取消"){

txtUser.setText("");

txtPass.setText("");

}

}

// publicstaticvoidmain(String[]args){

// QQRegr=newQQReg();

// r.setVisible(true);

// }

}

//QQ聊天程序主界面类

importjavax.swing.JFrame;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.awt.event.WindowEvent;

importjava.awt.event.WindowListener;

importjavax.swing.JOptionPane;

importjavax.swing.JScrollPane;

importjavax.swing.JPanel;

importjavax.swing.JButton;

importjavax.swing.JTextArea;

importjavax.swing.JComboBox;

importjava.awt.GridLayout;

importjava.awt.BorderLayout;

importjava.awt.event.ActionListener;

importjava.io.File;

importjava.io.FileWriter;

importjava.io.PrintWriter;

importjava.net.Socket;

importjava.io.OutputStream;

importjava.io.OutputStreamWriter;

importjava.io.PrintWriter;

importjavax.swing.JScrollPane;

publicclassQQMainextendsJFrameimplementsActionListener,Runnable,WindowListener{

privateJTextAreatxtSend; //发送信息的窗口

privateJScrollPanescrollSend;

privateJTextAreatxtMess; //显示信息的窗口

privateJScrollPanescrollMess;

privateJButtonbtnSend; //发送按钮去

privateJButtonbtnCancel; //取消按钮

privateJButtonbtnMess; //显示消息按钮

privateJComboBoxjbList; //显示聊天对象的下拉列表

privateJPaneljpSmall;

privateJPaneljpBig;

privateintscore=0;

privateQQChatchat;

// privateSocketsocket;

privateNeternet;

privateStringuser;

privateRecorderrecord;

publicQQMain(){

init();

chat=newQQChat();

this.setBounds(300,100,300,400);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setResizable(false);

}

//界面布局按钮

publicvoidinit(){

txtSend=newJTextArea();

scrollSend=newJScrollPane(txtSend);

txtMess=newJTextArea();

scrollMess=newJScrollPane(txtMess);

txtMess.setEditable(false);

btnSend=newJButton("发送");

btnSend.addActionListener(this);

btnCancel=newJButton("取消");

btnMess=newJButton("聊天记录");

btnMess.addActionListener(this);

jbList=newJComboBox();

jpSmall=newJPanel();

jpSmall.add(jbList);

jpSmall.add(btnSend);

jpSmall.add(btnCancel);

jpSmall.add(btnMess);

jpBig=newJPanel();

jpBig.setLayout(newBorderLayout());

jpBig.add(jpSmall,BorderLayout.NORTH);

jpBig.add(scrollSend,BorderLayout.CENTER);

this.setLayout(newGridLayout(2,1));

this.add(scrollMess);

this.add(jpBig);

this.addWindowListener(this);

}

@Override

publicvoidactionPerformed(ActionEvente){

if(e.getActionCommand().equals("发送")){

try{

// OutputStreamos=socket.getOutputStream();

// OutputStreamWriterosw=newOutputStreamWriter(os);

// PrintWriterpw=newPrintWriter(osw,true);

Stringmess=txtSend.getText();

Stringto=jbList.getSelectedItem().toString();

if(!mess.equals("")){

// pw.println("[CHAT]:"+mess);

net.send("[chat]%"+user+":"+to+":"+mess);

txtSend.setText("");

}

// txtMess.append(mess+"\n");

// chat.getArea().append(mess+"\n");

}catch(Exceptione1){

e1.printStackTrace();

}

}

if(e.getActionCommand().equals("聊天记录")){

score++;

if(score%2==1){

chat.setVisible(true);

}else{

chat.setVisible(false);

}

}

}

// publicvoidwriteChat(){

// try{

// Filechat=newFile("F:/java/chat.txt");

//

// FileWriterfw=newFileWriter(chat,true);

// PrintWriterpw=newPrintWriter(fw);

//

// Strings=txtSend.getText();

// pw.println(s);

// pw.flush();

//

// }catch(Exceptione){

// e.printStackTrace();

// }

// }

//

publicvoidsetNeter(Neternet,Stringuser){

this.net=net;

this.user=user;

jbList.addItem(user);

this.setTitle(user);

record=newRecorder("F:/java/"+user+".txt");

chat.getArea().append(record.read());

Threadt=newThread(this);

t.start();

}

@Override

publicvoidrun(){

while(true){

Stringstr=net.recieve();

Stringtype=str.split("%")[0];

Stringmess=str.split("%")[1];

if(type.equals("[chat]")){

Stringfrom=mess.split(":")[0];

Stringmessage=mess.split(":")[1];

txtMess.append(from+"说:"+message+"\n");

record.write(from+"说:"+message+"\n");

chat.getArea().append(from+"说:"+message+"\n");

}elseif(type.equals("[add]")){

jbList.addItem(mess);

}elseif(type.equals("[exit]")){

txtMess.append(mess+"已退出\n");

}

}

}

publicstaticvoidmain(String[]args){

QQMainmain=newQQMain();

main.setVisible(true);

}

@Override

publicvoidwindowOpened(WindowEvente){

//TODOAuto-generatedmethodstub

}

@Override

publicvoidwindowClosing(WindowEvente){

inti=JOptionPane.showConfirmDialog(this,"是否关闭?","QQchat",JOptionPane.OK_CANCEL_OPTION);

if(i==JOptionPane.OK_OPTION){

net.send("[exit]%"+user);

System.exit(1);

}else{

this.setVisible(true);

}

}

@Override

publicvoidwindowClosed(WindowEvente){

}

@Override

publicvoidwindowIconified(WindowEvente){

}

@Override

publicvoidwindowDeiconified(WindowEvente){

}

@Override

publicvoidwindowActivated(WindowEvente){

}

@Override

publicvoidwindowDeactivated(WindowEvente){

}

}

//QQ聊天程序聊天记录界面

importjavax.swing.JFrame;

importjavax.swing.JScrollPane;

importjavax.swing.JTextArea;

importjava.io.File;

importjava.io.FileReader;

importjava.io.BufferedReader;

publicclassQQChatextendsJFrame{

privateJTextAreaareaMess;

privateJScrollPanescrollMess;

publicQQChat(){

areaMess=newJTextArea();

scrollMess=newJScrollPane(areaMess);

areaMess.setEditable(false);

// chatFile();

this.add(scrollMess);

this.setResizable(false);

// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setBounds(620,100,300,400);;

}

publicJTextAreagetArea(){

returnareaMess;

}

// publicvoidchatFile(){

// try{

// Filechat=newFile("F:/java/chat.txt");

// FileReaderfr=newFileReader(chat);

//

// BufferedReaderbr=newBufferedReader(fr);

//

// StringBuffers=newStringBuffer();

// while(br.ready()){

// s.append(br.readLine()+"\n");

// }

// areaMess.setText(s.toString());

// }catch(Exceptione){

// e.printStackTrace();

// }

// }

// publicstaticvoidmain(String[]args){

// QQChatchat=newQQChat();

// chat.setVisible(true);

// }

}

优质内容筛选与推荐>>
1、Segues
2、Linux 命令大全
3、部署SSH证书使PuTTY免密码登陆LINUX
4、spring batch 学习 (转载)
5、sql常用函数instr()和substr()


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号