> 文档中心 > 纯JAVA模拟QQ聊天互动程序

纯JAVA模拟QQ聊天互动程序


实现的功能、步骤:

1、定义JFrame窗体中的组件

2、在构造方法中初始化窗体的组件

3、使用网络编程完成数据的传输(TCP,UDP协议)

4、实现发送按钮的监听点击事件

5、实现回车键发送数据  

功能演示:

没有点发送,数据却发送出去了是因为按了回车键 

 运用到的知识点有:

GUI:java实现窗体、Swing。其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。 

TCP(Transmission Control Protocol):传输控制协议。

 服务端:

注意:一定要先启动服务端,再启动客户端。不然会造成数据丢失

import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.*;import java.net.ServerSocket;import java.net.Socket;//服务端//注意:一定要先启动服务端,再启动客户端,不然会造成数据丢失public class QQ简易聊天功能 extends JFrame implements ActionListener, KeyListener {    public static void main(String[] args) { //调用构造方法 new QQ简易聊天功能();    }    //文本域    private JTextArea jta;    //滚动条    private JScrollPane jsp;    //面板    private JPanel jp;    //文本框    private JTextField jtf;    //按钮    private JButton jb;    //输出流    private BufferedWriter bw=null;    //构造方法    public QQ简易聊天功能(){ //初始化组件 jta=new JTextArea(); //设置文本域不可编辑 jta.setEditable(false); //将文本域添加到滚动条中,实现滚动效果 jsp=new JScrollPane(jta); //面板 jp=new JPanel(); jtf=new JTextField(10); jb=new JButton("发送"); //将文本框和按钮添加到面板中 jp.add(jtf); jp.add(jb); //将滚动条和面板都添加到窗体中 this.add(jsp, BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); this.setTitle("QQ聊天服务端"); this.setSize(300,300); this.setLocation(300,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//设置组件显示 //TCP服务端 //给发送按钮绑定一个监听点击事件 jb.addActionListener(this); //给文本框绑定一个键盘点击事件 jtf.addKeyListener(this); try{     //创建一个服务端的套接字     ServerSocket serverSocket=new ServerSocket(8888);     //等待客户端的连接     Socket socket=serverSocket.accept();     //获取Socket通道的输入流     //InputStream in=socket.getInputStream();     BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));     //获取Socket通道的输出流     bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));     //读取数据     String Line=null;     while ((Line=br.readLine())!=null){  jta.append(Line+System.lineSeparator());//拼接后换行     }     //关闭serverSocket通道     serverSocket.close(); }catch(Exception e){     e.printStackTrace(); }    }    @Override    public void actionPerformed(ActionEvent e) { //调用发送数据的方法 data();    }    //行为    @Override    public void keyPressed(KeyEvent e) { //判断是否是回车键 if(e.getKeyCode()==KeyEvent.VK_ENTER);{     //发送数据到Socket管道中     data(); }    }    @Override    public void keyTyped(KeyEvent e) {    }    @Override    public void keyReleased(KeyEvent e) {    }    //定义一个方法,实现发送数据到Socket管道中    private void data(){ //获取文本框中的内容 String text=jtf.getText(); //拼接需要发送的内容 text=this.getTitle()+": "+text;//获取发送人的名字和内容 //发送 try {     bw.write(text);     bw.newLine();//换行     bw.flush();//刷新     //发送完后,文本框内应没有内容     jtf.setText(null); } catch (Exception ex) {     ex.printStackTrace(); }    }}

 客户端:

import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.*;import java.net.ServerSocket;import java.net.Socket;class 客户端 extends JFrame implements ActionListener,KeyListener{    public static void main(String[] args) { //调用构造方法 new 客户端();    }    //文本域    private JTextArea jta;    //滚动条    private JScrollPane jsp;    //面板    private JPanel jp;    //文本框    private JTextField jtf;    //按钮    private JButton jb;    //输出流    private BufferedWriter bw=null;    //构造方法    public 客户端() { //初始化组件 jta=new JTextArea(); //设置文本域不可编辑 jta.setEditable(false); //将文本域添加到滚动条中,实现滚动效果 jsp=new JScrollPane(jta); //面板 jp=new JPanel(); jtf=new JTextField(10); jb=new JButton("发送"); //将文本框和按钮添加到面板中 jp.add(jtf); jp.add(jb); //将滚动条和面板都添加到窗体中 this.add(jsp, BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); this.setTitle("QQ聊天客户端"); this.setSize(300,300); this.setLocation(600,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//设置组件显示 //给发送按钮绑定一个监听点击事件 jb.addActionListener(this); //给文本框绑定一个键盘点击事件 jtf.addKeyListener(this); try {     //TCP客户端     //创建一个客户端的套接字(尝试连接)     Socket socket=new Socket("127.0.0.1",8888);     BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));     //获取Socket通道的输出流     bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));     //读取数据     String Line=null;     while ((Line=br.readLine())!=null){  jta.append(Line+System.lineSeparator());//拼接后换行     }     //关闭Socket通道     socket.close(); } catch (Exception e) {     e.printStackTrace(); }    }    @Override    public void actionPerformed(ActionEvent e) { //调用发送数据的方法 data();    }    @Override    public void keyPressed(KeyEvent e) { //判断是否是回车键 if(e.getKeyCode()==KeyEvent.VK_ENTER);{     //发送数据到Socket管道中     data(); }    }    @Override    public void keyTyped(KeyEvent e) {    }    @Override    public void keyReleased(KeyEvent e) {    }    //定义一个方法,实现发送数据到Socket管道中    private void data(){ //获取文本框中的内容 String text=jtf.getText(); //拼接需要发送的内容 text=this.getTitle()+": "+text;//获取发送人的名字和内容 //发送 try {     bw.write(text);     bw.newLine();//换行     bw.flush();//刷新     //发送完后,文本框内应没有内容     jtf.setText(null); } catch (Exception ex) {     ex.printStackTrace(); }    }}

 其实两个实现类百分之九十以上的代码都是一样的,只不过稍微有点名称的变动而已。