⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatframe.java

📁 和qq相似的网络聊天工具
💻 JAVA
字号:
/* * ChatFrame.java * * Created on 2005年12月21日, 下午7:08 */package javaicqproj;/** * * @author  hurysa */import java.util.*;import java.io.*;import java.net.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class ChatFrame extends javax.swing.JFrame implements Runnable{    private String myname;    private String friendip;    private String friendname;    private String friendstatus;    private int sendport;    private int recport;    DatagramPacket sendPacket,receivePacket;    DatagramSocket sendSocket,receiveSocket;    Thread thread;    ServerSocket transfileserverSocket;    Socket transfilesocket;    private boolean endthread=false;    /** Creates new form ChatFrame */    public ChatFrame(String myname, String friendname, String friendstatus, String friendip, int sendport, int recport) {        initComponents();        this.myname=myname;        this.friendname=friendname;        this.friendip=friendip;        this.friendstatus=friendstatus;        this.sendport=sendport;        this.recport=recport;        try{            sendSocket=new DatagramSocket();            receiveSocket=new DatagramSocket(recport);            //在sendport端口创建接收文件套结字            transfileserverSocket=new ServerSocket(sendport);            new receiveFileThread();        }        catch(SocketException se){            se.printStackTrace();            System.out.println("false udp create!");        }        catch(IOException ioe){}        jChatTitle.setText("与“"+friendname+"”聊天中");        jChatStatus.setText("对方状态:"+friendstatus);        this.setBounds(400, 300, 400, 300);        this.setVisible(true);        thread=new Thread(this);// 监听消息线程        thread.start();            }        /** This method is called from within the constructor to     * initialize the form.     * WARNING: Do NOT modify this code. The content of this method is     * always regenerated by the Form Editor.     */    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents    private void initComponents() {        jPanel4 = new javax.swing.JPanel();        jChatTitle = new javax.swing.JLabel();        jChatStatus = new javax.swing.JLabel();        jSplitPane1 = new javax.swing.JSplitPane();        jAllMessageText = new javax.swing.JTextArea();        jSendText = new javax.swing.JTextArea();        jPanel5 = new javax.swing.JPanel();        jSendMsgButton = new javax.swing.JButton();        jSendFileButton = new javax.swing.JButton();        jCloseButton = new javax.swing.JButton();        jPanel4.setLayout(new java.awt.GridLayout(1, 0));        jChatTitle.setFont(new java.awt.Font("宋体", 0, 14));        jChatTitle.setForeground(new java.awt.Color(255, 51, 51));        jChatTitle.setText("\u4e0e\u804a\u5929\u4e2d");        jPanel4.add(jChatTitle);        jChatStatus.setFont(new java.awt.Font("宋体", 0, 14));        jChatStatus.setForeground(new java.awt.Color(0, 153, 153));        jChatStatus.setText("\u72b6\u6001");        jPanel4.add(jChatStatus);        getContentPane().add(jPanel4, java.awt.BorderLayout.NORTH);        jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);        jSplitPane1.setResizeWeight(0.7);        jSplitPane1.setLeftComponent(jAllMessageText);        jSplitPane1.setRightComponent(jSendText);        getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);        jSendMsgButton.setText("\u53d1\u9001\u6d88\u606f");        jSendMsgButton.addActionListener(new java.awt.event.ActionListener() {            public void actionPerformed(java.awt.event.ActionEvent evt) {                jSendMsgButtonActionPerformed(evt);            }        });        jPanel5.add(jSendMsgButton);        jSendFileButton.setText("\u4f20\u9001\u6587\u4ef6");        jSendFileButton.addActionListener(new java.awt.event.ActionListener() {            public void actionPerformed(java.awt.event.ActionEvent evt) {                jSendFileButtonActionPerformed(evt);            }        });        jPanel5.add(jSendFileButton);        jCloseButton.setText("\u5173\u95ed\u7a97\u53e3");        jCloseButton.addActionListener(new java.awt.event.ActionListener() {            public void actionPerformed(java.awt.event.ActionEvent evt) {                jCloseButtonActionPerformed(evt);            }        });        jPanel5.add(jCloseButton);        getContentPane().add(jPanel5, java.awt.BorderLayout.SOUTH);        pack();    }    // </editor-fold>//GEN-END:initComponents    private void jSendFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jSendFileButtonActionPerformed// TODO add your handling code here:        JFileChooser chooser = new JFileChooser();        int returnVal = chooser.showOpenDialog(this);        if(returnVal == JFileChooser.APPROVE_OPTION) {            File file=chooser.getSelectedFile();            new sendFileThread(file);        }    }//GEN-LAST:event_jSendFileButtonActionPerformed    public final class sendFileThread extends Thread {        private File transferFile = null;        public sendFileThread(File file) {            transferFile = file;            this.start();        }        public void run() {           try{               Socket socket=new Socket(InetAddress.getByName(friendip),recport);//连接                          BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流               PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//创建输出流               out.println(transferFile.getName());               jAllMessageText.append("正在向"+friendname+"请求传送文件"+transferFile.getName()+"\n");               //等待对方的控制信息,是否传送文件               String response=in.readLine().trim();               if(response.equals("transfer")){                   //传送文件                   jAllMessageText.append(friendname+"接受了您的请求!正在传送文件......\n");                   DataInputStream dis = new DataInputStream(new FileInputStream(transferFile));                   DataOutputStream dos = new DataOutputStream(socket.getOutputStream());                   int readFileLength = 0;                   byte[] bbuf = new byte[2048];                   while((readFileLength = dis.read(bbuf))!=-1){                       dos.write(bbuf, 0, readFileLength);                   }                   dis.close();                   dos.close();                   jAllMessageText.append("文件传送完毕\n");               }               else if(response.equals("refuse")){                   jAllMessageText.append("对方谢绝了您的文件传输请求!\n");                                  }               in.close();               out.close();               socket.close();           }           catch(IOException ioe){               JOptionPane.showMessageDialog(null,"发送文件失败","",JOptionPane.INFORMATION_MESSAGE);           }        }    }        private void jCloseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCloseButtonActionPerformed// TODO add your handling code here:        endthread=true;        sendSocket.close();        receiveSocket.close();        this.dispose();    }//GEN-LAST:event_jCloseButtonActionPerformed    private void jSendMsgButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jSendMsgButtonActionPerformed        if(friendstatus=="离线"){// 暂存发送内容            JOptionPane.showMessageDialog(this,"对方不在线,无法收到您的消息!","ok",JOptionPane.INFORMATION_MESSAGE);                    }        else{            try{                String s=jSendText.getText().trim();                if(s.equals("")||s == null){                    JOptionPane.showMessageDialog(this,"不能发送空信息!");                    return;                }                byte[] data=s.getBytes();                sendPacket=new DatagramPacket(data,s.length(),InetAddress.getByName(friendip),sendport);                sendSocket.send(sendPacket);                jSendText.setText("");                jAllMessageText.append(myname+":"+s+"\n");            }            catch(IOException e2){                e2.printStackTrace();                jAllMessageText.append("消息发送失败!\n");            }        }     }//GEN-LAST:event_jSendMsgButtonActionPerformed    public void run(){        byte array[]=new byte[512];        while(!endthread){            try{                for(int x=0;x<512;x++)array[x]=' ';                //创建数据报                receivePacket=new DatagramPacket(array,array.length);                receiveSocket.receive(receivePacket);                byte[] data=receivePacket.getData();                String received=new String(data,0,data.length);                jAllMessageText.append(friendname+":"+received.trim()+"\n");            }            catch(IOException ioe){                ioe.printStackTrace();            }        }    }    public final class receiveFileThread extends Thread{        Object[] options = { "接收", "谢绝" };                public receiveFileThread() {            this.start();        }        public void run() {            while(true){                try{                    transfilesocket=transfileserverSocket.accept();//无限监听客户的请求                    BufferedReader in=new BufferedReader(new InputStreamReader(transfilesocket.getInputStream()));//创建输入流                    PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(transfilesocket.getOutputStream())),true);//创建输出流                    //询问对方所要传送的文件名称                    String fileName=in.readLine();                    //弹出提示对话框判断是否接收文件传送的请求                    if(JOptionPane.showOptionDialog(null,"是否接收文件"+fileName,"选择是否接收文件",                            JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,                            null, options, options[0])==JOptionPane.YES_OPTION){                        out.println("transfer");//接收文件                        jAllMessageText.append("正在接收"+friendname+"的文件"+fileName+"......\n");                        //弹出保存文件对话框                        JFileChooser chooser = new JFileChooser();                        chooser.setSelectedFile(new File(fileName));                        if(chooser.showSaveDialog(null)==JFileChooser.APPROVE_OPTION){                            DataOutputStream dos = new DataOutputStream(new FileOutputStream(chooser.getSelectedFile()));                            DataInputStream dis = new DataInputStream(transfilesocket.getInputStream());                            byte[] bbuf = new byte[2048];                            int readLength=0;                            while((readLength=dis.read(bbuf))!=-1){                                dos.write(bbuf, 0, readLength);                            }                            dos.close();                            dis.close();                            jAllMessageText.append("文件传送完毕\n");                        }                        else jAllMessageText.append("文件未保存\n");                    }                    else{                        out.println("refuse"); //拒绝接收文件                        jAllMessageText.append("您己经谢绝了接收来自"+friendname+"的文件"+fileName+"\n");                    }                    in.close();                    out.close();                    transfilesocket.close();                }                catch(IOException ioe){}            }        }    }        // Variables declaration - do not modify//GEN-BEGIN:variables    private javax.swing.JTextArea jAllMessageText;    private javax.swing.JLabel jChatStatus;    private javax.swing.JLabel jChatTitle;    private javax.swing.JButton jCloseButton;    private javax.swing.JPanel jPanel4;    private javax.swing.JPanel jPanel5;    private javax.swing.JButton jSendFileButton;    private javax.swing.JButton jSendMsgButton;    private javax.swing.JTextArea jSendText;    private javax.swing.JSplitPane jSplitPane1;    // End of variables declaration//GEN-END:variables    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -