0
点赞
收藏
分享

微信扫一扫

Java网络编程之实现资源下载详解【王道Java】

@[toc]

一,前言

有一个作业需求,如下:
实现用户端输入需要下载的编号【存储在数据库里】,通过TCP连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。

二,实现资源下载

功能需求:
1-在服务器的硬盘创建一个目录,目录中存放供客户端下载的资源文件。
2-创建数据库表,表中存放资源文件的编号和资源文件的地址。

我的数据库截图,和服务端目标路径如下图。
在这里插入图片描述
在这里插入图片描述

三,资源下载的客户端

功能需求:
1-客户端输入要下载的资源编号
2-将编号发送给服务器
3-接收服务器的资源,保存到文件

服务器的ip,本机:

InetAddress ip=InetAddress.getLocalHost();
Socket client=new Socket(ip, port);

向服务器发送资源编号,编号---键盘输入。

String no;//编号
String name;

上述代码解释:
no变量为编号,name变量为下载资源另存为的名称。

输入下载资源的编号和输入下载资源另存为的名称:

System.out.println("输入下载资源的编号:");
no=scanner.next();
System.out.println("输入下载资源另存为的名称:");
name=scanner.next();

no编号发送给服务器


下载服务器发送来的资源:
```java
OutputStream out=client.getOutputStream();
out.write(no.getBytes());
System.out.println("下载服务器发送来的资源");
InputStream in=client.getInputStream();

字节数组---->保存到文件。

保存文件的路径名。

File file=new File("E:/tcpcont/client/"+name+".jpg");

使用io流。保存文件。下载完成

 FileOutputStream fos=new FileOutputStream(file);
byte[]buf=new byte[1024*10];
 int len;
 while((len=in.read(buf))!=-1){
     fos.write(buf,0,len);
 }
 fos.close();
 client.close();
 System.out.println("下载完成");

四,资源下载的服务器端

功能需求:
1-接收客户端的编号
2-在资源表中查找对应资源的地址
3-将资源发送给客户端

声明自己的端口

int port=10010;

服务器的ip,本机

InetAddress ip=InetAddress.getLocalHost();
ServerSocket server=new ServerSocket(port);

接收客户端

阻塞式的方法,没有客户端接入,就会一直等待。

Socket client=server.accept();

接收一个资源编号。编号:

InputStream in=client.getInputStream();

将流中的数据读入到buf数组
在这里插入图片描述
连接数据库,执行sql语句:
查询resource数据库里,uid为目标值。

Connection conn=JDBCUtils.getConnection();
String sql="SELECT * FROM resource WHERE uid=?";
PreparedStatement pStatement=conn.prepareStatement(sql);
pStatement.setString(1,no);
ResultSet rs=pStatement.executeQuery();

获取返回指针。
使用while函数遍历指针。

 while(rs.next()) {

获取到对应值。

int id = rs.getInt("uid");
String url = rs.getString("url");

将读入的数据写入到输出流,通知客户端,传输结束了。
在这里插入图片描述
实验总结:理解tcp的三次握手与连接的建立。
客户端:
1,创建客户端的socket,指定客户端的IP对象和端口。
2,创建客户端的对象,进行数据传输。
3,传输或者接受数据。
4,关闭
服务端:
1,创建在指定端口上的服务端对象ServerSocket。
2,获取到在指定端口上监听到对应的客户端socket对象。
3,传输数据/接收数据。
4,关闭流。

五,附源码:

5.1,资源下载的客户端

package work2;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class client {
    public static void main(String[] args) throws IOException {
        int port=10010;
        //服务器的ip,本机
        InetAddress ip=InetAddress.getLocalHost();
        Socket client=new Socket(ip, port);
        //向服务器发送资源编号
        //编号---键盘输入
        String no;//编号
        String name;
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入下载资源的编号:");
        no=scanner.next();
        System.out.println("输入下载资源另存为的名称:");
        name=scanner.next();

        //no编号发送给服务器
        OutputStream out=client.getOutputStream();
        out.write(no.getBytes());
        System.out.println("下载服务器发送来的资源");
        InputStream in=client.getInputStream();
        //字节数组---->保存到文件,

        File file=new File("E:/tcpcont/client/"+name+".jpg");
        FileOutputStream fos=new FileOutputStream(file);
        byte[]buf=new byte[1024*10];
        int len;
        while((len=in.read(buf))!=-1){
            fos.write(buf,0,len);
        }
        fos.close();
        client.close();
        System.out.println("下载完成");
    }
}

5,2 ,资源下载的服务器端

package work2;

import work2067111119.UserDAO;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

public class server {
    static dao service = new dao();
    public static void main(String[] args) throws IOException, SQLException {
        //声明自己的端口
        int port=10010;
        //服务器的ip,本机
        InetAddress ip=InetAddress.getLocalHost();
        ServerSocket server=new ServerSocket(port);
//~~~~~~~~~~~~~~~~
        //接收
        while(true){
            System.out.println("接收一个客户端");
            Socket client=server.accept();
            //接收一个资源编号
            String no;//编号
            //获取输入流
            InputStream in=client.getInputStream();
            byte[]buf=new byte[1024];
            int len=in.read(buf);//将流中的数据读入到buf数组
            no=new String(buf,0,len);
            System.out.println("接收到编号:"+no);

            //ResultSet rs = service.cha(no);

            Connection conn=JDBCUtils.getConnection();
            String sql="SELECT * FROM resource WHERE uid=?";
            PreparedStatement pStatement=conn.prepareStatement(sql);
            pStatement.setString(1,no);
            ResultSet rs=pStatement.executeQuery();

            while(rs.next()) {
                int id = rs.getInt("uid");
                String name = rs.getString("name");
                String url = rs.getString("url");
                System.out.println(id+'\t'+name+'\t'+url);

                if(url!=null){
                    File file=new File(url);

                    FileInputStream fis=new FileInputStream(file);
                    OutputStream out=client.getOutputStream();
                    byte[] fbuf=new byte[1024*10];
                    int flen;
                    while((flen=fis.read(fbuf))!=-1){
                        //将读入的数据写入到输出流
                        out.write(fbuf,0,flen);
                        out.flush();
                    }
                    //传输结束
                    fis.close();//关闭输入流
                    //通知客户端,传输结束了
                    client.shutdownInput();
                    client.close();
                }
            }

            //根据编号查找资源文件
            //String path=mp3Map.get(no);//根据编号获取编号对应的value值,没有关键字,返回null
//            if(path!=null){
//                //有这个资源文件,发送
//                //封装文件
//                File file=new File(path);
//                //输入流读文件的数据--->输出流发送给客户端
//                //输入流  源文件---->字节数组
//                //字节数组--->输出流   客户端
//                FileInputStream fis=new FileInputStream(file);
//                OutputStream out=client.getOutputStream();
//                byte[] fbuf=new byte[1024*10];
//                int flen;
//                while((flen=fis.read(fbuf))!=-1){
//                    //将读入的数据写入到输出流
//                    out.write(fbuf,0,flen);
//                    out.flush();
//                }
//                //传输结束
//                fis.close();//关闭输入流
//                //通知客户端,传输结束了
//                client.shutdownInput();
//
//                client.close();
//
//
//            }

        }
    }
}

六,最后

有一定的心得。了解了tcp的传输原理。
在这里插入图片描述
在这里插入图片描述
成功完成需求。实现用户端输入需要下载的编号【存储在数据库里】,通过TCP连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。

在这里插入图片描述

举报

相关推荐

0 条评论