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

📄 chatclientframe.java~500~

📁 此软件为简单的实时通信软件,带文件传输与语音功能,类似于QQ
💻 JAVA~500~
📖 第 1 页 / 共 3 页
字号:
          String soukey=str.nextToken();
         if(soukey.equalsIgnoreCase("REQ")){
          parent.jTextArea1.append(souname + "请求语音聊天\n");
          setsp();
          souip=str.nextToken();
          jButton4.setEnabled(false);
          jButton6.setEnabled(true);
          jButton7.setEnabled(true);
          }
         else if(soukey.equalsIgnoreCase("CST")){
          parent.jTextArea1.append(souname + "同意语音聊天\n");
          setsp();
          souip=str.nextToken();
          try
           {
               Socket cli=new Socket(souip,5999);
               parent.cap=new Capture(cli);
               parent.cap.start();
         }
          catch(Exception ee){
           jTextArea1.append("Error:"+ee+"\n");
           setsp();
           }
          }
         else if(soukey.equalsIgnoreCase("REF")){
          parent.jTextArea1.append(souname + "拒绝语音聊天\n");
           jButton4.setEnabled(true);
           jButton8.setEnabled(false);
          }
          else if(soukey.equalsIgnoreCase("QUIT")){
            parent.jTextArea1.append("与"+souname + "语音聊天结束\n");
            setsp();
            jButton4.setEnabled(true);
            jButton8.setEnabled(false);
            try
             {
             if(player!=null){
               player.stop();
             }
            if(cap!=null){
             cap.stop();
             }
           }
           catch(Exception ee){
           jTextArea1.append("Error:"+ee+"\n");
           setsp();
           }
         }
        }
        else if (keyword.equalsIgnoreCase("FILE")) {
          String broadcast = str.nextToken();
          filefname= str.nextToken();
          String filekey=str.nextToken();
           if(filekey.equalsIgnoreCase("REQ")){
             jButton5.setEnabled(false);
             jButton9.setEnabled(true);
             jButton10.setEnabled(true);
             filesip=str.nextToken();
             filename=str.nextToken();
             parent.jTextArea1.append(filefname+"发送文件"+filename+"\n");
             setsp();
             }
           else if(filekey.equalsIgnoreCase("CST")){
            long len=Long.parseLong(str.nextToken());
             parent.jTextArea1.append(filefname + "同意接收文件"+filesname+"!\n");
             setsp();
             filesend=new filesend(filespath+filesname,len);
             StringBuffer fmessage=new StringBuffer("FILE:");
             fmessage.append(filefname+":");
             fmessage.append(listen.name);
             fmessage.append(":CSTB:");
             ps.println(fmessage);
             ps.flush();
             }
           else if(filekey.equalsIgnoreCase("CSTB")){
            filesave = new filesave("D:\\Temp\\", filesip,filelen);
            }
           else if(filekey.equalsIgnoreCase("REF")){
             jButton11.setEnabled(false);
             jButton5.setEnabled(true);
             parent.jTextArea1.append(filefname + "拒绝接收文件"+filesname+"!\n");
             setsp();
             }
            else if(filekey.equalsIgnoreCase("STOP")){
              jButton11.setEnabled(false);
              jButton5.setEnabled(true);
                if(filesend!=null) {
                  filesend.stopfs();
                  parent.jTextArea1.append(filefname+"停止文件接收!文件停止发送!\n");
                  setsp();
                  parent.jLabel6.setText("文件状态:没有文件传输");
                  }
                else if(filesave!=null){
                  filesave.stopsf();
                  parent.jTextArea1.append(filefname+"停止文件发送!文件停止接收!\n");
                  setsp();
                  parent.jLabel6.setText("文件状态:没有文件传输");
                }
                else
                  parent.jTextArea1.append("文件传输请求取消!\n");
                  setsp();
              }
          }
        else if (keyword.equalsIgnoreCase("WELCOME")) {
          parent.jTextArea1.append(jTextField3.getText()+"登陆成功"+"\n");
          setsp();
          count++;
          parent.jLabel4.setText("目前用户数:"+String.valueOf(count));
          parent.jLabel5.setText("已连接");
          parent.jList1.setModel(dld);
          dld.addElement(jTextField3.getText());
        }
        else if (keyword.equalsIgnoreCase("FAULTNAME")) {
          parent.jTextArea1.append("用户名错误!\n");
          setsp();
        }
      }
    }
  }

  public void setsp(){
  int height=10;
  Point p = new Point();
  p.setLocation(0,(jTextArea1.getLineCount()+5)*height);
  jScrollPane2.getViewport().setViewPosition(p);
  }

  public void disconnect(){
          if(socket!=null){
                  try{
                          ps.println("QUIT:"+listen.name);
                          ps.flush();
                          socket.close();
                          count--;
                  }
                   catch(IOException e){
                  jTextArea1.append("Error:"+e);
                  setsp();
              }
     }
  }

  void jButton3_actionPerformed(ActionEvent e) {
    disconnect();
    System.exit(0);
  }

  void this_windowClosing(WindowEvent e) {
    disconnect();
    System.exit(0);
  }

  void jButton4_actionPerformed(ActionEvent e) {
    if(jList1.getSelectedValue()!=null){
    jButton8.setEnabled(true);
    jButton4.setEnabled(false);
    jTextArea1.append("你请求与"+(String)jList1.getSelectedValue()+ "语音聊天\n");
    setsp();
    StringBuffer message=new StringBuffer("SOU:");
    message.append((String)jList1.getSelectedValue()+":");
    message.append(listen.name);
    message.append(":REQ:"+ip+":");
    ps.println(message);
    ps.flush();
    player=new Playback(6000);
    player.start();
    }
    else
   JOptionPane.showMessageDialog(null, "请选择用户!", "错误!",JOptionPane.INFORMATION_MESSAGE);
}

  void jButton6_actionPerformed(ActionEvent e) {
    jButton6.setEnabled(false);
    jButton7.setEnabled(false);
    jButton8.setEnabled(true);
    jTextArea1.append("你同意与"+souname+ "语音聊天\n");
    setsp();
    StringBuffer message=new StringBuffer("SOU:");
    message.append(souname+":");
    message.append(listen.name);
    message.append(":CST:"+ip+":");
    ps.println(message);
    ps.flush();
    try
    {
    Socket cli=new Socket(souip,6000);
    cap=new Capture(cli);
    cap.start();
    player=new Playback(5999);
    player.start();
    }
    catch(Exception ee){
    jTextArea1.append("Error:"+ee+"\n");
    setsp();
    }
  }

  void jButton7_actionPerformed(ActionEvent e) {
    jButton6.setEnabled(false);
    jButton7.setEnabled(false);
    jButton4.setEnabled(true);
    jTextArea1.append("你拒绝与"+souname+ "语音聊天\n");
    setsp();
    StringBuffer message=new StringBuffer("SOU:");
    message.append(souname+":");
    message.append(listen.name);
    message.append(":REF:");
    ps.println(message);
    ps.flush();
  }

  void jButton8_actionPerformed(ActionEvent e) {
    jButton4.setEnabled(true);
    jButton8.setEnabled(false);
    jTextArea1.append("与"+souname+"语音聊天结束\n");
    setsp();
    StringBuffer message=new StringBuffer("SOU:");
    message.append(souname+":");
    message.append(listen.name);
    message.append(":QUIT:");
    ps.println(message);
    ps.flush();
    try
   {
     if(player!=null){
     player.stop();
    }
    if(cap!=null){
     cap.stop();
    }
   }
   catch(Exception ee){
   jTextArea1.append("Error:"+ee+"\n");
   setsp();
   }
}

  void jButton5_actionPerformed(ActionEvent e) {
  if(jList1.getSelectedValue()!=null){
    FileDialog f1=new FileDialog(this,"打开",FileDialog.LOAD);
    f1.show();
    filesname=f1.getFile();
    filespath=f1.getDirectory();
   if(filesname!=null) {
   jButton5.setEnabled(false);
   jButton11.setEnabled(true);
   jTextArea1.append("你请求发送文件"+filesname+"给"+(String)jList1.getSelectedValue()+"!\n");
   setsp();
   StringBuffer message=new StringBuffer("FILE:");
   message.append((String)jList1.getSelectedValue()+":");
   message.append(listen.name);
   message.append(":REQ:"+ip+":"+filesname);
   ps.println(message);
   ps.flush();
   }
  }
  else
   JOptionPane.showMessageDialog(null, "请选择用户!", "错误!",JOptionPane.INFORMATION_MESSAGE);
}

  void jButton9_actionPerformed(ActionEvent e) {
       jButton9.setEnabled(false);
       jButton10.setEnabled(false);
       jButton11.setEnabled(true);
       jTextArea1.append("你同意接收文件"+filename+ "!\n");
       setsp();
       File myfile=new File("D:\\Temp\\"+filename);
      if(myfile.exists()){
       filelen=myfile.length();
       jTextArea1.append("文件"+filename+ "已存在,继续接收!\n");
       setsp();
       }
       else {
       filelen=0;
       }
       StringBuffer message=new StringBuffer("FILE:");
       message.append(filefname+":");
       message.append(listen.name);
       message.append(":CST:"+filelen+":");
       ps.println(message);
       ps.flush();
  }

  void jButton10_actionPerformed(ActionEvent e) {
       jTextArea1.append("你拒绝接受文件"+filename+ "!\n");
       setsp();
       StringBuffer message=new StringBuffer("FILE:");
       message.append(filefname+":");
       message.append(listen.name);
       message.append(":REF:"+ip+":");
       ps.println(message);
       ps.flush();
  }

  void jButton11_actionPerformed(ActionEvent e) {
  jButton11.setEnabled(false);
  jButton5.setEnabled(true);
  if(filesend!=null) {
     filesend.stopfs();
      jTextArea1.append("你停止发送文件"+filesname+ "!\n");
      setsp();
      jLabel6.setText("文件状态:没有文件传输");
   }
   if(filesave!=null){
     filesave.stopsf();
      jTextArea1.append("你停止接收文件"+filename+ "!\n");
      setsp();
      jLabel6.setText("文件状态:没有文件传输");
   }
   StringBuffer message=new StringBuffer("FILE:");
   message.append(filefname+":");
   message.append(listen.name);
   message.append(":STOP:");
   ps.println(message);
   ps.flush();
  }


  class filesend {
      int port = 8821;
      long passedlen = 0;
      long  filelen;
       String filePath;
       Thread a;
       ServerSocket ss;
       Socket s;
       RandomAccessFile fis;
       DataOutputStream ps;

     public filesend(String file,long len){
      filePath=file;
      filelen=len;
      a=new watch();
      a.start();
      }
      void stopfs(){
       try{
        a.stop();
        ps.flush();
        fis.close();
        s.close();
        ss.close();
      }
      catch (Exception e) {
      }
     }
      class watch extends Thread {
        public void run() {
          try {
            ss = new ServerSocket(port);
            while (true) {
              // 选择进行传输的文件
              File fi = new File(filePath);
              // public Socket accept() throws
              // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。

              s = ss.accept();
              jTextArea1.append("开始发送文件!\n");
              setsp();
              DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
              dis.readByte();

              fis = new RandomAccessFile(filePath, "rw");
              ps = new DataOutputStream(s.getOutputStream());
              //将文件名及长度传给客户端。
              ps.writeUTF(fi.getName());
              ps.flush();
              ps.writeLong( (long) fi.length());
              ps.flush();
            int bufferSize = 8192;
            byte[] buf = new byte[bufferSize];
            long lenl = (long) fi.length() / bufferSize;
              passedlen = filelen / bufferSize;
              fis.seek(filelen);
              while (true) {
                int read = 0;
                if (fis != null) {
                  read = fis.read(buf);
                }
                passedlen += 1;
                if (read == -1) {
                  break;
                }
                jLabel6.setText("文件状态:文件发送了" + (passedlen * 100 / lenl) + "%");
                ps.write(buf);
              }
              ps.flush();
              // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
              // 直到socket超时,导致数据不完整。
              fis.close();
              s.close();

⌨️ 快捷键说明

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