基于JavaSocket的文本与图像等文件的传输

 大二学生网络工程专业,网络编程小实验要求编写基于TCP Client/TCP Listener的聊天程序

为了复习上个学期学的Java顺便做了一下前端

代码写的挺屎 还望多多指教

Client部分:

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

public class SocketClient
{
    static Socket socket = null;//socket内容
    static Socket socket_file = null;//socket_file 用于传输文件
    static JFrame jf = new JFrame("聊天窗口(客户端)");//Jframe 框架
    static JPanel jp2 = new JPanel();
    static final JTextArea jta_rec = new JTextArea(10,50);//接收文本区域
    static  final JTextArea jta = new JTextArea(10,30);//发送文本区域
    static JButton jb = new JButton("发送");//发送文本按钮
    static JButton jb2 = new JButton("发送文件");
    static JScrollPane jsp = new JScrollPane(jta_rec);
    static JFileChooser jfc = null;
    static class FileInputThread implements Runnable //文件接收线程
    {
        @Override
        public void run()
        {
            try
            {
                String fname;
                byte[] inputbyte;
                while(true)
                {
                    InputStream ips = socket_file.getInputStream();
                    DataInputStream dis = new DataInputStream(ips);
                    fname = dis.readUTF();//获取文件名

                    jta_rec.append("收到来自Serve的文件:"+ fname+"\n");
                    System.out.println("./temp/"+fname);
                    File f = new File("./temp/"+fname);//前端显示

                    FileOutputStream fos = new FileOutputStream(f,false);
                    while(dis.read()!=-1)
                    {
                        if (!f.exists())//如果不存在则新建文件
                        {
                            f.createNewFile();
                        }
                        while(dis.read(inputbyte = new byte[dis.available()])>0)
                        {
                            fos.write(inputbyte);
                            fos.flush();
                        }
                        if(dis.available()==0)
                        {
                            break;
                        }
                    }
                }
            }
            catch(Exception err)
            {err.printStackTrace();}
        }
    }
    static class InputThread implements Runnable  //输入文本线程
    {
        @Override
        public void run()
        {
            try
            {
                InputStream ips = socket.getInputStream();
                final BufferedReader br = new BufferedReader(new InputStreamReader(ips));

                while(br.read()!=-1)
                {
                    char[] cubf = new char[256];
                    br.read(cubf);
                    String str =  String.valueOf(cubf);
                    jta_rec.append("From Serve:"+"\n");
                    jta_rec.append(str+"\n");
                }
            }
            catch(Exception e)
            {e.printStackTrace();}
        }
    }
    static ActionListener AL2 = new ActionListener() {//文件发送操作
        @Override
        public void actionPerformed(ActionEvent e)
        {
            try
            {
                jfc = new JFileChooser("./");
                jfc.setVisible(true);
                int flag = jfc.showOpenDialog(new JFrame());
                if(flag == JFileChooser.APPROVE_OPTION)//确定选择了文件
                {
                    File f = jfc.getSelectedFile();

                    String filename = f.getName();

                    FileInputStream fis = new FileInputStream(f);//新建文件流读取某个文件
                    DataOutputStream dos = new DataOutputStream(socket_file.getOutputStream());

                    dos.writeUTF(" "+filename);
                    dos.flush();

                    byte[] SendByte = new byte[fis.available()];
                    while(fis.read(SendByte)>0)
                    {
                        dos.write(0);
                        dos.write(SendByte);
                        dos.flush();
                    }
                    jta_rec.append("文件发送成功"+"\n");
                }
            }
            catch(Exception er)
            {er.printStackTrace();}
        }
    };


