java服务器端用传输给客户端文件流(fileinputstream),客户端应该如何接收?(socket )

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java服务器端用传输给客户端文件流(fileinputstream),客户端应该如何接收?(socket )相关的知识,希望对你有一定的参考价值。

FIleINputStream fis = new FileInputstream(file);
out.printf(fis);

客户端:
b= new byte[1024];
while(is.read(b)!=-1)

fos.write(b);

简单些就是这样,没有写完整代码

服务器端用文件流传输,客户端不限读取方式,应该如何实现
在线等答案,高手来
麻烦懂得人来。

其实这个问题你应该先想一下socket到底是一个什么东西,在网络编程中socket到底用来做什么的。socket:在操作系统内核中它代表网络连接的一个端点(endpoint),在应用程序中它代表一个打开的文件。socket pair唯一确定的一条网络连接,socket pair就是客户端socket和服务端socket的一个组合。也就是客户端ip和port与服务端ip和port的组合。一条网络连接也就是一条通信的信道,tcp连接代表的信道是全双工的。以信道来讲,逻辑上就存在两个管道来代表输出与输入来发送和接收信息。

那么在应用程序上我们就可以拿到这2个管道来完成socket之间的通信。

以你的应用来看输出流fos就代表着图中的红色管道,那么在服务端就应该是这个样的。

Scoket connSock = serverSocket.accept();//connSock代表着服务端的Socket

InputStream is = connSock.getInputStream();//输入流is代表图中的红色管道

OutputStrea os = connSock.getOutputStream();//输出流os代表图中的绿色管道

在服务端有一个字节缓冲区来存放从is读取的字节数据

byte[] buffer = new byte[1024];

然后服务端读取数据来填充这个字节缓冲区

is.read(buffer);//比如这样

然后就根据你的需求来操作这个buffer了。

然后把处理过后的数据通过os发送给客户端。os就是图中的那个绿色管道

os.write(处理过后的数据);

参考技术A 楼上正解追问

楼上正解?看清我的问题没有哦,我是要传输文件刘,如果是一个buffer或者一个字节的传我还用问么,如果没有答案直接给个不能实现就可以了,崩溃。

本回答被提问者采纳
参考技术B

    package cn.hncu.tcp.upload;  

    import java.io.File;  

    import java.io.FileInputStream;  

    import java.io.FileOutputStream;  

    import java.io.IOException;  

    import java.io.OutputStream;  

    import java.net.Socket;  

    import java.net.UnknownHostException;  

    public class UploadPicClient   

    public static void main(String[] args)   

    if(args.length!=1)  

    System.out.println("请指定文件");  

    return;  

      

    File file=new File(args[0]);  

    if(!(file.exists() && file.isFile()))  

    System.out.println("上传的文件不存在");  

      

    if(!(file.getName().endsWith(".jpg")|| file.getName().endsWith(".gif")))  

    System.out.println("文件格式有误");  

    return;  

      

    if(file.length()>=1024*1024*2)  

    System.out.println("文件过大");  

    return;  

      

    //上传  

    try   

    Socket s=new Socket("127.0.0.1",10008);  

    FileInputStream fin=new FileInputStream(file);  

    OutputStream out=s.getOutputStream();  

    byte[] buf=new byte[1024];  

    while((fin.read(buf))!=-1)  

    out.write(buf, 0, buf.length);  

      

    s.shutdownOutput();//解决阻塞问题  

    byte[] b=new byte[1024];  

    s.getInputStream().read(b);  

    System.out.println(new String(b));  

    s.close();  

     catch (UnknownHostException e)   

    e.printStackTrace();  

     catch (IOException e)   

    e.printStackTrace();  

             

      

      


    //服务器端

    [java] view plain copy

    package cn.hncu.tcp.upload;  

    import java.io.File;  

    import java.io.FileOutputStream;  

    import java.io.IOException;  

    import java.io.InputStream;  

    import java.io.OutputStream;  

    import java.net.ServerSocket;  

    import java.net.Socket;  

    public class UploadPicServer   

    public static void main(String[] args)   

    try   

    ServerSocket server=new ServerSocket(10008);  

    while(true)//多线程实现多用户并发访问  

    Socket s=server.accept();  

    new Thread(new UploadThread(s)).start();  

      

     catch (IOException e)   

    e.printStackTrace();  

      

      

      

    class UploadThread implements Runnable  

    private Socket s;  

    public UploadThread(Socket s)   

    this.s=s;  

      

    @Override  

    public void run()   

    try   

    String ip=s.getInetAddress().getHostAddress();  

    System.out.println(ip+"connected....");  

    InputStream in=s.getInputStream();  

    File dir=new File("f:\\\\mypic");  

    if(!dir.exists())  

    dir.mkdir();  

      

    //下面这段主要是把同一个Ip地址的客户端发来的照片用127.0.0.1.jpg格式和127.0.0.1(1)区分开来。  

    int count=0;  

    File file=new File(dir,ip+".jpg");  

    while(file.exists())//第二次如果存在,则在后面加(1)(2)等。  

    file=new File(dir,ip+"("+(count++)+")"+".jpg");  

      

    //从客户端读取  

    FileOutputStream fout=new FileOutputStream(file);  

    byte[] buf=new byte[1024];  

    int len=in.read(buf);  

    while((len=in.read(buf))!=-1)  

    fout.write(buf, 0, len);  

      

    //给客户端上传成功的提示  

    OutputStream out=s.getOutputStream();  

    out.write("上传成功".getBytes());  

    fout.close();  

    s.close();  

     catch (IOException e)   

    e.printStackTrace();  

      

      

      

以上是关于java服务器端用传输给客户端文件流(fileinputstream),客户端应该如何接收?(socket )的主要内容,如果未能解决你的问题,请参考以下文章

java网络编程TCP传输—流操作—服务端反馈与客户端接收

一文领悟HTTPS密钥为什么这样传输

java 服务器与客户端的文件传输

Symfony 3.4 - 将 API 流文件传输到客户端下载

java 四种方式实现字符流文件的拷贝对比

java如何实现 io流传输过来的文件,提示另存为弹出窗口?