Socket编程之聊天室(含客户端,服务端,带文件传输功能)

168 阅读8分钟

基于javaSwing和Socket的网络编程

客户端代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;

import static javax.swing.JFileChooser.FILES_ONLY;

public class ChatRoomClient extends JFrame {
    private JPanel jPanel;
    private JLabel jLabel1;
    private JLabel jLabel2;
    private  JLabel jLabel3;
    private JLabel jLabel4;
    private JTextField jTextField1;
    private JTextField jTextField2;
    private JTextField jTextField3;
    private JTextArea jTextArea;
    private JScrollPane jScrollPane;
    private JButton jButton1;
    private JButton jButton2;
    private JButton jButton3;
    private myactionlistener actionlistener=null;
    private JProgressBar jProgressBar;
    ChatRoomClient(String title){
        super(title);
        setLayout(null);
        setVisible(true);
        setBounds(700,250,450,650);
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        init();
    }
    private void init(){
        jLabel1=new JLabel("聊天室客户端");
        jLabel1.setBounds(125,0,300,50);
        jLabel1.setFont(new Font("宋体",Font.BOLD,25));
        jLabel2=new JLabel("IP:");
        jLabel2.setBounds(10,60,40,30);
        jLabel2.setFont(new Font("宋体",Font.BOLD,15));
        jLabel3=new JLabel("端口:");
        jLabel3.setBounds(210,60,50,30);
        jLabel3.setFont(new Font("宋体",Font.BOLD,15));
        jTextField1=new JTextField("");
        jTextField1.setBounds(55,60,150,30);
        jTextField2=new JTextField("");
        jTextField2.setBounds(265,60,60,30);
        jButton1=new JButton("连接");
        jButton1.setBounds(330,60,80,30);
        jButton1.setActionCommand("连接");
        jTextArea=new JTextArea("");
        jTextArea.setEditable(false);
        jScrollPane=new JScrollPane(jTextArea);
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane.setBounds(10,100,400,400);
        jTextField3=new JTextField("");
        jTextField3.setBounds(10,510,310,30);
        jButton2=new JButton("发送");
        jButton2.setBounds(330,510,80,30);
        jButton2.setActionCommand("发送");
        jButton3=new JButton("传输文件");
        jButton3.setBounds(330,550,80,30);
        jButton3.setFont(new Font("宋体",Font.BOLD,10));
        jButton3.setActionCommand("传输文件");
        jProgressBar=new JProgressBar();
        jProgressBar.setBounds(10,550,310,30);
        jProgressBar.setMaximum(100);
        jProgressBar.setMinimum(0);
        jProgressBar.setValue(0);
        jProgressBar.setStringPainted(true);
        jLabel4=new JLabel("");
        jLabel4.setBounds(220,640,80,30);
        jLabel4.setFont(new Font("宋体",Font.BOLD,10));
        jPanel=new JPanel();
        jPanel.setBounds(0,0,450,650);
        jPanel.setLayout(null);
        jPanel.setVisible(true);
        jPanel.add(jLabel1);
        jPanel.add(jLabel2);
        jPanel.add(jLabel3);
        jPanel.add(jLabel4);
        jPanel.add(jTextField1);
        jPanel.add(jTextField2);
        jPanel.add(jTextField3);
        jPanel.add(jScrollPane);
        jPanel.add(jButton1);
        jPanel.add(jButton2);
        jPanel.add(jButton3);
        jPanel.add(jProgressBar);
        add(jPanel);
        actionlistener=new myactionlistener(jTextField1,jTextField2,jTextField3,jTextArea,this,jLabel4,jProgressBar);
        actionlistener.setjButton3(jButton3);
        jButton1.addActionListener(actionlistener);
        jButton2.addActionListener(actionlistener);
        jButton3.addActionListener(actionlistener);
    }
    public static void main(String[] args) {

        new ChatRoomClient("聊天室客户端");

    }
}
class myactionlistener implements ActionListener{
    private JTextField jTextField1;
    private JTextField jTextField2;
    private JTextField jTextField3;
    private JTextArea jTextArea;
    private int port=0;
    private String serveraddr=null;
    private boolean action=false;
    private ChatRoomClient chatRoomClient;
    public Thread1 thread1=null;
    private JButton jButton=null;
    private FileThread1 fileThread1=null;
    private JLabel jLabel;
    private JProgressBar jProgressBar;
    public void setaction(boolean action){
        this.action=action;
    }
    public void setjButton3(JButton jButton){
        this.jButton=jButton;
    }
    myactionlistener(JTextField jTextField1,JTextField jTextField2,JTextField jTextField3,JTextArea jTextArea,ChatRoomClient chatRoomClient,JLabel jLabel,JProgressBar jProgressBar){
        this.jTextField1=jTextField1;
        this.jTextField2=jTextField2;
        this.jTextField3=jTextField3;
        this.jTextArea=jTextArea;
        this.chatRoomClient=chatRoomClient;
        this.jLabel=jLabel;
        this.jProgressBar=jProgressBar;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("连接")){
            if(jTextField1.getText().equals("")||jTextField2.getText().equals("")){
                JOptionPane.showMessageDialog(chatRoomClient,"请输入服务器IP地址和端口号!");
            }else{
                jTextArea.setText("");
                serveraddr=jTextField1.getText();
                port=Integer.parseInt((jTextField2.getText()));
                thread1=new Thread1(serveraddr,port,jTextField3,jTextArea,chatRoomClient,this,jButton);
                thread1.start();
                fileThread1=new FileThread1("192.168.0.104",port+1,jTextArea,chatRoomClient,this,jLabel,jProgressBar);
                fileThread1.start();
            }
        }
        else if(e.getActionCommand().equals("发送")){
            if(jTextField1.getText().equals("")||jTextField2.getText().equals("")){
                jTextField3.setText("");
                JOptionPane.showMessageDialog(chatRoomClient,"请先输入服务器IP地址和端口号!");
            }else if(!jTextField1.getText().equals("")&&!jTextField2.getText().equals("")&&action==false){
                JOptionPane.showMessageDialog(chatRoomClient,"请先连接服务器!");
            }else if(!jTextField1.getText().equals("")&&!jTextField2.getText().equals("")&&action==true&&jTextField3.getText().equals("")){
                JOptionPane.showMessageDialog(chatRoomClient,"请输入发送内容!");
            }else {
                try {
                    thread1.SetSendValue(jTextField3.getText());
                    jTextField3.setText("");
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
        else if(e.getActionCommand().equals("传输文件")){
            if(action==true){
                fileThread1.SendFile();
            }
        }
    }
}
class  Thread1 extends Thread{
    private JTextArea jTextArea;
    private JTextField jTextField;
    private String addr;
    private int port;
    private Socket clientsocket=null;
    private BufferedWriter out=null;
    private BufferedReader in=null;
    private String RecData;
    private ChatRoomClient chatRoomClient;
    private myactionlistener actionlistener;
    private JButton jButton=null;
    Thread1(String addr,int port,JTextField jTextField,JTextArea jTextArea,ChatRoomClient chatRoomClient,myactionlistener actionlistener,JButton jButton){
        super();
        this.addr=addr;
        this.port=port;
        this.jTextArea=jTextArea;
        this.jTextField=jTextField;
        this.chatRoomClient=chatRoomClient;
        this.actionlistener=actionlistener;
        this.jButton=jButton;
    }
    public void SetSendValue(String SendData) throws IOException {
        out.write(SendData);
        out.newLine();
        out.flush();
        jTextArea.append("客户机发送消息:"+SendData+"\n");
    }
    @Override
    public void run() {
        try{
            clientsocket=new Socket();
            SocketAddress remoteaddr=new InetSocketAddress(addr,port);
            jTextArea.append("创建客户端套接字成功!\n");
            clientsocket.connect(remoteaddr);
            JOptionPane.showMessageDialog(chatRoomClient,"客户机连接成功!");
            actionlistener.setaction(true);
            jTextArea.append("客户机使用的地址和端口"+clientsocket.getLocalSocketAddress()+"\n");
            in=new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
            out=new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream()));
            while((RecData=in.readLine())!=null) {
                    jTextArea.append("客户机收到消息:"+RecData+"\n");
            }
        }
        catch (IOException e){
            JOptionPane.showMessageDialog(chatRoomClient,"服务器IP地址端口错误或服务器未开启,连接失败!");
            jTextArea.setText("");
            actionlistener.setaction(false);
        }
        try{
            if(in!=null){
                in.close();
            }
            if(out!=null){
                out.close();
            }
            if(clientsocket!=null){
                clientsocket.close();
            }

        }
        catch (IOException e) {

        }
    }
}/*客户端文件传输线程*/
class FileThread1 extends Thread{
    private Socket filesocket=null;
    private DataOutputStream Dout=null;
    private DataInputStream Din=null;
    private JFileChooser jFileChooser=null;
    private JTextArea jTextArea;
    private String addr;
    private int port;
    private InetSocketAddress fileremotesocketaddr;
    private ChatRoomClient chatRoomClient=null;
    private myactionlistener Myactionlistener=null;
    private JLabel jLabel;
    private JProgressBar jProgressBar;
    FileThread1(String addr,int port,JTextArea jTextArea,ChatRoomClient chatRoomClient,myactionlistener Myactionlistener,JLabel jLabel,JProgressBar jProgressBar){
        this.addr=addr;
        this.port=port;
        this.jTextArea=jTextArea;
        this.chatRoomClient=chatRoomClient;
        this.Myactionlistener=Myactionlistener;
        this.jLabel=jLabel;
        this.jProgressBar=jProgressBar;
        /*初始化数据*/
    }
    public void SendFile(){/*传输文件方法*/
        jFileChooser=new JFileChooser();//文件传输弹出窗口
        jFileChooser.setFileSelectionMode(FILES_ONLY);//设置为仅传输文件模式
        jFileChooser.showDialog(chatRoomClient,"发送文件");
        File f=jFileChooser.getSelectedFile();//获得选择文件对象

        if(f!=null){
            byte[] data=new byte[1024];
            String filename=f.getName();
            jLabel.setText((filename));
            try{/*传输文件名和文件长度*/
                Dout.writeUTF(filename);
                Dout.flush();
                Dout.writeLong(f.length());
                Dout.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try{
                jTextArea.append("开始传输文件数据···········\n");
                Myactionlistener.thread1.SetSendValue("服务器正在向您传输文件··········");
                FileInputStream fin=new FileInputStream(f);//创建文件输入流读取文件数据
                int length=0;
                long progress=0;
                int progressrate=0;
                while ((length=fin.read(data,0,data.length))!=-1){//将文件中的数据读到data字节数组中并判断是否到达文件末尾
                    Dout.write(data,0,length);//将字节数组中的读出数据写入传输数据流
                    Dout.flush();//刷新缓冲区
                    progress+=length;
                    progressrate=(int)(100*progress/f.length());
                    jProgressBar.setValue(progressrate);//调整进度条进度
                }
                JOptionPane.showMessageDialog(chatRoomClient,"文件传输完成!");
                jTextArea.append("文件"+f.getName()+"传输完成\n");
                jProgressBar.setValue(0);//进度重置
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void run() {
        FileOutputStream fileOutputStream=null;
        try {
            fileremotesocketaddr=new InetSocketAddress(addr,port);
            filesocket=new Socket();
            filesocket.connect(fileremotesocketaddr);
            jTextArea.append("客户机传输文件的地址和端口"+filesocket.getLocalSocketAddress()+"\n");
            Dout=new DataOutputStream((filesocket.getOutputStream()));
            Din=new DataInputStream((filesocket.getInputStream()));
            while (filesocket.isConnected()&&!filesocket.isClosed()) {//判断当前是否处于连接状态,可持续监听文件传输
                String filename = Din.readUTF();//监听阻塞读取文件名
                long filelength = Din.readLong();//监听阻塞读取文件长度
                File file = new File("/home/hgd/桌面/" + filename);//在客户端的相应路径下新建文件
                if (!file.exists()) {
                    file.createNewFile();//判断文件对象是否在客户机中存在映射对象,若无则新建
                }
                jTextArea.append("正在接收文件:" + filename + "··········\n");
                fileOutputStream = new FileOutputStream(file);
                byte[] data = new byte[1024];
                int length = 0;
                int progress=0;
                int progressrate=0;
                while ((length = Din.read(data, 0, data.length)) != -1) {//不断读取发送过来的文件数据,直到传输完毕(无限制会阻塞)
                    fileOutputStream.write(data, 0, length);
                    fileOutputStream.flush();
                    progress+=length;
                    progressrate=(int)(100*progress/filelength);
                    jProgressBar.setValue(progressrate);//设置传输进度
                    if(progress==filelength)//传输完毕即退出当前循环,若无该限制则将陷入read的阻塞
                        break;
                }
                JOptionPane.showMessageDialog(chatRoomClient,"文件接收完成!");
                jTextArea.append("文件"+file.getName()+"接收完成\n");
                jProgressBar.setValue(0);//进度重置
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try{
            if(fileOutputStream!=null){
                fileOutputStream.close();
            }
            if (Din!=null){
                Din.close();
            }
            if (Dout != null) {
                Dout.close();
            }
            if (filesocket!=null){
                filesocket.close();
            }
        }
        catch (IOException e){
            System.out.println("异常信息"+e.getMessage());
        }

    }
}

服务端代码:

import jdk.nashorn.internal.scripts.JO;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Date;

import static javax.swing.JFileChooser.FILES_ONLY;

public class ChatRoomServer extends JFrame {
private JPanel jPanel;
private JLabel jLabel1;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JButton jButton1;
private JButton jButton2;
private JButton jButton3;
private JTextArea jTextArea;
private JTextField jTextField1;
private JTextField jTextField2;
private JProgressBar jProgressBar;
private mybuttonactionlistener buttonlistener;
public ChatRoomServer(String title){
    super(title);
    setLayout(null);
    setVisible(true);
    setBounds(700,250,510,500);
    setResizable(false);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     init();

}
public void init(){
    jPanel=new JPanel();
    jPanel.setLayout(null);
    jPanel.setBounds(0,0,510,500);
    jPanel.setVisible(true);
    jLabel1=new JLabel("聊天室服务端");
    jLabel1.setBounds(150,0,300,50);
    jLabel1.setFont(new Font("宋体",Font.BOLD,25));
    jLabel2=new JLabel("端口号:");
    jLabel2.setBounds(425,50,75,50);
    jLabel2.setFont(new Font("宋体",Font.BOLD,15));
    jLabel3=new JLabel("");
    jLabel3.setBounds(415,165,90,30);
    jLabel3.setFont(new Font("宋体",Font.BOLD,15));
    jLabel4=new JLabel(":文件传输进度");
    jLabel4.setBounds(415,410,85,30);
    jLabel4.setFont(new Font("宋体",Font.BOLD,12));
    jTextArea=new JTextArea();
    jTextField1=new JTextField("");
    jTextField2=new JTextField("");
    jProgressBar=new JProgressBar();
    jProgressBar.setBounds(10,410,400,30);
    jProgressBar.setMaximum(100);
    jProgressBar.setMinimum(0);
    jProgressBar.setValue(0);
    jProgressBar.setStringPainted(true);
    jButton1=new JButton("开启");
    jButton1.setBounds(415,120,65,30);
    buttonlistener=new mybuttonactionlistener(this,jTextArea,jLabel3,jProgressBar);
    buttonlistener.SetPortValue(jTextField1);
    jButton1.setActionCommand("开启");
    jButton1.addActionListener(buttonlistener);
    jButton3=new JButton("传输文件");
    jButton3.setBounds(415,200,80,30);
    jButton3.setFont(new Font("宋体",Font.BOLD,10));
    jButton3.setActionCommand("传输文件");
    jButton3.addActionListener(buttonlistener);
    jButton2=new JButton("发送");
    jButton2.setBounds(415,370,65,30);
    buttonlistener.SetSendValue(jTextField2);
    jButton2.setActionCommand("发送");
    jButton2.addActionListener(buttonlistener);
    jTextArea.setLineWrap(true);
    jTextArea.setEditable(false);
    jTextArea.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    JScrollPane jScrollPane=new JScrollPane(jTextArea);
    jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    jScrollPane.setBounds(10,60,400,300);
    jTextField1.setBounds(415,85,65,30);
    jTextField2.setBounds(10,370,400,30);
    jPanel.add(jLabel1);
    jPanel.add(jLabel2);
    jPanel.add(jLabel3);
    jPanel.add(jLabel4);
    jPanel.add(jTextField1);
    jPanel.add(jScrollPane);
    jPanel.add(jTextField2);
    jPanel.add(jButton1);
    jPanel.add(jButton2);
    jPanel.add(jButton3);
    jPanel.add(jProgressBar);
    add(jPanel);

}
    public static void main(String[] args) {
         new ChatRoomServer("聊天室服务端");
    }
}
class mybuttonactionlistener implements ActionListener {
    private JTextField jTextField1;
    private JTextField jTextField2;
    private ChatRoomServer chatRoomServer;
    private JTextArea jTextArea;
    private boolean action=false;
    public Thread2 thread2=null;
    private FileThread2 fileThread2=null;
    private JLabel jLabel;
    private JProgressBar jProgressBar;
    public void SetAction(boolean action){
        this.action=action;
    }
    public void SetPortValue(JTextField jTextField){
        this.jTextField1=jTextField;
    }
    public void SetSendValue(JTextField jTextField){
        this.jTextField2=jTextField;
    }
    mybuttonactionlistener(ChatRoomServer chatRoomServer,JTextArea jTextArea,JLabel jLabel,JProgressBar jProgressBar){
        super();
        this.chatRoomServer=chatRoomServer;
        this.jTextArea=jTextArea;
        this.jLabel=jLabel;
        this.jProgressBar=jProgressBar;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
       if(e.getActionCommand().equals("开启")){
           String portvalueString=jTextField1.getText();
           if(portvalueString.equals("")){
               JOptionPane.showMessageDialog(chatRoomServer,"请输入端口值!");
           }
           else if(!portvalueString.equals("")&&action==false){
               int portvalueInt=Integer.parseInt(portvalueString);
               thread2=new Thread2(portvalueInt,jTextArea,chatRoomServer,jLabel,this);
               thread2.start();
               fileThread2=new FileThread2("192.168.0.104",portvalueInt+1,jTextArea,chatRoomServer,this,jLabel,jProgressBar);
               fileThread2.start();
           }
       }
       else if(e.getActionCommand().equals("发送")){
           if(jTextField1.getText().equals("")){
               JOptionPane.showMessageDialog(chatRoomServer,"请先输入端口值!");
           }
           else if(!jTextField1.getText().equals("") && jTextField2.getText().equals("")){
               JOptionPane.showMessageDialog(chatRoomServer,"请输入发送内容!");
           }
           else if(!jTextField1.getText().equals("") && jTextField2.getText().equals("")&&action==false){
               JOptionPane.showMessageDialog(chatRoomServer,"请先开启服务!");

           }
           else if(!jTextField1.getText().equals("") && !jTextField2.getText().equals("")&&action==false){
               JOptionPane.showMessageDialog(chatRoomServer,"暂无客户机请求连接!");
           }
           else if(!jTextField1.getText().equals("") && !jTextField2.getText().equals("")&&action==true){
               String sendvalue=jTextField2.getText();
               try {
                   thread2.SetSendValue(sendvalue);
                   jTextArea.append("服务器发送消息:"+sendvalue+"\n");
                   jTextField2.setText("");
               } catch (IOException ioException) {
                   ioException.printStackTrace();
               }
           }
       }else if(e.getActionCommand().equals("传输文件")){
           if(action==true){
               fileThread2.SendFile();
           }else{
               JOptionPane.showMessageDialog(chatRoomServer,"暂无客户机请求连接");
           }
       }


    }
}
class Thread2 extends Thread{
    private ChatRoomServer chatRoomServer=null;
    private int port;
    private JTextArea jTextArea;
    private BufferedWriter Out=null;
    private JLabel jLabel;
    private mybuttonactionlistener Mybuttonactionlistener=null;
    Thread2(int port,JTextArea jTextArea,ChatRoomServer chatRoomServer,JLabel jLabel,mybuttonactionlistener Mybuttonactionlistener){
        super();
        this.port=port;
        this.jTextArea=jTextArea;
        this.chatRoomServer=chatRoomServer;
        this.jLabel=jLabel;
        this.Mybuttonactionlistener=Mybuttonactionlistener;
    }
    public void  SetSendValue(String value) throws IOException {
        Out.write(value);
        Out.newLine();
        Out.flush();
    }
    @Override
    public void run() {

        ServerSocket linstensocket=null;
        Socket clientsocket=null;
        BufferedReader in=null;
        BufferedWriter out=null;
        String recvstr;
        try{

            linstensocket=new ServerSocket();
            SocketAddress serveraddr=new InetSocketAddress("192.168.0.104",port);
            linstensocket.bind(serveraddr);//绑定服务器地址
            jTextArea.append("服务器启动成功!,开始在"+serveraddr.toString()+"监听数据!\n");
            clientsocket=linstensocket.accept();//建立连接,阻塞等待
            jTextArea.append("客户机连接成功!,客户端地址和数据端口:"+clientsocket.getRemoteSocketAddress()+"\n");
            Mybuttonactionlistener.SetAction(true);
            in=new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
            out=new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream()));
            Out=out;
            while ((recvstr=in.readLine())!=null){
                jTextArea.append("服务器收到信息:"+recvstr+"\n");
            }




        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("传输异常!");
        }
        try{
            if (in!=null){
                in.close();
            }
            if (out != null) {
                out.close();
            }
            if (linstensocket!=null){
                linstensocket.close();
            }
            if (clientsocket!=null){
                clientsocket.close();
            }
            JOptionPane.showMessageDialog(chatRoomServer,"客户端与服务器断开连接!");
            jTextArea.setText("");
            Mybuttonactionlistener.SetAction(false);
        }
        catch (IOException e){
            System.out.println("异常信息"+e.getMessage());
        }

    }
}/*文件传输线程*/
class  FileThread2 extends Thread{
    private ServerSocket fileserversocket=null;
    private Socket filesocket=null;
    private DataOutputStream Dout=null;
    private DataInputStream Din=null;
    private JFileChooser jFileChooser=null;
    private JTextArea jTextArea;
    private String addr;
    private int port;
    private InetSocketAddress fileremotesocketaddr;
    private ChatRoomServer chatRoomServer=null;
    private mybuttonactionlistener Mybuttonactionlistener=null;
    private JLabel jLabel;
    private JProgressBar jProgressBar;
    FileThread2(String addr,int port,JTextArea jTextArea,ChatRoomServer chatRoomServer,mybuttonactionlistener Mybuttonactionlistener,JLabel jLabel,JProgressBar jProgressBar){
        this.addr=addr;
        this.port=port;
        this.jTextArea=jTextArea;
        this.chatRoomServer=chatRoomServer;
        this.Mybuttonactionlistener=Mybuttonactionlistener;
        this.jLabel=jLabel;
        this.jProgressBar=jProgressBar;
    }
    public void SendFile() {/*文件传输方法*/
        jFileChooser=new JFileChooser();
        jFileChooser.setFileSelectionMode(FILES_ONLY);
        jFileChooser.showDialog(chatRoomServer,"发送文件");
        File f=jFileChooser.getSelectedFile();

        if(f!=null){
            byte[] data=new byte[1024];
            String filename=f.getName();
            jLabel.setText((filename));
            try{
                Dout.writeUTF(filename);
                Dout.flush();
                Dout.writeLong(f.length());
                Dout.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try{
                jTextArea.append("开始传输文件数据···········\n");
                Mybuttonactionlistener.thread2.SetSendValue("服务器正在向您传输文件··········");
                FileInputStream fin=new FileInputStream(f);
                int length=0;
                long progress=0;
                int progressrate=0;
                while ((length=fin.read(data,0,data.length))!=-1){
                    Dout.write(data,0,length);
                    Dout.flush();
                    progress+=length;
                    progressrate=(int)(100*progress/f.length());
                    jProgressBar.setValue(progressrate);
                }
                JOptionPane.showMessageDialog(chatRoomServer,"文件传输完成!");
                jTextArea.append("文件"+f.getName()+"传输完成\n");
                jProgressBar.setValue(0);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void run(){
        FileOutputStream fileOutputStream=null;
        try {
            fileserversocket=new ServerSocket();
            fileremotesocketaddr=new InetSocketAddress(addr,port);
            fileserversocket.bind(fileremotesocketaddr);
            filesocket=fileserversocket.accept();//阻塞等待连接
            jTextArea.append("客户机连接成功!,服务端地址和文件端口:"+fileremotesocketaddr.toString()+"\n");
            jTextArea.append("客户机连接成功!,客户端地址和文件端口:"+filesocket.getRemoteSocketAddress()+"\n");
            Dout=new DataOutputStream((filesocket.getOutputStream()));
            Din=new DataInputStream((filesocket.getInputStream()));
            while (filesocket!=null) {
                String filename = Din.readUTF();//阻塞监听
                long filelength = Din.readLong();//阻塞监听
                File file = new File("C:\Users\Administrator\Desktop\" + filename);
                if (!file.exists()) {
                    file.createNewFile();
                }
                jTextArea.append("正在接收文件" + filename + "········\n");
                fileOutputStream = new FileOutputStream(file);
                byte[] data = new byte[1024];
                int length = 0;
                int progress = 0;
                int progressrate = 0;
                while ((length = Din.read(data, 0, data.length)) != -1) {//阻塞监听文件数据读取
                    fileOutputStream.write(data, 0, length);
                    fileOutputStream.flush();
                    progress += length;
                    progressrate = (int) (100 * progress / filelength);
                    jProgressBar.setValue(progressrate);
                    if (progress == filelength)//传输完毕退出循环
                        break;
                }
                JOptionPane.showMessageDialog(chatRoomServer, "文件接收完成!");
                jTextArea.append("文件"+file.getName()+"接收完成\n");
                jProgressBar.setValue(0);//进度重置
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try{
            if(fileOutputStream!=null){
                fileOutputStream.close();
            }
            if (Din!=null){
                Din.close();
            }
            if (Dout != null) {
                Dout.close();
            }
            if (fileserversocket!=null){
                fileserversocket.close();
            }
            if (filesocket!=null){
                filesocket.close();
            }
        }
        catch (IOException e){
            System.out.println("异常信息"+e.getMessage());
        }
    }
}

服务器IP地址:192.168.0.104
消息传输测试端口号:5000
文件传输测试端口号:5001
服务器类型:Windows个人计算机
客户机类型:linux系统计算机
通信条件:同一网段或局域网
消息类型:字符串消息
文件传输类型:任意文件,图片