文章目录
题目
编程实现文件的上传,要求:
(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图形界面,理解并学会应用布局。