您的位置:首页 > 理论基础 > 计算机网络

TCP协议利用多线程实现——文件的上传、下载

2020-04-04 07:09 921 查看

文件的上传指的是:客户端将本地的文件发送到服务器端,然后服务器端将接收到的内容存储到本地。

文件的下载即是一个相反的过程:服务器将文件发送给客户端,客户端将接收的文件下载到本地。

上传和下载的过程,方法上没有什么区别。
下面用多线程的方式来实现文件的上传过程。

package zal.demo02_upLoad;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
@SuppressWarnings("all")
public class Demo04ServerThread {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(1);
//创建服务端的步骤不用放到循环中,因为一个服务器就够了
while (true) {
Socket socket = serverSocket.accept();
//将读到的数据写到服务器的文件中
Task task=new Task(socket);
new Thread(task).start();
}
}
}
package zal.demo02_upLoad;
import java.io.*;
import java.net.Socket;
public class Demo01Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("192.168.0.108",1);
//两个参数,一个是要连接服务器的IP地址,另一个是服务器的端口号
//往服务器里写
OutputStream out = socket.getOutputStream();
FileInputStream fis=new FileInputStream("D:\\Client\\aa.jpg");
byte[] bArr=new byte[1024];
int len;
while((len=fis.read(bArr))!=-1){
out.write(bArr,0,len);
}
//当客户端读取完自己文件中数据时,告诉服务器我已经操作完了,以后再也不会向你写数据了,你也不要等我了
socket.shutdownOutput();
//自己new的流需要手动关闭
fis.close();
//接受服务器发送来的内容(读)
InputStream in = socket.getInputStream();
byte[] bytes=new byte[1024];
int leng=in.read(bytes);
System.out.println(new String(bytes,0,leng));
socket.close();
}
}
package zal.demo02_upLoad;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.UUID;

public class Task implements Runnable {
Socket socket;
public Task(Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
FileOutputStream fos = new FileOutputStream("D:\\Server1\\" + UUID.randomUUID().toString() + ".jpg");
byte[] bytes = new byte[1024];
int len;
while ((len = in.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
fos.close();

//服务器反馈给客户收到信息了
OutputStream out = socket.getOutputStream();
out.write("上传成功".getBytes());
socket.close();
//serverSocket.close();
//serverSocket不能关闭,因为关闭了服务器就不存在了
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
张爱娈 发布了8 篇原创文章 · 获赞 0 · 访问量 99 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: