Java实验报告(九)|网络编程

文章目录

题目

编程实现文件的上传,要求:
(1)启动服务器端程序后,可以通过客户端程序实现文件的上传,上传后的文件保存到d:\upload下面。
(2)多个客户端可以同时上传。
(3)一个客户端可以上传多次。
(4)客户端使用Swing实现。
服务器端源程序:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        while (true) {
            final Socket s = server.accept();
            new Thread(() -> {
                try {
                    System.out.println("连接成功...");
                    InputStream is = s.getInputStream();
                    File file = new File("F:\\upload");
                    if (!file.exists()) {
                        file.mkdirs();
                    }
                    SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH-mm-ss");
                    Date date = new Date();

                    String fileName = "Mission " + sdf.format(date) + " " + new Random().nextInt(100) + ".jpg";
                    FileOutputStream fos = new FileOutputStream(file + "\\" + fileName);
                    int len = 0;
                    byte[] bytes = new byte[1024];
                    while ((len = is.read(bytes)) != -1) {
                        fos.write(bytes, 0, len);
                    }
                    s.getOutputStream().write("上传成功".getBytes());
                    fos.close();
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

客户端源程序:

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

class Client extends JFrame {
    JTextField textField;
    JButton select, upload;
    FileNameExtensionFilter filter;
    String path;
    Socket socket;

    Client(String title) {
        this.setTitle(title);
        this.setLayout(new FlowLayout());
        textField = new JTextField(50);
        select = new JButton("浏览");
        select.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser open = new JFileChooser();
                filter = new FileNameExtensionFilter("JGP/GIF/Images", "jpg", "gif");
                open.setFileFilter(filter);
                open.showOpenDialog(null);
                path = open.getSelectedFile().getPath();
                textField.setText(path);
//                System.out.println("path" + path);
            }
        });
        upload = new JButton("上传");
        upload.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    socket = new Socket("127.0.0.1", 8888);
                    OutputStream os = socket.getOutputStream();
                    FileInputStream fis = new FileInputStream(path);
                    byte[] bytes = new byte[1024];
                    int n;
                    while ((n = fis.read(bytes)) != -1) {
                        os.write(bytes, 0, n);
                    }
                    socket.shutdownOutput();
                    InputStream is = socket.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);
                    String s = br.readLine();
                    JOptionPane.showMessageDialog(null, s);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }
        });
        this.add(textField);
        this.add(select);
        this.add(upload);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(300, 400, 800, 100);
        setVisible(true);
    }
}
public class TCPClient {
    public static void main(String[] args) {
        new Client("实验一");
        new Client("实验二");
    }
}

运行结果截图:
在这里插入图片描述
加入格式化日期后:
在这里插入图片描述

收获:
1、理解BS/CS架构,BS即浏览器/服务器,CS则是客户端/服务器。
2、理解端口(设备上应用程序的唯一标识)和通信协议(计算机网络中,连接和通信的规则被称为网络通信协议)。
3、了解两种基本的网络通信协议,TCP/IP和UPD协议。
4、了解Socket类,该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
5、ServerSocket类,这个类实现了服务器套接字,该对象等待通过网络的请求。
6、模拟客户端,服务器端,实现文件的上传功能。
7、Swing图形界面,理解并学会应用布局。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 通过本实验,实现对堆排序算法的理解,掌握堆排序算法的原理以及实现方法,并掌握Java语言的编程技巧。 实验内容: 堆排序是一种树形选择排序方法,是对直接选择排序算法的有效改进。堆排序的基本思想是:将待排序的序列构造成一个大根堆或小根堆,堆顶元素为最大值或最小值,然后将堆顶元素与最后一个元素交换,然后把剩余的元素重新构造成堆。如此反复执行,直到排序完成。由于堆排序算法的时间复杂度为O(nlogn),因此在大数据量的情况下,堆排序是高效的。 堆排序算法的实现主要有两个步骤:构建初始堆和堆排序。其中,构建初始堆是将待排序的序列构建成一个大根堆或小根堆的过程,堆排序是不断将堆顶元素与最后一个元素交换,并重新调整堆的过程。 以下是Java语言实现堆排序的代码: ```java public class HeapSort { public static void heapSort(int[] arr) { int n = arr.length; // 构建初始堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // 堆排序 for (int i = n - 1; i >= 0; i--) { // 将堆顶元素与最后一个元素交换 int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 调整堆 heapify(arr, i, 0); } } // 调整堆 public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; // 找到左子节点和右子节点中的最大值 if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大值不是根节点,则交换根节点和最大值,并递归调整子堆 if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } public static void main(String[] args) { int[] arr = { 64, 34, 25, 12, 22, 11, 90 }; heapSort(arr); System.out.println("排序后的数组:"); for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); } } ``` 实验结果: 经过测试,以上代码能够正确地对数列进行堆排序,得到正确的排序结果。 实验总结: 通过本次实验,我学习了堆排序算法的原理和实现方法,并通过Java语言编写了相应的代码。堆排序算法具有高效的时间复杂度,在大数据量的情况下具有明显的优势。这次实验让我对Java语言的编程技巧有了更深刻的理解,也对算法的实现有了更深的认识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值