📄 chatframe.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 + -