    static ActionListener AL = new ActionListener()//文本输出按钮
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            try
            {
                if(jta.getText()=="")
                {}
                String temp = jta.getText();
                jta.setText("");
                jta_rec.append("From Client:"+"\n");
                jta_rec.append(temp+"\n");
                OutputStream os = socket.getOutputStream();//获取socket的输出流
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));//利用bufferWrite
                bw.write(" "+temp);
                bw.flush();//写入并发送
                System.out.println("发送成功");
            }
            catch(Exception E)
            {E.printStackTrace();}
        }
    };
    public static void initialize()//前端页面初始化
    {
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setVisible(true);
        jf.setSize(700,400);
        jf.setLayout(new FlowLayout());
        jf.setResizable(true);
        Container c = jf.getContentPane();//jf的初始化
        jsp.setVisible(true);
        jp2.setLayout(new FlowLayout());
        jta_rec.setEditable(false);
        jta_rec.setVisible(true);
        jta.setEditable(true);
        jta.setVisible(true);
        c.add(jsp);
        c.add(jp2);
        jp2.add(jta);
        jp2.add(jb);
        jp2.add(jb2);
        jb.addActionListener(AL);
        jb2.addActionListener(AL2);
    }

    public static void main(String[] args) throws Exception
    {
        try
        {
            initialize();
            socket = new Socket("127.0.0.1",55533);//新建套接字 用于传输文本
            socket_file = new Socket("127.0.0.1",55533);//新建套接字 用于传输文件
            System.out.println("连接成功建立");
            Thread it = new Thread(new InputThread());//新线程 用于监听文本
            Thread fit = new Thread(new FileInputThread());//新线程 用于监听文件传输
            it.start();
            fit.start();

            while(!socket.isClosed()&&!socket_file.isClosed())
            {
                Thread.sleep(1000);
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally//关闭资源
        {
            socket.close();
            socket_file.close();
        }
    }
}

Serve部分

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;


public class SocketServe
{
    static Socket socket_bind = null;//socket内容
    static Socket socket_file = null;//传输文件
    static JFrame jf = new JFrame("聊天窗口(服务器)");//Jframe 框架
    static JPanel jp2 = new JPanel();
    static final JTextArea jta_rec = new JTextArea(10,50);//接收文本区域
    static  final JTextArea jta = new JTextArea(10,30);//发送文本区域
    static JButton jb = new JButton("发送");//发送文本按钮

    static JButton jb2 = new JButton("发送文件");//发送文件按钮
    static JScrollPane jsp = new JScrollPane(jta_rec);
    static JFileChooser jfc = null;

    public static void initialize()//前端页面初始化
    {
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setVisible(true);
        jf.setSize(700,400);
        jf.setLayout(new FlowLayout());
        jf.setResizable(true);
        Container c = jf.getContentPane();//jf的初始化
        jsp.setVisible(true);
        jp2.setLayout(new FlowLayout());
        jta_rec.setEditable(false);
        jta_rec.setVisible(true);
        jta.setEditable(true);
        jta.setVisible(true);
        c.add(jsp);
        c.add(jp2);
        jp2.add(jta);
        jp2.add(jb);
        jp2.add(jb2);
        jb.addActionListener(AL);
        jb2.addActionListener(AL2);
    }
    static class InputThread implements Runnable  //输入文本线程
    {
        @Override
        public void run()
        {
            try
            {
                InputStream ips = socket_bind.getInputStream();//获得输入流
                final BufferedReader br = new BufferedReader(new InputStreamReader(ips));
                while(br.read()!=-1)
                {
                    char[] cubf = new char[256];
                    br.read(cubf);
                    String str =  String.valueOf(cubf);
                    jta_rec.append("From Client:"+"\n");
                    jta_rec.append(str+"\n");
                }
            }
            catch(Exception e)
            {e.printStackTrace();}
        }
    }
    static ActionListener AL2 = new ActionListener() //用于发送文件
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            try
            {
                jfc = new JFileChooser("./");
                jfc.setVisible(true);
                int flag = jfc.showOpenDialog(new JFrame());

                if(flag == JFileChooser.APPROVE_OPTION)
                {
                    File f = jfc.getSelectedFile();

                    String filename = f.getName();

                    FileInputStream fis = new FileInputStream(f);
                    DataOutputStream dos = new DataOutputStream(socket_file.getOutputStream());

                    dos.writeUTF(" "+filename);//先传送文件名字
                    dos.flush();

                    byte[] SendByte = new byte[fis.available()];
                    while(fis.read(SendByte)>0)//传输文件内容
                    {
                        dos.write(0);
                        dos.write(SendByte);
                        dos.flush();
                    }
                    jta_rec.append("文件发送成功");
                }
            }
            catch(Exception er)
            {er.printStackTrace();}
        }
    };

    static ActionListener AL = new ActionListener() //发送文字
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            try
            {
                if(jta.getText()=="")
                {}
                String temp = jta.getText();
                jta.setText("");
                jta_rec.append("From Serve:\n");
                jta_rec.append(temp+"\n");
                OutputStream os = socket_bind.getOutputStream();

                BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(os));

                bos.write(" "+temp);
                bos.flush();
                System.out.println("发送成功");
            }
            catch(Exception E)
            {E.printStackTrace();}
        }
    };

    static class FileInputThread_ser implements Runnable //文件输入线程
    {
        @Override
        public void run()
        {
            try
            {
                String fname;
                byte[] inputbyte;
                while(true)
                {
                    InputStream ips = socket_file.getInputStream();
                    DataInputStream dis = new DataInputStream(ips);
                    fname = dis.readUTF();//获取文件名

                    jta_rec.append("收到来自Client的文件:"+ fname+"\n");
                    System.out.println("./temp/"+fname);
                    File f = new File("./temp/"+fname);

                    FileOutputStream fos = new FileOutputStream(f,false);
                    while(dis.read()!=-1)
                    {
                        if (!f.exists())
                        {
                            f.createNewFile();
                        }
                        while(dis.read(inputbyte = new byte[dis.available()])>0)//写入数据
                        {
                            fos.write(inputbyte);
                            fos.flush();
                        }
                        if(dis.available()==0)
                        {
                            break;
                        }
                    }
                }
            }
            catch(Exception err)
            {err.printStackTrace();}
        }
    }

    public static void main(String[] args) throws Exception
    {
        // 监听指定的端口
        initialize();
        int port = 55533;
        ServerSocket server = new ServerSocket(port);//新建ServerSocket服务器端口
        // server将一直等待连接的到来
        jta_rec.append("server将一直等待连接的到来"+"\n");
        socket_bind = server.accept();//和文本Socket建立连接
        socket_file = server.accept();//和文件Socket建立连接
        // 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
        jta_rec.append("连接建立成功"+"\n");
        try
        {
            Thread it_ser = new Thread(new InputThread());
            Thread fit_ser = new Thread(new FileInputThread_ser());
            it_ser.start();
            fit_ser.start();

            while(!socket_bind.isClosed()&&!socket_file.isClosed())
            {
                Thread.sleep(1000);
            }
        }
        catch(Exception e)
        {e.printStackTrace();}
        finally//关闭资源
        {
            socket_bind.close();
            socket_file.close();
            server.close();
        }
    }
}

有些细节可能处理的不到位,经过本地测试应该没什么问题(至少功能实现了)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值