Java实现简单的QQ聊天
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、以下是完整的代码:
1、ChatServe.java:
package Chat; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException;
import java.io.IOException; import java.net.*; import java.util.*; public class ChatServer { static boolean started = false; static boolean bconnected = false; static ServerSocket ss = null; static Socket s = null; ArrayList<Client> clients = new ArrayList<Client>(); public static void main(String[] args) { new ChatServer().start(); } public void start(){ try { ss = new ServerSocket(8888); started=true; }catch (BindException e) { System.out.println("端口使用中......."); }catch (IOException e) { e.printStackTrace(); } try{ while(started){ s = ss.accept(); Client c = new Client(s); System.out.println("a client connect"); new Thread(c).start(); clients.add(c); } }catch (IOException e) { e.printStackTrace(); }finally{ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } }
class Client implements Runnable{ private Socket s; private DataInputStream dis = null; private DataOutputStream dos =null; public Client(Socket s){ this.s=s; try { dis = new DataInputStream( s.getInputStream()); dos = new DataOutputStream( s.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } bconnected=true; } public void send(String str){ try { dos.writeUTF(str); dos.flush(); } catch(NullPointerException e){ System.out.println("对方已经关闭流!"); }catch (IOException e) { clients.remove(this); System.out.println("对方退出了,我从 List 中删除了!"); } } public void run() { try { while(bconnected){ String str= dis.readUTF(); System.out.println(str); for(int i = 0; i<clients.size(); i++){ Client c = clients.get(i); c.send(str); } } }catch (EOFException e) { System.out.println("client closed!"); }catch (IOException e) { e.printStackTrace(); }finally{
5、聊天
用户双方各自拥有一个像这样的聊天窗口。 该程序也可以实现多人聊天,只要再启动一个 Login.java ,也就是再注册一 个用户 luoxue,也会参与进来进行聊天!
其中:聊天记录按钮未实现,大家自己实现吧。 6、写该程序目的: 主要是为了综合运用所学的知识, 锻炼以下自己实战能力。 程序是调出来的, 也就是大家一定要细心找到程序所出错的地方。 其次, 我们都是站在巨人的肩上, 所以有很多事不必劳心,但是该是我们所学所练大家一定不能放弃,坚持! 程序有不足之处,希望各路朋友指点。
try{ if(s != null) s.close(); if(dis != null) dis.close(); if(dos != null) { dos.close(); dos = null; } }catch (IOException e) { e.printStackTrace(); } } } } }
正确输入个人信息,提交。就会将信息写人数据库 test 中的 jdbctest 表中。 注意: 创建表时, 各字段的容量大小。 输入的字符不能超过容量, 否则写人失败, 会提示注册失败。 3、聊天窗口 用张三登录,输入密码。密码输入错误时,登录界面上提示登录失败。
密码正确就会进入聊天窗口,如下:
4、相同的方法, 再注册一个用户, 再运行一次 Login.java 。 注册完后,用 xiaozhu 登录。 成功登录后,这两个用户之间就可以实现聊天。 一定要注意:程序运行,必须先运行 ChatServer.java ,只有先让服务起来之后, 才能有效地运行客户端程序 Login.java、ChatClient.java 等程序。
public void actionPerformed(ActionEvent e){ if(e.getSource()==reset){ //判断触发器源是否是提交按钮 nameText.setText("") ;//设置文本框中的内容 passText.setText("") ;//设置文本框中的内容 infoLab.setText("用户登陆系统") ;//恢复标签显示 } } }) ; frame.addWindowListener(new WindowAdapter(){//加入窗口监听 public void windowClosing(WindowEvent e){ System.exit(0); } }); frame.setLayout(null) ;//使用绝对定位 nameLab.setBounds(5,5,60,20) ; passLab.setBounds(5,30,60,20) ; infoLab.setBounds(5,65,220,30) ; nameText.setBounds(65,5,100,20) ; passText.setBounds(65,30,100,20) ; submit.setBounds(165,5,60,20) ; reset.setBounds(165,30,60,20) ; register.setBounds(80,95,90,20); frame.add(nameLab); frame.add(passLab); frame.add(infoLab); frame.add(nameText); frame.add(passText); frame.add(submit); frame.add(reset); frame.addΒιβλιοθήκη Baiduregister); frame.setSize(280,160); frame.getContentPane().setBackground(Color.pink) ; frame.setResizable(false); frame.setLocation(600,200) ; frame.setVisible(true) ; } public static void main(String args[]){ new Login();//登录实现 } }
2、Login.java:
package Register; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; import Chat.ChatClient; public class Login { boolean f=false;//按登录时设置的一个标志 private JFrame frame = new JFrame("QQ 登录窗口") ; private JButton submit = new JButton("登陆"); private JButton reset = new JButton("重置"); private JButton register = new JButton("立即注册"); private JLabel nameLab = new JLabel(" 用户名:") ; private JLabel passLab = new JLabel("密 码:") ; private JLabel infoLab = new JLabel(" 用户登陆系统");
private JTextField nameText = new JTextField(10) ; private JPasswordField passText = new JPasswordField() ; public Login(){ Font fnt = new Font("Serief",Font.ITALIC + Font.BOLD,12) ; infoLab.setFont(fnt) ; submit.addActionListener(new ActionListener(){ //采用内部匿名类 public void actionPerformed(ActionEvent e){ if(e.getSource()==submit){ //判断触发器源是否是提交按钮 String tname = nameText.getText().trim(); //得到输入的用户名 String temppass = new String(passText.getPassword()) ;// 得 到 输入的密码,此时通过 getPassageword()方法返回的是字符数组 String tpass = temppass.trim(); LoginCheck log = new LoginCheck(tname,tpass) ;// 实 例 化 LoginCheck 对象,传入输入的用户名和密码 if(log.validate()){// 对用户名和密码进行验证 try{ Thread.sleep(2000); //2 秒后打开聊天窗口 f=true; //登录成功后的表示项为 true new ChatClient(tname); System.out.println("登录成功"); frame.dispose(); //关闭本窗口 }catch(Exception ee){//异常获取 } }else{ infoLab.setText("登陆失败,错误的用户名或密码! ") ;// 登录失败 } } } }); register.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ if(e.getSource()==register){ frame.dispose(); Register register = new Register(); register.setSize(600, 470); register.setLocationRelativeTo(null); register.setVisible(true); register.setResizable(false); } } }); reset.addActionListener(new ActionListener(){ //采用内部匿名类
Java 实现 QQ 聊天功能
一、界面的介绍
1、登录界面
第一次登录需要注册,该程序使用的数据库是 Mysql。首先要建立 test 数据 库,在 test 数据库中创建一个表 jdbctest。
从表中可以看出有 8 个字段,除 id 外(设置为自动分配) 。 2、注册界面 点击立刻注册按钮,会弹出注册窗口: