文章总览
作者的话
最近做的某个项目涉及到这方面的内容,因有感写下这篇学习记录。
希望能给和我一样正在学习java的朋友们起到帮助!
需求分析
客户端:需要向服务器发送一个文件(这里暂定图片),同时将文件名也发送过去,每次运行只发送一张图片,且发送完毕后结束运行。
服务器:需要接受文件并按指定的文件名、文件格式将文件存储在本地,服务器一经启动不再关闭,需要处于一直随时接受文件的状态。
运用到的技术:java网络编程,多线程
客户端代码
客户端代码实现
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.net.Socket;
public class TcpClient {
public static void uploadPic(String path,String filename){ //filename为文件名,上传到服务器建议文件名采用时间加随机字符的格式
try{
Socket socket = new Socket("127.0.0.1",2835);
OutputStream outputStream = socket.getOutputStream(); //创建输出流对象
DataOutputStream out = new DataOutputStream(outputStream); // 用于输出文件名
File file = new File(path);
FileInputStream inputStream = new FileInputStream(file);
out.writeUTF(filename); //将文件名发送给服务器
int len = 0;
byte[] temp = new byte[1024];
while((len = inputStream.read(temp))!=-1){
outputStream.write(temp,0,len);
}
out.close(); //发送完毕后关闭输出流。
outputStream.close();
}catch(Exception e){
e.printStackTrace(System.out);
}
}
public static void main(String []args){
uploadPic("G:\\java\\项目\\23.花茶线上\\图片发送\\目标1.png","文件名");
}
}
服务器端代码
服务器端代码实现
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(2835); //服务器端口号
while(true){
Socket accept = serverSocket.accept(); //在此处阻塞,只有当有文件发送过来时才执行后面的操作
DataInputStream in = new DataInputStream(accept.getInputStream());
String filename = in.readUTF(); //读取客户端发送过来的文件名
ExecutorService exec = Executors.newCachedThreadPool(); //创建一个执行器对象来为我们管理Thread对象
exec.execute(new Thread(new ServerThread(accept,"G:/ServerLibray/"+filename+".jpg"))); //启动任务
}
}
}
服务器线程定义
服务器线程的实现
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerThread implements Runnable{
Socket sc;
String filename;
public ServerThread(Socket sc1,String name){ //初始化
sc = sc1;
filename = name;
}
public void run(){
try{
OutputStream outputStream = new FileOutputStream(filename); //创建指定文件的输出流对象
InputStream inputStream = sc.getInputStream(); //获取socket对象的输入流
int len = 0;
byte[] temp = new byte[1024]; //每次写入1024个字节
while((len=inputStream.read(temp))!=-1){ //若已读完输入流中的所有数据,则输入流长度为-1
outputStream.write(temp,0,len); //往指定文件中写入
}
outputStream.close(); //单个文件传送完毕后关闭输出流
}catch(Exception e){
e.printStackTrace(System.out);
}
}
}
结语
无
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)