今天给大家上传一个 基于TCP/IP的文件上传编程。
主要知识点:字节流、字符流、高效缓冲流、数据流,tcp/ip 通信,多线程。
思路:客服端读取文件,发送服务器,服务端,通过多线程来启动,循环接收客户端上传文件,将文件保存到服务器指定位置,将上传文件名前加上时间戳,进行区分,同时对客户端进行回传,文件上传成功的消息。具体看以下代码:
客户端
public class UploadClient3 {
public static void main(String[] args) throws IOException, InterruptedException {
String path = "file/Demo.jar";
String ip = "192.168.42.46";
int port = 12306;
//第一步创建 socket
Socket socket = new Socket(ip, port);
//第二步 创建 输出流
OutputStream outputStream = socket.getOutputStream();
// 创建高效 字节输入流 (读取文件)
// BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(path)));
//把文件名读取出来
File file = new File(path);
String name = file.getName();
DataOutputStream dos = new DataOutputStream(outputStream);
dos.writeUTF(name);
// 把 输出流 包装为 高效的
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
//Stream里面 文件和文件名都行
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int len = 0;
int count = 0;
byte[] bytes = new byte[8192];
long length = file.length();
System.out.println("文件大小: = " + length);
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
count += len;
//Thread.sleep(200);
double v = (double) count / length * 100;
// String format = String.format("%f", v);
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(2);
String str = format.format(v);
double two = Double.parseDouble(str);
System.out.println("上传进度: " + two + "%");
}
bos.flush();
System.out.println("上传完成文件大小: " + count + "KB");
socket.shutdownOutput();
//接收服务端的回复:
InputStream is = socket.getInputStream();
byte[] bytes2 = new byte[8192];
int length2 = is.read(bytes2);
System.err.println("服务器的回复:" + (new String(bytes2, 0, length2)));
// bos.close();
bis.close();
outputStream.close();
socket.close();
System.out.println("程序结束,数据流已关闭。");
}
}
多线程处理
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class serverThread extends Thread{
private Socket accept;
private ServerSocket serverSocket;
public serverThread(Socket accept,ServerSocket serverSocket) {
this.accept = accept;
this.serverSocket = serverSocket;
}
@Override
public void run() {
//获取
try {
InputStream is = accept.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
//先接收文件名
DataInputStream dataInputStream = new DataInputStream(is);
String fileName = dataInputStream.readUTF();
String outAdd="C:/updata/" +
System.currentTimeMillis()
+"_"+fileName;
//接收流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outAdd));
byte[] bytes = new byte[8192];
int len=0;
int count=0;
while((len=bis.read(bytes)) != -1) {
// System.out.println("****************");
bos.write(bytes,0,len);
count+=len;
}
bos.flush();
InetAddress ia = serverSocket.getInetAddress();
String ip = ia.getHostAddress();
SocketAddress ipp = serverSocket.getLocalSocketAddress();
System.out.println(ip+"--->上传完成!---"+fileName+"\t 大小:"+count+"KB");
//停止接收
accept.shutdownInput();
OutputStream outputStream = accept.getOutputStream();
outputStream.write((fileName+"上传成功!"+"\t 大小:"+count+"KB").getBytes());
bos.close();
bis.close();
} catch (IOException e) {
// e.printStackTrace();
System.out.println("有异常………………");
} finally {
}
}
}
服务器启动
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class UploadServerThread {
public static void main(String[] args) throws IOException {
System.out.println("服务器启动成功……");
int port = 12306;
ServerSocket serverSocket = new ServerSocket(port);
while(true){
//jieshou
Socket accept = serverSocket.accept();
serverThread st = new serverThread(accept,serverSocket);
st.start();
serverSocket.close();
}
}
}