全国
Java--教育路上

栏目导航

全国站 > Java > 网络编程
需求

Java TCP 案例-文件上传

摘要:Java TCP 案例 文件上传 ,要使用 TCP 协议来实现。接下来通过一个案例来实现图片上传的功能,首先编写服 务器端程序,。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。

标签:
发布时间:
2024-03-28 17:11
信息来源:
网络推荐
浏览次数:
1298
Java TCP 案例-文件上传

目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,
很明显需要使用 TCP 协议来实现。接下来通过一个案例来实现图片上传的功能,首先编写服
务器端程序,用来接收图片,如例 13-13 所示。
例 13-13 Example07.java
import java.io.*;
import java.net.*;
public class Example07 {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(10001); // 创建
ServerSocket 对象
while (true) {
// 调用 accept()方法接收客户端请求,得到 Socket 对象
Socket s = serverSocket.accept();
// 每当和客户端建立 Socket 连接后,单独开启一个线程处理和客户端
的交互
new Thread(new ServerThread(s)).start();
}
}
}
class ServerThread implements Runnable {
private Socket socket; // 持有一个 Socket 类型的属性
public ServerThread(Socket socket) { // 构造方法中把 Socket 对象作为实参
传入
this.socket = socket;
}
public void run() {
String ip = socket.getInetAddress().getHostAddress(); // 获取客户端
的 IP 地址
int count = 1; // 上
传图片个数
try {
InputStream in = socket.getInputStream();
File parentFile = new File("d:\\upload\\"); // 创建上传图片目
录的 File 对象
if (!parentFile.exists()) { // 如果不存在,
就创建这个目录
parentFile.mkdir();
}
// 把客户端的 IP 地址作为上传文件的文件名
File file = new File(parentFile, ip + "(" + count + ").jpg");
while (file.exists()) {
// 如果文件名存在,则把 count++
file = new File(parentFile, ip + "(" + (count++) + ").jpg");
}
// 创建 FileOutputStream 对象
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024]; // 定义一个字节数组
int len = 0; // 定义一个 int 类型的变量 len,初始值为 0
while ((len = in.read(buf)) != -1) { // 循环读取数据
fos.write(buf, 0, len);
}
OutputStream out = socket.getOutputStream();// 获取服务端的输出

out.write("上传成功".getBytes()); // 上传成功后向
客户端写出"上传成功"
fos.close(); // 关闭输出流对象
socket.close(); // 关闭 Socket 对象
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

运行结果如图 13-21 所示。

from shengerguan

例 13-13 中创建一个 ServerSocket 对象在 while(true)无限循环中调用 ServerSocket
的 accept()方法来接收客户端的请求,每当和一个客户端建立 Socket 连接后就开启一个新
的线程和这个客户端进行交互。开启的新线程是通过实现 Runnable 接口创建的,重写 run()
方法中实现了服务器端接收并保存客户端上传图片的功能在代码的第 24 行,对上传图片的
保存目录用一个 File 对象进行封装,如果这个目录不存在就调用 File 的 mkdir()方法创建
这个目录。为了避免存放的图片名重复而造成新上传的图片把已存在的图片覆盖,在代码的
第 21 行定义了一个整型变量 count,用于统计图片的数目,使用"IP 地址(count).jpg"作
为上传图片的名字。在代码的第 30~33 行对表 count++。最后将从客户端接收的图片信息写
人到指定的日录中,在代码的第 40 行和第 41 行获得服务器端的输出流,向客户端输出"上
传成功"信息。通过图 13-21 运行结果可以看出,服务器端进人阻塞状态,等待客户端连接。
完成了服务器端程序的编写,下面来编写客户端上传程序,如例 13-14 所示。
例 13-14 Example08.java
import java.io.*;
import java.net.*;
public class Example08 {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 10001); // 创建客户端 Socket
OutputStream out = socket.getOutputStream(); // 获取 Socket 的输出流对象
// 创建 FileInputStream 对象
FileInputStream fis = new FileInputStream("D:\\1.jpg");
byte[] buf = new byte[1024]; // 定义一个字节数组
int len; // 定义一个 int 类型的变量 len
while ((len = fis.read(buf)) != -1) { // 循环读取数据
out.write(buf, 0, len);
}
socket.shutdownOutput(); //关闭客户端输出

InputStream in = socket.getInputStream(); // 获取 Socket 的输入
流对象
byte[] bufMsg = new byte[1024]; // 定义一个字节数

int num = in.read(bufMsg); //接收服务端的信

String Msg = new String(bufMsg, 0, num);
System.out.println(Msg);
fis.close(); // 关键输入流
对象
socket.close(); // 关闭
Socket 对象
}
}
运行结果如图 13-22 所示。



from shengerguan


例 13-14 中,首先在代码的第 5 行创建 Socket 对象,指定连接服务器的 IP 地址和端口 号,然后获取 Socket 的输出流对象。在代码的第 7~13 行,创建 FilelnputStream 对象读取 图片 1.jpg,并通过 Socket 的输出流对象向服务器端发送图片。发送完毕后调用 Socket 的 shutDownOutput()方法关闭客户端的输出流。需要注意的是,shutDownOutput()方法非常重 要,因为服务器端程序在 while 循环中读取客户端发送的数据,当读取到-1 时才会结束循环, 如果在客户端不调用 shutDownOutput()方法关闭输出流,服务器端就不会读到-1,而会一直 执行 while 循环,同时客户端读取服务器端数据的 read(byte [])方法也是个阻塞方法,这样 服务器端和客户端程序进入了一个“死锁”状态,两个程序都不能结束。 客户端上传图片成功后,会读取服务器端发送的“上传完毕”信息,至此,客户端程序的 编写也完成了。为了证实图片是否上传成功,进入 D:\\upload 目录下,在该目录下可以看 见一张以 IP+count 编号命名的图片,说明图片上传成功,如图 13-23 所示。

from shengerguan


上一篇:
Java多线程的 TCP 网络程序
下一篇:
java聊天室服务器端程序
相关推荐
最近更新
学校免费发布信息关闭
如有图片请发邮件到:edu63@foxmail.com,审核后显示

 换一张

确认提交
完善补充本文信息关闭
非常感谢您帮助完善补充本文信息


 换一张

确认提交